1. 程式人生 > 實用技巧 >程序檢視分析

程序檢視分析

程序是資源的基本分配單位,執行緒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   37280
33676 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 也檢視執行緒