Linux 效能優化之 CPU 篇 ----- 殭屍程式

bossaiguo發表於2020-06-26

名詞解釋

  1. 殭屍程式:正常情況下,當一個程式建立了子程式後,它應該通過系統呼叫 wait() 或者 waitpid() 等待子程式結束,回收子程式的資源;而子程式在結束時,會向它的父程式傳送 SIGCHLD 訊號,所以,父程式還可以註冊 SIGCHLD 訊號的處理函式,非同步回收資源。如果父程式沒這麼做,或是子程式執行太快,父程式還沒來得及處理子程式狀態,子程式就已經提前退出,那這時的子程式就會變成殭屍程式。通常,殭屍程式持續的時間都比較短,在父程式回收它的資源後就會消亡;或者在父程式退出後,由 init 程式回收後也會消亡。
  2. 不可中斷狀態: 表示程式正在跟硬體互動,為了保護程式資料和硬體的一致性,系統不允許其他程式或中斷打斷這個程式。程式長時間處於不可中斷狀態,通常表示系統有 I/O 效能問題。

答疑

  1. 下面是一個 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 狀態的程式卻不會

小工具與技巧

dstat ,它的好處是,可以同時檢視 CPU 和 I/O 這兩種資源的使用情況,便於對比分析


# 間隔1秒輸出10組資料
$ dstat 1 10
You did not select any stats, using -cdngy by default.
--total-cpu-usage-- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai stl| read  writ| recv  send|  in   out | int   csw
  0   0  96   4   0|1219k  408k|   0     0 |   0     0 |  42   885
  0   0   2  98   0|  34M    0 | 198B  790B|   0     0 |  42   138
  0   0   0 100   0|  34M    0 |  66B  342B|   0     0 |  42   135
  0   0  84  16   0|5633k    0 |  66B  342B|   0     0 |  52   177
  0   3  39  58   0|  22M    0 |  66B  342B|   0     0 |  43   144
  0   0   0 100   0|  34M    0 | 200B  450B|   0     0 |  46   147
  0   0   2  98   0|  34M    0 |  66B  342B|   0     0 |  45   134
  0   0   0 100   0|  34M    0 |  66B  342B|   0     0 |  39   131
  0   0  83  17   0|5633k    0 |  66B  342B|   0     0 |  46   168
  0   3  39  59   0|  22M    0 |  66B  342B|   0     0 |  37   134
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章