1 .. SPDX-License-Identifier: GPL-2.0
3 .. include:: ../disclaimer-zh_TW.rst
5 :Translator: 胡皓文 Hu Haowen <src.res.211@gmail.com>
11 Linux通過``/proc/stat``和``/proc/uptime``導出各種信息,用戶空間工具
12 如top(1)使用這些信息計算系統花費在某個特定狀態的平均時間。
16 Linux 2.6.18.3-exp (linmac) 02/20/2007
18 avg-cpu: %user %nice %system %iowait %steal %idle
19 10.01 0.00 2.92 5.44 0.00 81.63
23 這裏系統認爲在默認採樣週期內有10.01%的時間工作在用戶空間,2.92%的時
24 間用在系統空間,總體上有81.63%的時間是空閒的。
26 大多數情況下``/proc/stat``的信息幾乎真實反映了系統信息,然而,由於內
27 核採集這些數據的方式/時間的特點,有時這些信息根本不可靠。
29 那麼這些信息是如何被蒐集的呢?每當時間中斷觸發時,內核查看此刻運行的
30 進程類型,並增加與此類型/狀態進程對應的計數器的值。這種方法的問題是
31 在兩次時間中斷之間系統(進程)能夠在多種狀態之間切換多次,而計數器只
37 假設系統有一個進程以如下方式週期性地佔用cpu::
40 |-----------------------|
46 在上面的情況下,根據``/proc/stat``的信息(由於當系統處於空閒狀態時,
49 大家能夠想象內核的這種行爲會發生在許多情況下,這將導致``/proc/stat``
52 /* gcc -o hog smallhog.c */
59 static volatile sig_atomic_t stop;
61 static void sighandler (int signr)
66 static unsigned long hog (unsigned long niters)
69 while (!stop && --niters);
75 struct itimerval it = { .it_interval = { .tv_sec = 0, .tv_usec = 1 },
76 .it_value = { .tv_sec = 0, .tv_usec = 1 } };
78 unsigned long v[HIST];
81 signal (SIGALRM, &sighandler);
82 setitimer (ITIMER_REAL, &it, NULL);
85 for (i = 0; i < HIST; ++i) v[i] = ULONG_MAX - hog (ULONG_MAX);
86 for (i = 0; i < HIST; ++i) tmp += v[i];
88 n = tmp - (tmp / 3.0);
91 sigaddset (&set, SIGALRM);
104 - https://lore.kernel.org/r/loom.20070212T063225-663@post.gmane.org
105 - Documentation/filesystems/proc.rst (1.8)
111 Con Kolivas, Pavel Machek