程序檢視分析
程序是資源的基本分配單位,執行緒cpu 排程的基本單位。
程序狀態
top 和 ps 是最常用的檢視程序狀態的工具,下面是一個 top 命令輸出的示例,S 列(也就是 Status 列)表示程序的狀態。從這個示例裡,你可以看到 R、D、Z、S、I 等幾個狀態
$ top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 28961 root 20 0 43816 3148 4040 R 3.2 0.0 0:00.01 top 620 root 20 0 3728033676 908 D 0.3 0.4 0:00.01 app 1 root 20 0 160072 9416 6752 S 0.0 0.1 0:37.64 systemd 1896 root 20 0 0 0 0 Z 0.0 0.0 0:00.00 devapp 2 root 20 0 0 0 0 S 0.0 0.0 0:00.10 kthreadd 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H 6 root 0-20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq 7 root 20 0 0 0 0 S 0.0 0.0 0:06.37 ksoftirqd/0
各種狀態說明
R 是 Running 或 Runnable 的縮寫,表示程序在 CPU 的就緒佇列中,正在執行或者正在等待執行。
D 是 Disk Sleep 的縮寫,也就是不可中斷狀態睡眠(Uninterruptible Sleep),一般表示程序正在跟硬體互動,並且互動過程不允許被其他程序或中斷打斷。
Z 是 Zombie 的縮寫,如果你玩過“植物大戰殭屍”這款遊戲,應該知道它的意思。它表示殭屍程序,也就是程序實際上已經結束了,但是父程序還沒有回收它的資源(比如程序的描述符、PID 等)。
S 是 Interruptible Sleep 的縮寫,也就是可中斷狀態睡眠,表示程序因為等待某個事件而被系統掛起。當程序等待的事件發生時,它會被喚醒並進入 R 狀態。
I 是 Idle 的縮寫,也就是空閒狀態,用在不可中斷睡眠的核心執行緒上。前面說了,硬體互動導致的不可中斷程序用 D 表示,但對某些核心執行緒來說,它們有可能實際上並沒有任何負載,用 Idle 正是為了區分這種情況。要注意,D 狀態的程序會導致平均負載升高, I 狀態的程序卻不會。
除了以上 5 個狀態,程序還包括下面這 2 個狀態。第一個是 T 或者 t,也就是 Stopped 或 Traced 的縮寫
另一個是 X,也就是 Dead 的縮寫,表示程序已經消亡,所以你不會在 top 或者 ps 命令中看到它。
檢視工具介紹
top 的統計時間間隔是3秒,ps 是整個程序的生命週期期間的數值。
ps 一般有兩種常用的檢視選項
ps -elf 和ps aux
$ ps aux | grep /app root 4009 0.0 0.0 4376 1008 pts/0 Ss+ 05:51 0:00 /app root 4287 0.6 0.4 37280 33660 pts/0 D+ 05:54 0:00 /app root 4288 0.6 0.4 37280 33668 pts/0 D+ 05:54 0:00 /app
父子程序關係檢視
# -a 表示輸出命令列選項 # p表PID # s表示指定程序的父程序 $ pstree -aps 3084 systemd,1 └─dockerd,15006 -H fd:// └─docker-containe,15024 --config /var/run/docker/containerd/containerd.toml └─docker-containe,3991 -namespace moby -workdir... └─app,4009 └─(app,3084)
每個程序的資源使用情況的詳細監控 pidstat
預設檢視所有正在被核心管理的程序
pidstat 1 2 #頻率為1秒,輸出報告數量為2
pidstat -p pid #檢視指定pid 的程序的情況
pidstat -w #檢視上下文切換情況
pidstat -d #檢視磁碟相關情況
pidstat -t #預設只檢視程序,加上-t 也檢視執行緒