From: Patrick Mau <mau@oscar.ping.de>
To: Linux Kernel <linux-kernel@vger.kernel.org>
Subject: Workaround for wrapping loadaverage
Date: Mon, 8 Nov 2004 01:19:32 +0100 [thread overview]
Message-ID: <20041108001932.GA16641@oscar.prima.de> (raw)
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;
}
next reply other threads:[~2004-11-08 0:19 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-11-08 0:19 Patrick Mau [this message]
2004-11-08 9:27 ` Workaround for wrapping loadaverage Andrew Morton
2004-11-08 10:25 ` Patrick Mau
2004-11-08 23:50 ` Andrew Morton
2004-11-09 0:43 ` Patrick Mau
2004-11-09 18:51 ` Herbert Poetzl
2004-11-09 21:49 ` Con Kolivas
2004-11-10 6:20 ` Herbert Poetzl
2004-11-10 9:57 ` Con Kolivas
2004-11-10 7:07 ` Nick Piggin
2004-11-10 23:31 ` Herbert Poetzl
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20041108001932.GA16641@oscar.prima.de \
--to=mau@oscar.ping.de \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.