Workaround for wrapping loadaverage

From: Patrick Mau
Date: Sun Nov 07 2004 - 19:21:51 EST


Hallo everyone,

in a previous message archived at

http://www.ussg.iu.edu/hypermail/linux/kernel/0410.2/2950.html

I described a problem with a wrapping load average on my SMP system.
The following small userspace load simulation exactly matches the
numbers I am seeing.

We can only account for 1024 runnable processes, since we have 22 bits
precision, I would like to suggest a patch to calc_load in kernel/timer.c
that would limit the number of active tasks:


if (active_tasks > 1024 * FIXED_1)
active_tasks = 1024 * FIXED_1;


I am aware that this is not a fix ... The wrapping happens using threaded
applications (Java/JBoss in my case). Below you'll find a small userspace
simulation.

I would really like to provide a real fix, but I really couldn't figure
out what went wrong.

Thanks for any feedback,
Patrick


/* Sample code copied from include/linux/sched.h and kernel/timer.c */

#include <stdio.h>

#define FSHIFT 11 /* 11 bit precision */
#define FIXED_1 (1 << FSHIFT) /* 1.0 as fixed-point */

#define EXP_1 1884 /* 1/exp(5sec/1min) */
#define EXP_5 2014 /* 1/exp(5sec/5min) */
#define EXP_15 2037 /* 1/exp(5sec/15min) */

#define CALC_LOAD(load, exp, n) \
load *= exp; \
load += n*(FIXED_1-exp); \
load >>= FSHIFT;

static unsigned long avenrun[3];

/* normal load spike and one error */
static unsigned long tasks[8] = {
0, 1, 0, ~0, 0, 0, 0
};

static void calc_load(unsigned long tasks)
{
tasks <<= FSHIFT;

CALC_LOAD(avenrun[0], EXP_1, tasks);
CALC_LOAD(avenrun[1], EXP_5, tasks);
CALC_LOAD(avenrun[2], EXP_15, tasks);
}

int main(int argc, char **argv)
{
int i, j;

for (i = 0; i < 8; i++) { /* index for tasks[] */
/* 24 calculations per load change */

for (j = 0; j < 24; j++) {
calc_load(tasks[i]);

printf("%.2f %.2f %.2f\n",
(float) avenrun[0] / FIXED_1,
(float) avenrun[1] / FIXED_1,
(float) avenrun[2] / FIXED_1);
}
}

return 0;
}

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/