======== CPU è´Ÿè½½ ======== Linux通过``/proc/stat``å’Œ``/proc/uptime``导出å„ç§ä¿¡æ¯ï¼Œç”¨æˆ·ç©ºé—´å·¥å…· 如top(1)使用这些信æ¯è®¡ç®—系统花费在æŸä¸ªç‰¹å®šçŠ¶æ€çš„å¹³å‡æ—¶é—´ã€‚ 例如: $ iostat Linux 2.6.18.3-exp (linmac) 02/20/2007 avg-cpu: %user %nice %system %iowait %steal %idle 10.01 0.00 2.92 5.44 0.00 81.63 ... è¿™é‡Œç³»ç»Ÿè®¤ä¸ºåœ¨é»˜è®¤é‡‡æ ·å‘¨æœŸå…§æœ‰10.01%的时间工作在用户空间,2.92%çš„æ—¶ 间用在系统空间,总体上有81.63%的时间是空闲的。 大多数情况下``/proc/stat``çš„ä¿¡æ¯å‡ 乎真实åæ˜ äº†ç³»ç»Ÿä¿¡æ¯ï¼Œç„¶è€Œï¼Œç”±äºŽå†… æ ¸é‡‡é›†è¿™äº›æ•°æ®çš„æ–¹å¼/时间的特点,有时这些信æ¯æ ¹æœ¬ä¸å¯é 。 那么这些信æ¯æ˜¯å¦‚何被æœé›†çš„呢?æ¯å½“时间ä¸æ–触å‘æ—¶ï¼Œå†…æ ¸æŸ¥çœ‹æ¤åˆ»è¿è¡Œçš„ è¿›ç¨‹ç±»åž‹ï¼Œå¹¶å¢žåŠ ä¸Žæ¤ç±»åž‹/状æ€è¿›ç¨‹å¯¹åº”的计数器的值。这ç§æ–¹æ³•çš„问题是 在两次时间ä¸æ–之间系统(进程)能够在多ç§çŠ¶æ€ä¹‹é—´åˆ‡æ¢å¤šæ¬¡ï¼Œè€Œè®¡æ•°å™¨åª å¢žåŠ æœ€åŽä¸€ç§çŠ¶æ€ä¸‹çš„计数。 举例 --- å‡è®¾ç³»ç»Ÿæœ‰ä¸€ä¸ªè¿›ç¨‹ä»¥å¦‚下方å¼å‘¨æœŸæ€§åœ°å 用cpu:: 两个时钟ä¸æ–之间的时间线 |-----------------------| ^ ^ |_ 开始è¿è¡Œ | |_ 开始ç¡çœ (很快会被唤醒) 在上é¢çš„æƒ…å†µä¸‹ï¼Œæ ¹æ®``/proc/stat``çš„ä¿¡æ¯ï¼ˆç”±äºŽå½“系统处于空闲状æ€æ—¶ï¼Œ 时间ä¸æ–ç»å¸¸ä¼šå‘生)系统的负载将会是0 å¤§å®¶èƒ½å¤Ÿæƒ³è±¡å†…æ ¸çš„è¿™ç§è¡Œä¸ºä¼šå‘生在许多情况下,这将导致``/proc/stat`` ä¸å˜åœ¨ç›¸å½“å¤æ€ªçš„ä¿¡æ¯:: /* gcc -o hog smallhog.c */ #include <time.h> #include <limits.h> #include <signal.h> #include <sys/time.h> #define HIST 10 static volatile sig_atomic_t stop; static void sighandler (int signr) { (void) signr; stop = 1; } static unsigned long hog (unsigned long niters) { stop = 0; while (!stop && --niters); return niters; } int main (void) { int i; struct itimerval it = { .it_interval = { .tv_sec = 0, .tv_usec = 1 }, .it_value = { .tv_sec = 0, .tv_usec = 1 } }; sigset_t set; unsigned long v[HIST]; double tmp = 0.0; unsigned long n; signal (SIGALRM, &sighandler); setitimer (ITIMER_REAL, &it, NULL); hog (ULONG_MAX); for (i = 0; i < HIST; ++i) v[i] = ULONG_MAX - hog (ULONG_MAX); for (i = 0; i < HIST; ++i) tmp += v[i]; tmp /= HIST; n = tmp - (tmp / 3.0); sigemptyset (&set); sigaddset (&set, SIGALRM); for (;;) { hog (n); sigwait (&set, &i); } return 0; } å‚考 --- - https://lore.kernel.org/r/loom.20070212T063225-663@post.gmane.org - Documentation/filesystems/proc.rst (1.8) 谢谢 --- Con Kolivas, Pavel Machek