[PATCH] sched: loadavg 0.00, 0.01, 0.05 on idle
From: Vik Heyndrickx
Date: Thu Jan 21 2016 - 04:23:35 EST
Systems show a minimal load average of 0.00, 0.01, 0.05 even when they
have no load at all.
Uptime and /proc/loadavg on all systems with kernels released during the
last five years up until kernel version 4.4, show a 5- and 15-minute
minimum loadavg of 0.01 and 0.05 respectively. This should be 0.00 on
idle systems, but the way the kernel calculates this value prevents it
from getting lower than the mentioned values. Likewise but not as
obviously noticeable, a fully loaded system with no processes waiting,
shows a maximum 1/5/15 loadavg of 1.00, 0.99, 0.95 (multiplied by number
of cores).
By removing the single code line that performed a rounding on the
internally kept load value, effectively returning this function
calc_load to its state it had before, the visualization problem is
completely fixed.
The modified code was tested on nohz=off and nohz kernels. It was tested
on vanilla kernel 4.4 and on centos 7.1 kernel 3.10.0-327. It was tested
on single, dual, and octal cores system. It was tested on virtual hosts
and bare hardware. No unwanted effects have been observed, and the
problems that the patch intended to fix were indeed gone.
The following patch is for kernel version 4.x . In kernel 3.x, the
affected code was in core.c instead of loadavg.c
Signed-off-by: Vik Heyndrickx <vik.heyndrickx@xxxxxxxxxxx>
--- linux-4.4-org/kernel/sched/loadavg.c 2016-01-21 09:11:15 +0100
+++ linux-4.4/kernel/sched/loadavg.c 2016-01-21 09:11:31 +0100
@@ -101,7 +101,6 @@ calc_load(unsigned long load, unsigned l
{
load *= exp;
load += active * (FIXED_1 - exp);
- load += 1UL << (FSHIFT - 1);
return load >> FSHIFT;
}