xref: /openbmc/linux/Documentation/translations/zh_TW/admin-guide/cpu-load.rst (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
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