From: Simon Arlott <simon@fire.lp0.eu>
To: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: round_jiffies and load average
Date: Thu, 01 Mar 2007 09:11:59 +0000 [thread overview]
Message-ID: <45E698DF.4010006@simon.arlott.org.uk> (raw)
In-Reply-To: <45E0577C.9020409@simon.arlott.org.uk>
On 24/02/07 15:19, Simon Arlott wrote:
> I've modified the driver of an USB device (cxacru) to schedule the next poll
> for status every 1s using round_jiffies_relative instead of just waiting 1s
> since the last poll was completed. This process takes on average 11ms to
> complete and while it is waiting for a response it's considered running.
> The load average is calculated every 5 seconds equivalent to round_jiffies,
> so I have a problem with the load average always tending towards 1.00.
> Perhaps the load average count could be run just before or in the middle of
> a second instead?
I've added some printks to show exactly what happens (see below).
Since calc_load() appears to be run as often as possible, would it be ok to
move it to run half a second out of step from rounded jiffies? Its count
value is initialised to LOAD_FREQ so it would be easy to add HZ/2.
Otherwise every process using round_jiffies to 1s (1.00), 2s (0.50),
3s (0.33), 4s (0.25), 5s (0.00 or 1.00) could affect the load average in a
constant way. (Beyond 10s the effect is unlikely to be noticed).
After a while of this (~3min):
[ 192.147049] cxacru_poll_status(..), jiffies=4294832000
[ 192.151319] cxacru_poll_status(..), jiffies=4294832004, next=996
[ 192.463459] calc_load(27), count=-20, jiffies=4294832316
[ 192.463472] calc_load(27), count=4980, jiffies=4294832316
Jiffies wraps:
[ 327.121469] cxacru_poll_status(..), jiffies=4294967000
[ 327.139428] cxacru_poll_status(..), jiffies=4294967018, next=1000
[ 327.437739] calc_load(27), count=-20, jiffies=20
[ 327.437750] calc_load(27), count=4980, jiffies=20
The next run occurs during cxacru_poll_status:
[ 332.416288] cxacru_poll_status(..), jiffies=5000
[ 332.417312] calc_load(1), count=-1, jiffies=5001
[ 332.417322] calc_load(1), count=4999, jiffies=5001
[ 332.423382] cxacru_poll_status(..), jiffies=5007, next=993
This happens without fail until I reboot:
[ 672.350970] cxacru_poll_status(..), jiffies=345000
[ 672.351913] calc_load(1), count=-1, jiffies=345001
[ 672.351926] calc_load(1), count=4999, jiffies=345001
[ 672.367737] cxacru_poll_status(..), jiffies=345016, next=984
It's interesting that calc_load() is run most of the time 19ms later (count=-20) than usual until jiffies wraps, then it runs on time or 1ms late (count=-2). Full log available on request (75K), HZ=1000 with NO_HZ.
(diff below of cxacru.c based on http://lkml.org/lkml/2007/2/23/328)
---
diff --git a/drivers/usb/atm/cxacru.c b/drivers/usb/atm/cxacru.c
index c8b69bf..4717fa4 100644
--- a/drivers/usb/atm/cxacru.c
+++ b/drivers/usb/atm/cxacru.c
@@ -535,6 +535,7 @@ static void cxacru_poll_status(struct work_struct *work)
struct atm_dev *atm_dev = usbatm->atm_dev;
int ret;
+ printk(KERN_DEBUG "cxacru_poll_status(..), jiffies=%lu\n", jiffies);
ret = cxacru_cm_get_array(instance, CM_REQUEST_CARD_INFO_GET, buf, CXINF_MAX);
if (ret < 0) {
atm_warn(usbatm, "poll status: error %d\n", ret);
@@ -599,6 +600,8 @@ static void cxacru_poll_status(struct work_struct *work)
reschedule:
schedule_delayed_work(&instance->poll_work,
round_jiffies_relative(msecs_to_jiffies(POLL_INTERVAL*1000)));
+ printk(KERN_DEBUG "cxacru_poll_status(..), jiffies=%lu, next=%lu\n", jiffies,
+ round_jiffies_relative(msecs_to_jiffies(POLL_INTERVAL*1000)));
}
static int cxacru_fw(struct usb_device *usb_dev, enum cxacru_fw_request fw,
diff --git a/kernel/timer.c b/kernel/timer.c
index cb1b86a..9c2b816 100644
--- a/kernel/timer.c
+++ b/kernel/timer.c
@@ -1230,12 +1230,14 @@ static inline void calc_load(unsigned long ticks)
count -= ticks;
if (unlikely(count < 0)) {
active_tasks = count_active_tasks();
+ printk(KERN_DEBUG "calc_load(%lu), count=%d, jiffies=%lu\n", ticks, count, jiffies);
do {
CALC_LOAD(avenrun[0], EXP_1, active_tasks);
CALC_LOAD(avenrun[1], EXP_5, active_tasks);
CALC_LOAD(avenrun[2], EXP_15, active_tasks);
count += LOAD_FREQ;
} while (count < 0);
+ printk(KERN_DEBUG "calc_load(%lu), count=%d, jiffies=%lu\n", ticks, count, jiffies);
}
}
--
Simon Arlott
next prev parent reply other threads:[~2007-03-01 9:12 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-02-24 15:19 round_jiffies and load average Simon Arlott
2007-03-01 9:11 ` Simon Arlott [this message]
2007-03-01 18:52 ` [PATCH] timer: Add an initial 0.5s delay to calc_load Simon Arlott
2007-03-01 22:52 ` [PATCH (updated)] timer: Run calc_load halfway through each round_jiffies second Simon Arlott
2002-01-01 3:05 ` Pavel Machek
2007-03-05 22:35 ` Simon Arlott
2007-03-06 18:42 ` [PATCH (update 4)] " Simon Arlott
2007-03-06 22:20 ` [PATCH (updated)] " Chuck Ebbert
2007-03-01 23:10 ` Bill Irwin
2007-03-02 10:15 ` [PATCH (update 2)] " Simon Arlott
2007-03-02 15:15 ` [PATCH (update 3)] " Simon Arlott
2007-03-02 16:35 ` Eric Dumazet
2007-03-02 17:32 ` Simon Arlott
2007-03-02 18:03 ` Eric Dumazet
2007-03-02 20:14 ` Simon Arlott
2007-03-02 22:32 ` Eric Dumazet
2007-03-02 23:54 ` Simon Arlott
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=45E698DF.4010006@simon.arlott.org.uk \
--to=simon@fire.lp0.eu \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox