1.. SPDX-License-Identifier: GPL-2.0 2 3.. include:: ../disclaimer-zh_TW.rst 4 5:Translator: 胡皓文 Hu Haowen <src.res@email.cn> 6 7======== 8CPU 負載 9======== 10 11Linux通過``/proc/stat``和``/proc/uptime``導出各種信息,用戶空間工具 12如top(1)使用這些信息計算系統花費在某個特定狀態的平均時間。 13例如: 14 15 $ iostat 16 Linux 2.6.18.3-exp (linmac) 02/20/2007 17 18 avg-cpu: %user %nice %system %iowait %steal %idle 19 10.01 0.00 2.92 5.44 0.00 81.63 20 21 ... 22 23這裡系統認爲在默認採樣周期內有10.01%的時間工作在用戶空間,2.92%的時 24間用在系統空間,總體上有81.63%的時間是空閒的。 25 26大多數情況下``/proc/stat``的信息幾乎真實反映了系統信息,然而,由於內 27核採集這些數據的方式/時間的特點,有時這些信息根本不可靠。 28 29那麼這些信息是如何被搜集的呢?每當時間中斷觸發時,內核查看此刻運行的 30進程類型,並增加與此類型/狀態進程對應的計數器的值。這種方法的問題是 31在兩次時間中斷之間系統(進程)能夠在多種狀態之間切換多次,而計數器只 32增加最後一種狀態下的計數。 33 34舉例 35--- 36 37假設系統有一個進程以如下方式周期性地占用cpu:: 38 39 兩個時鐘中斷之間的時間線 40 |-----------------------| 41 ^ ^ 42 |_ 開始運行 | 43 |_ 開始睡眠 44 (很快會被喚醒) 45 46在上面的情況下,根據``/proc/stat``的信息(由於當系統處於空閒狀態時, 47時間中斷經常會發生)系統的負載將會是0 48 49大家能夠想像內核的這種行爲會發生在許多情況下,這將導致``/proc/stat`` 50中存在相當古怪的信息:: 51 52 /* gcc -o hog smallhog.c */ 53 #include <time.h> 54 #include <limits.h> 55 #include <signal.h> 56 #include <sys/time.h> 57 #define HIST 10 58 59 static volatile sig_atomic_t stop; 60 61 static void sighandler (int signr) 62 { 63 (void) signr; 64 stop = 1; 65 } 66 static unsigned long hog (unsigned long niters) 67 { 68 stop = 0; 69 while (!stop && --niters); 70 return niters; 71 } 72 int main (void) 73 { 74 int i; 75 struct itimerval it = { .it_interval = { .tv_sec = 0, .tv_usec = 1 }, 76 .it_value = { .tv_sec = 0, .tv_usec = 1 } }; 77 sigset_t set; 78 unsigned long v[HIST]; 79 double tmp = 0.0; 80 unsigned long n; 81 signal (SIGALRM, &sighandler); 82 setitimer (ITIMER_REAL, &it, NULL); 83 84 hog (ULONG_MAX); 85 for (i = 0; i < HIST; ++i) v[i] = ULONG_MAX - hog (ULONG_MAX); 86 for (i = 0; i < HIST; ++i) tmp += v[i]; 87 tmp /= HIST; 88 n = tmp - (tmp / 3.0); 89 90 sigemptyset (&set); 91 sigaddset (&set, SIGALRM); 92 93 for (;;) { 94 hog (n); 95 sigwait (&set, &i); 96 } 97 return 0; 98 } 99 100 101參考 102--- 103 104- https://lore.kernel.org/r/loom.20070212T063225-663@post.gmane.org 105- Documentation/filesystems/proc.rst (1.8) 106 107 108謝謝 109--- 110 111Con Kolivas, Pavel Machek 112 113