Details

Type: Incident report

Status: Closed

Priority: Trivial

Resolution: Fixed

Affects Version/s: 3.0.4, 3.0.5

Fix Version/s: 3.0.8rc1, 3.2.4rc1, 3.4.0alpha1

Component/s: Agent (G)

Labels:

Team:Team C

Sprint:Sprint 1, Sprint 2

Story Points:1
Description
The function zbx_procstat_get_util() in the file src/zabbix_agent/procstat.c calculates the CPU utilization. It gives the result as a percentage with accuracy 0.1% (type "double"). However, most calculations (probably, for optimization purpose) are with the integer types (variables ticks_diff and time_diff have type zbx_uint64_t).
The final part of calculations is the following (lines 1102 – 1105):
/* 1e9 (nanoseconds) * 1e2 (percent) * 1e1 (one digit decimal place) */ ticks_diff *= __UINT64_C(1000000000000); ticks_diff /= time_diff * sysconf(_SC_CLK_TCK); *value = (double)ticks_diff / 10;
The main idea is, probably, used CPU time (in nanoseconds, multiplied to 1000) to divide by the elapsed time (in nanoseconds) to obtain the number of tens portion of percent before casting integer to double.
However, the integer division does not round up the result, remainder is just truncated. So, the real result is, for example (1000 / 6) * 0.1 will be 16.6 instead of 16.7.
If it is the intentional behaviour, this ticket could be closed safely.
Otherwise it could be corrected, for example, by the following way:
/* 1e9 (nanoseconds) * 1e2 (percent) * 1e2 (two digit decimal places for correct rounding up) */ ticks_diff *= __UINT64_C(10000000000000); < one zero longer ticks_diff /= time_diff * sysconf(_SC_CLK_TCK); /*correct rounding up */ ticks_diff += 5; ticks_diff /= 10; *value = (double)ticks_diff / 10;
This part of code exists, at least, in versions 3.0.4, 3.0.5 and zabbix3.0.6rc1.