[PATCH] Re: loadavg vs loadavgrt

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 12/21/07, Luis Claudio R. Goncalves <lclaudio@xxxxxxxx> wrote:
> On Fri, Dec 21, 2007 at 10:28:39AM +0530, Jaswinder Singh wrote:
> | On Dec 20, 2007 10:19 PM, Steven Rostedt <rostedt@xxxxxxxxxxx> wrote:
> | >
> | > So the numbers are bogus!
> | >
> |
> | Thanks, understood :)
> |
> | root@xxxxxxxxxxxxx:~# cat /proc/loadavg
> | 0.00 0.00 0.02 1/52 1159
> |
> | This seems loadavg is calculating average for non-RT tasks.
> |
> | I think loadavg should be loadavg(all RT Tasks) + loadavg(all non-RT
> | tasks) , it means loadavg should be all Tasks(RT + non-RT)  running on
> | the machine.
> |
> | In RT we introduced loadavgrt, but we changed the meaning of loadavg.
>
> In fact, we haven't changed the meaning at all. The question is that in
> some cases the calculation happens in sync with some kernel threads
> dispatch and that makes system load _artificially_ equal to the number of
> processors in the system. Have fun reading kernel/timer.c (calc_load()) and
> understanding the logic behind it. All the answers lie there...
>
> | Currently loadavgrt is correct it is trying to calculate average of RT
> tasks.
> | But currently loadavg is loadavgnonrt, it should be loadavg (for all
> Tasks)
> |

Here is the patch which fix this problem, now loadavg >= loadavgrt

With this patch, I am getting:
root@xxxxxxxxxxxxx:~# cat /proc/loadavg
0.99 0.82 0.42 1/46 1013
root@xxxxxxxxxxxxx:~# cat /proc/loadavgrt
0.99 0.82 0.42 0/46 1014
root@xxxxxxxxxxxxx:~#

diff -urN linux-2.6.23-rt3.org/kernel/timer.c linux-2.6.23-rt3/kernel/timer.c
--- linux-2.6.23-rt3.org/kernel/timer.c 2007-12-22 11:50:00.000000000 +0530
+++ linux-2.6.23-rt3/kernel/timer.c     2007-12-22 12:01:10.000000000 +0530
@@ -967,13 +967,17 @@
                active_rt_tasks = count_active_rt_tasks();
 #endif
                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);
 #ifdef CONFIG_PREEMPT_RT
+                       CALC_LOAD(avenrun[0], EXP_1, active_tasks +
active_rt_tasks);
+                       CALC_LOAD(avenrun[1], EXP_5, active_tasks +
active_rt_tasks);
+                       CALC_LOAD(avenrun[2], EXP_15, active_tasks +
active_rt_tasks);
                        CALC_LOAD(avenrun_rt[0], EXP_1, active_rt_tasks);
                        CALC_LOAD(avenrun_rt[1], EXP_5, active_rt_tasks);
                        CALC_LOAD(avenrun_rt[2], EXP_15, active_rt_tasks);
+#else
+                       CALC_LOAD(avenrun[0], EXP_1, active_tasks);
+                       CALC_LOAD(avenrun[1], EXP_5, active_tasks);
+                       CALC_LOAD(avenrun[2], EXP_15, active_tasks);
 #endif
                        count += LOAD_FREQ;


Thank you,

Jaswinder Singh.
-
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [RT Stable]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]

  Powered by Linux