176f1fc26SHu Haowen.. SPDX-License-Identifier: GPL-2.0 276f1fc26SHu Haowen 376f1fc26SHu Haowen.. include:: ../disclaimer-zh_TW.rst 476f1fc26SHu Haowen 5*44a54e25SHu Haowen:Translator: 胡皓文 Hu Haowen <src.res.211@gmail.com> 676f1fc26SHu Haowen 776f1fc26SHu Haowen======== 876f1fc26SHu HaowenCPU 負載 976f1fc26SHu Haowen======== 1076f1fc26SHu Haowen 1176f1fc26SHu HaowenLinux通過``/proc/stat``和``/proc/uptime``導出各種信息,用戶空間工具 1276f1fc26SHu Haowen如top(1)使用這些信息計算系統花費在某個特定狀態的平均時間。 1376f1fc26SHu Haowen例如: 1476f1fc26SHu Haowen 1576f1fc26SHu Haowen $ iostat 1676f1fc26SHu Haowen Linux 2.6.18.3-exp (linmac) 02/20/2007 1776f1fc26SHu Haowen 1876f1fc26SHu Haowen avg-cpu: %user %nice %system %iowait %steal %idle 1976f1fc26SHu Haowen 10.01 0.00 2.92 5.44 0.00 81.63 2076f1fc26SHu Haowen 2176f1fc26SHu Haowen ... 2276f1fc26SHu Haowen 2376f1fc26SHu Haowen這裡系統認爲在默認採樣周期內有10.01%的時間工作在用戶空間,2.92%的時 2476f1fc26SHu Haowen間用在系統空間,總體上有81.63%的時間是空閒的。 2576f1fc26SHu Haowen 2676f1fc26SHu Haowen大多數情況下``/proc/stat``的信息幾乎真實反映了系統信息,然而,由於內 2776f1fc26SHu Haowen核採集這些數據的方式/時間的特點,有時這些信息根本不可靠。 2876f1fc26SHu Haowen 2976f1fc26SHu Haowen那麼這些信息是如何被搜集的呢?每當時間中斷觸發時,內核查看此刻運行的 3076f1fc26SHu Haowen進程類型,並增加與此類型/狀態進程對應的計數器的值。這種方法的問題是 3176f1fc26SHu Haowen在兩次時間中斷之間系統(進程)能夠在多種狀態之間切換多次,而計數器只 3276f1fc26SHu Haowen增加最後一種狀態下的計數。 3376f1fc26SHu Haowen 3476f1fc26SHu Haowen舉例 3576f1fc26SHu Haowen--- 3676f1fc26SHu Haowen 3776f1fc26SHu Haowen假設系統有一個進程以如下方式周期性地占用cpu:: 3876f1fc26SHu Haowen 3976f1fc26SHu Haowen 兩個時鐘中斷之間的時間線 4076f1fc26SHu Haowen |-----------------------| 4176f1fc26SHu Haowen ^ ^ 4276f1fc26SHu Haowen |_ 開始運行 | 4376f1fc26SHu Haowen |_ 開始睡眠 4476f1fc26SHu Haowen (很快會被喚醒) 4576f1fc26SHu Haowen 4676f1fc26SHu Haowen在上面的情況下,根據``/proc/stat``的信息(由於當系統處於空閒狀態時, 4776f1fc26SHu Haowen時間中斷經常會發生)系統的負載將會是0 4876f1fc26SHu Haowen 4976f1fc26SHu Haowen大家能夠想像內核的這種行爲會發生在許多情況下,這將導致``/proc/stat`` 5076f1fc26SHu Haowen中存在相當古怪的信息:: 5176f1fc26SHu Haowen 5276f1fc26SHu Haowen /* gcc -o hog smallhog.c */ 5376f1fc26SHu Haowen #include <time.h> 5476f1fc26SHu Haowen #include <limits.h> 5576f1fc26SHu Haowen #include <signal.h> 5676f1fc26SHu Haowen #include <sys/time.h> 5776f1fc26SHu Haowen #define HIST 10 5876f1fc26SHu Haowen 5976f1fc26SHu Haowen static volatile sig_atomic_t stop; 6076f1fc26SHu Haowen 6176f1fc26SHu Haowen static void sighandler (int signr) 6276f1fc26SHu Haowen { 6376f1fc26SHu Haowen (void) signr; 6476f1fc26SHu Haowen stop = 1; 6576f1fc26SHu Haowen } 6676f1fc26SHu Haowen static unsigned long hog (unsigned long niters) 6776f1fc26SHu Haowen { 6876f1fc26SHu Haowen stop = 0; 6976f1fc26SHu Haowen while (!stop && --niters); 7076f1fc26SHu Haowen return niters; 7176f1fc26SHu Haowen } 7276f1fc26SHu Haowen int main (void) 7376f1fc26SHu Haowen { 7476f1fc26SHu Haowen int i; 7576f1fc26SHu Haowen struct itimerval it = { .it_interval = { .tv_sec = 0, .tv_usec = 1 }, 7676f1fc26SHu Haowen .it_value = { .tv_sec = 0, .tv_usec = 1 } }; 7776f1fc26SHu Haowen sigset_t set; 7876f1fc26SHu Haowen unsigned long v[HIST]; 7976f1fc26SHu Haowen double tmp = 0.0; 8076f1fc26SHu Haowen unsigned long n; 8176f1fc26SHu Haowen signal (SIGALRM, &sighandler); 8276f1fc26SHu Haowen setitimer (ITIMER_REAL, &it, NULL); 8376f1fc26SHu Haowen 8476f1fc26SHu Haowen hog (ULONG_MAX); 8576f1fc26SHu Haowen for (i = 0; i < HIST; ++i) v[i] = ULONG_MAX - hog (ULONG_MAX); 8676f1fc26SHu Haowen for (i = 0; i < HIST; ++i) tmp += v[i]; 8776f1fc26SHu Haowen tmp /= HIST; 8876f1fc26SHu Haowen n = tmp - (tmp / 3.0); 8976f1fc26SHu Haowen 9076f1fc26SHu Haowen sigemptyset (&set); 9176f1fc26SHu Haowen sigaddset (&set, SIGALRM); 9276f1fc26SHu Haowen 9376f1fc26SHu Haowen for (;;) { 9476f1fc26SHu Haowen hog (n); 9576f1fc26SHu Haowen sigwait (&set, &i); 9676f1fc26SHu Haowen } 9776f1fc26SHu Haowen return 0; 9876f1fc26SHu Haowen } 9976f1fc26SHu Haowen 10076f1fc26SHu Haowen 10176f1fc26SHu Haowen參考 10276f1fc26SHu Haowen--- 10376f1fc26SHu Haowen 10476f1fc26SHu Haowen- https://lore.kernel.org/r/loom.20070212T063225-663@post.gmane.org 10576f1fc26SHu Haowen- Documentation/filesystems/proc.rst (1.8) 10676f1fc26SHu Haowen 10776f1fc26SHu Haowen 10876f1fc26SHu Haowen謝謝 10976f1fc26SHu Haowen--- 11076f1fc26SHu Haowen 11176f1fc26SHu HaowenCon Kolivas, Pavel Machek 11276f1fc26SHu Haowen 113