一. 概述
1. CPU時間
cpu指標 | 含義 |
---|---|
user | 用戶態時間 |
nice | 用戶態時間(低優先級,nice>0) |
system | 內核態時間 |
idle | 空閑時間 |
iowait | I/O等待時間 |
irq | 硬中斷 |
softirq | 軟中斷 |
iowait時間是不可靠值,理由如下:
(1)CPU不會等待I/O執行完成,而iowait是等待I/O完成的時間。 當CPU進入idle狀態,很可能會調度另一個task執行,所以iowait計算時間偏小;
(2)多核CPU,iowait的計算並非某一個核,因此計算每一個cpu的iowait非常困難;
相關資料:http://man7.org/linux/man-pages/man5/proc.5.html
二. proc/stat
proc/stat節點記錄的是系統進程整體的統計信息
1. stat數據
$ adb shell cat /proc/stat //CPU指標:user,nice, system, idle, iowait, irq, softirq cpu 130216 19944 162525 1491240 3784 24749 17773 0 0 0 cpu0 40321 11452 49784 403099 2615 6076 6748 0 0 0 cpu1 26585 2425 36639 151166 404 2533 3541 0 0 0 cpu2 22555 2957 31482 152460 330 2236 2473 0 0 0 cpu3 15232 1243 20945 153740 303 1985 3432 0 0 0 cpu4 5903 595 6017 157410 30 10959 605 0 0 0 cpu5 4716 380 3794 157909 23 118 181 0 0 0 cpu6 8001 515 8995 157571 48 571 180 0 0 0 cpu7 6903 377 4869 157885 31 271 613 0 0 0 intr ... ctxt 22523049 btime 1500827856 processes 23231 procs_running 1 procs_blocked 0 softirq 3552900 843593 733695 19691 93143 468832 12783 257382 610426 0 513355
時間單位,sysconf(_SC_CLK_TCK)一般地定義為jiffies(一般地等於10ms)。
2. 說明
intr:系統啟動以來的所有interrupts的次數情況。
ctxt: 系統上下文切換次數。
btime:啟動時長(單位:秒),從Epoch(即1970零時)開始到系統啟動所經過的時長,每次啟動會改變。
此處指為1500827856,轉換北京時間為2017/7/24 0:37:36。
processes:系統啟動后所創建過的進程數量。當短時間該值特別大,系統可能出現異常。
procs_running:處於Runnable狀態的進程個數。
procs_blocked:處於等待I/O完成的進程個數。
另外:
cat /proc/uptime 82044.14 215440.94
第一個值代表從開機到現在的累積時間(單位為秒), 開機后運行82044秒。
第二個值代表從開機到現在的CPU空閑時間,單位為秒。
技巧:結合btime獲取當前的絕對時間,1500827856 + 82044 = 1500909900, 轉換成北京時間2017/7/24 23:25:00,也就是當前執行命令cat /proc/uptime的時間點。
三、proc/pid/stat
proc/pid/stat用於獲取某一個進程的統計信息,實現過程見fs/proc/array.c的do_task_stat()
1. stat數據
$ adb shell cat /proc/8385/stat 1557 (system_server) S 823 823 0 0 -1 1077952832 //1~9 2085481 15248 2003 27 166114 129684 26 30 //10~17 10 -10 221 0 2284 2790821888 93087 18446744073709551615 //18~25 1 1 0 0 0 0 6660 0 36088 0 0 0 17 3 0 0 0 0 0 0 0 0 0 0 0 0 0
2. 解釋
1 pid: 進程ID.
2 comm: task_struct結構體的進程名
3 state: 進程狀態, 此處為S
4 ppid: 父進程ID (父進程是指通過fork方式,通過clone並非父進程)
5 pgrp:進程組ID
6 session:進程會話組ID
7 tty_nr:當前進程的tty終點設備號
8 tpgid:控制進程終端的前台進程號
9 flags:進程標識位,定義在include/linux/sched.h中的PF_*, 此處等於1077952832
10 minflt: 次要缺頁中斷的次數,即無需從磁盤加載內存頁. 比如COW和匿名頁
11 cminflt:當前進程等待子進程的minflt
12 majflt:主要缺頁中斷的次數,需要從磁盤加載內存頁. 比如map文件
13 majflt:當前進程等待子進程的majflt
14 utime: 該進程處於用戶態的時間,單位jiffies,此處等於166114
15 stime: 該進程處於內核態的時間,單位jiffies,此處等於129684
16 cutime:當前進程等待子進程的utime
17 cstime: 當前進程等待子進程的utime
18 priority: 進程優先級, 此次等於10.
19 nice: nice值,取值范圍[19, -20],此處等於-10
20 num_threads: 線程個數, 此處等於221
21 itrealvalue: 該字段已廢棄,恆等於0
22 starttime:自系統啟動后的進程創建時間,單位jiffies,此處等於2284
23 vsize:進程的虛擬內存大小,單位為bytes
24 rss: 進程獨占內存+共享庫,單位pages,此處等於93087
25 rsslim: rss大小上限
3. 說明:
第10~17行主要是隨着時間而改變的量;
內核時間單位,sysconf(_SC_CLK_TCK)一般地定義為jiffies(一般地等於10ms)
starttime: 此值單位為jiffies, 結合/proc/stat的btime,可知道每一個線程啟動的時間點, 1500827856 + 2284/100 = 1500827856, 轉換成北京時間為2017/7/24 0:37:58
第四行數據很少使用,只說一下該行第7至9個數的含義:
signal:即將要處理的信號,十進制,此處等於6660
blocked:阻塞的信號,十進制
sigignore:被忽略的信號,十進制,此處等於36088