1 .. SPDX-License-Identifier: GPL-2.0 2 3 .. include:: ../disclaimer-zh_TW.rst 4 5 :Translator: 胡皓文 Hu Haowen <2023002089@link.tyut.edu.cn> 6 7 ======== 8 CPU 負載 9 ======== 10 11 Linux通過``/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 111 Con Kolivas, Pavel Machek 112
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.