|
@@ -1,9 +1,10 @@
|
|
|
|
|
+========
|
|
|
CPU load
|
|
CPU load
|
|
|
---------
|
|
|
|
|
|
|
+========
|
|
|
|
|
|
|
|
-Linux exports various bits of information via `/proc/stat' and
|
|
|
|
|
-`/proc/uptime' that userland tools, such as top(1), use to calculate
|
|
|
|
|
-the average time system spent in a particular state, for example:
|
|
|
|
|
|
|
+Linux exports various bits of information via ``/proc/stat`` and
|
|
|
|
|
+``/proc/uptime`` that userland tools, such as top(1), use to calculate
|
|
|
|
|
+the average time system spent in a particular state, for example::
|
|
|
|
|
|
|
|
$ iostat
|
|
$ iostat
|
|
|
Linux 2.6.18.3-exp (linmac) 02/20/2007
|
|
Linux 2.6.18.3-exp (linmac) 02/20/2007
|
|
@@ -17,7 +18,7 @@ Here the system thinks that over the default sampling period the
|
|
|
system spent 10.01% of the time doing work in user space, 2.92% in the
|
|
system spent 10.01% of the time doing work in user space, 2.92% in the
|
|
|
kernel, and was overall 81.63% of the time idle.
|
|
kernel, and was overall 81.63% of the time idle.
|
|
|
|
|
|
|
|
-In most cases the `/proc/stat' information reflects the reality quite
|
|
|
|
|
|
|
+In most cases the ``/proc/stat`` information reflects the reality quite
|
|
|
closely, however due to the nature of how/when the kernel collects
|
|
closely, however due to the nature of how/when the kernel collects
|
|
|
this data sometimes it can not be trusted at all.
|
|
this data sometimes it can not be trusted at all.
|
|
|
|
|
|
|
@@ -33,78 +34,78 @@ Example
|
|
|
-------
|
|
-------
|
|
|
|
|
|
|
|
If we imagine the system with one task that periodically burns cycles
|
|
If we imagine the system with one task that periodically burns cycles
|
|
|
-in the following manner:
|
|
|
|
|
|
|
+in the following manner::
|
|
|
|
|
|
|
|
- time line between two timer interrupts
|
|
|
|
|
-|--------------------------------------|
|
|
|
|
|
- ^ ^
|
|
|
|
|
- |_ something begins working |
|
|
|
|
|
- |_ something goes to sleep
|
|
|
|
|
- (only to be awaken quite soon)
|
|
|
|
|
|
|
+ time line between two timer interrupts
|
|
|
|
|
+ |--------------------------------------|
|
|
|
|
|
+ ^ ^
|
|
|
|
|
+ |_ something begins working |
|
|
|
|
|
+ |_ something goes to sleep
|
|
|
|
|
+ (only to be awaken quite soon)
|
|
|
|
|
|
|
|
In the above situation the system will be 0% loaded according to the
|
|
In the above situation the system will be 0% loaded according to the
|
|
|
-`/proc/stat' (since the timer interrupt will always happen when the
|
|
|
|
|
|
|
+``/proc/stat`` (since the timer interrupt will always happen when the
|
|
|
system is executing the idle handler), but in reality the load is
|
|
system is executing the idle handler), but in reality the load is
|
|
|
closer to 99%.
|
|
closer to 99%.
|
|
|
|
|
|
|
|
One can imagine many more situations where this behavior of the kernel
|
|
One can imagine many more situations where this behavior of the kernel
|
|
|
-will lead to quite erratic information inside `/proc/stat'.
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-/* gcc -o hog smallhog.c */
|
|
|
|
|
-#include <time.h>
|
|
|
|
|
-#include <limits.h>
|
|
|
|
|
-#include <signal.h>
|
|
|
|
|
-#include <sys/time.h>
|
|
|
|
|
-#define HIST 10
|
|
|
|
|
-
|
|
|
|
|
-static volatile sig_atomic_t stop;
|
|
|
|
|
-
|
|
|
|
|
-static void sighandler (int signr)
|
|
|
|
|
-{
|
|
|
|
|
- (void) signr;
|
|
|
|
|
- stop = 1;
|
|
|
|
|
-}
|
|
|
|
|
-static unsigned long hog (unsigned long niters)
|
|
|
|
|
-{
|
|
|
|
|
- stop = 0;
|
|
|
|
|
- while (!stop && --niters);
|
|
|
|
|
- return niters;
|
|
|
|
|
-}
|
|
|
|
|
-int main (void)
|
|
|
|
|
-{
|
|
|
|
|
- int i;
|
|
|
|
|
- struct itimerval it = { .it_interval = { .tv_sec = 0, .tv_usec = 1 },
|
|
|
|
|
- .it_value = { .tv_sec = 0, .tv_usec = 1 } };
|
|
|
|
|
- sigset_t set;
|
|
|
|
|
- unsigned long v[HIST];
|
|
|
|
|
- double tmp = 0.0;
|
|
|
|
|
- unsigned long n;
|
|
|
|
|
- signal (SIGALRM, &sighandler);
|
|
|
|
|
- setitimer (ITIMER_REAL, &it, NULL);
|
|
|
|
|
-
|
|
|
|
|
- hog (ULONG_MAX);
|
|
|
|
|
- for (i = 0; i < HIST; ++i) v[i] = ULONG_MAX - hog (ULONG_MAX);
|
|
|
|
|
- for (i = 0; i < HIST; ++i) tmp += v[i];
|
|
|
|
|
- tmp /= HIST;
|
|
|
|
|
- n = tmp - (tmp / 3.0);
|
|
|
|
|
-
|
|
|
|
|
- sigemptyset (&set);
|
|
|
|
|
- sigaddset (&set, SIGALRM);
|
|
|
|
|
-
|
|
|
|
|
- for (;;) {
|
|
|
|
|
- hog (n);
|
|
|
|
|
- sigwait (&set, &i);
|
|
|
|
|
- }
|
|
|
|
|
- return 0;
|
|
|
|
|
-}
|
|
|
|
|
|
|
+will lead to quite erratic information inside ``/proc/stat``::
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ /* gcc -o hog smallhog.c */
|
|
|
|
|
+ #include <time.h>
|
|
|
|
|
+ #include <limits.h>
|
|
|
|
|
+ #include <signal.h>
|
|
|
|
|
+ #include <sys/time.h>
|
|
|
|
|
+ #define HIST 10
|
|
|
|
|
+
|
|
|
|
|
+ static volatile sig_atomic_t stop;
|
|
|
|
|
+
|
|
|
|
|
+ static void sighandler (int signr)
|
|
|
|
|
+ {
|
|
|
|
|
+ (void) signr;
|
|
|
|
|
+ stop = 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ static unsigned long hog (unsigned long niters)
|
|
|
|
|
+ {
|
|
|
|
|
+ stop = 0;
|
|
|
|
|
+ while (!stop && --niters);
|
|
|
|
|
+ return niters;
|
|
|
|
|
+ }
|
|
|
|
|
+ int main (void)
|
|
|
|
|
+ {
|
|
|
|
|
+ int i;
|
|
|
|
|
+ struct itimerval it = { .it_interval = { .tv_sec = 0, .tv_usec = 1 },
|
|
|
|
|
+ .it_value = { .tv_sec = 0, .tv_usec = 1 } };
|
|
|
|
|
+ sigset_t set;
|
|
|
|
|
+ unsigned long v[HIST];
|
|
|
|
|
+ double tmp = 0.0;
|
|
|
|
|
+ unsigned long n;
|
|
|
|
|
+ signal (SIGALRM, &sighandler);
|
|
|
|
|
+ setitimer (ITIMER_REAL, &it, NULL);
|
|
|
|
|
+
|
|
|
|
|
+ hog (ULONG_MAX);
|
|
|
|
|
+ for (i = 0; i < HIST; ++i) v[i] = ULONG_MAX - hog (ULONG_MAX);
|
|
|
|
|
+ for (i = 0; i < HIST; ++i) tmp += v[i];
|
|
|
|
|
+ tmp /= HIST;
|
|
|
|
|
+ n = tmp - (tmp / 3.0);
|
|
|
|
|
+
|
|
|
|
|
+ sigemptyset (&set);
|
|
|
|
|
+ sigaddset (&set, SIGALRM);
|
|
|
|
|
+
|
|
|
|
|
+ for (;;) {
|
|
|
|
|
+ hog (n);
|
|
|
|
|
+ sigwait (&set, &i);
|
|
|
|
|
+ }
|
|
|
|
|
+ return 0;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
|
|
|
References
|
|
References
|
|
|
----------
|
|
----------
|
|
|
|
|
|
|
|
-http://lkml.org/lkml/2007/2/12/6
|
|
|
|
|
-Documentation/filesystems/proc.txt (1.8)
|
|
|
|
|
|
|
+- http://lkml.org/lkml/2007/2/12/6
|
|
|
|
|
+- Documentation/filesystems/proc.txt (1.8)
|
|
|
|
|
|
|
|
|
|
|
|
|
Thanks
|
|
Thanks
|