linux内核cpu负载计算,CPU 负载 — The Linux Kernel documentation
CPU 負載?
Linux通過``/proc/stat``和``/proc/uptime``導出各種信息,用戶空間工具
如top(1)使用這些信息計算系統(tǒng)花費在某個特定狀態(tài)的平均時間。
例如:
$ iostat
Linux 2.6.18.3-exp (linmac) 02/20/2007
avg-cpu: %user %nice %system %iowait %steal %idle10.01 0.00 2.92 5.44 0.00 81.63
…
這里系統(tǒng)認為在默認采樣周期內有10.01%的時間工作在用戶空間,2.92%的時
間用在系統(tǒng)空間,總體上有81.63%的時間是空閑的。
大多數(shù)情況下``/proc/stat``的信息幾乎真實反映了系統(tǒng)信息,然而,由于內
核采集這些數(shù)據(jù)的方式/時間的特點,有時這些信息根本不可靠。
那么這些信息是如何被搜集的呢?每當時間中斷觸發(fā)時,內核查看此刻運行的
進程類型,并增加與此類型/狀態(tài)進程對應的計數(shù)器的值。這種方法的問題是
在兩次時間中斷之間系統(tǒng)(進程)能夠在多種狀態(tài)之間切換多次,而計數(shù)器只
增加最后一種狀態(tài)下的計數(shù)。
舉例
—
假設系統(tǒng)有一個進程以如下方式周期性地占用cpu:
兩個時鐘中斷之間的時間線
|-----------------------|
^ ^
|_ 開始運行 |
|_ 開始睡眠
(很快會被喚醒)
在上面的情況下,根據(jù)``/proc/stat``的信息(由于當系統(tǒng)處于空閑狀態(tài)時,
時間中斷經常會發(fā)生)系統(tǒng)的負載將會是0
大家能夠想象內核的這種行為會發(fā)生在許多情況下,這將導致``/proc/stat``
中存在相當古怪的信息:
/* gcc -o hog smallhog.c */
#include
#include
#include
#include
#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;
}
參考
—
謝謝
—
Con Kolivas, Pavel Machek
總結
以上是生活随笔為你收集整理的linux内核cpu负载计算,CPU 负载 — The Linux Kernel documentation的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux查看文件使用情况,linux查
- 下一篇: 联想手机听筒声音很小怎么解决