不可中斷進程和僵屍進程


原創轉載請注明出處:https://www.cnblogs.com/agilestyle/p/11520274.html

 

當 iowait 升高時,進程很可能因為得不到硬件的響應,而長時間處於不可中斷狀態。

需要注意的是 iowait 高不一定代表I/O 有性能瓶頸。當系統中只有 I/O 類型的進程在運行時,iowait 也會很高,但實際上,磁盤的讀寫遠沒有達到性能瓶頸的程度。

因此,碰到 iowait 升高時,需要先用 dstat、pidstat 等工具,確認是不是磁盤 I/O 的問題,然后再找是哪些進程導致了 I/O。

等待 I/O 的進程一般是不可中斷狀態,所以用 ps 命令找到的 D 狀態(即不可中斷狀態)的進程,多為可疑進程。

從 ps 或者 top 命令的輸出中,可以發現它們都處於 D 狀態,也就是不可中斷狀態(Uninterruptible Sleep)。

top 和 ps 是最常用的查看進程狀態的工具,從 top 的輸出開始,S列(也就是 Status 列)表示進程的狀態。

  • R 是 Running 或 Runnable 的縮寫,表示進程在 CPU 的就緒隊列中,正在運行或者正在等待運行。
  • D 是 Disk Sleep 的縮寫,也就是不可中斷狀態睡眠(Uninterruptible Sleep),一般表示進程正在跟硬件交互,並且交互過程不允許被其他進程或中斷打斷。
  • Z 是 Zombie 的縮寫,它表示僵屍進程,也就是進程實際上已經結束了,但是父進程還沒有回收它的資源(比如進程的描述符、PID 等)。
  • S 是 Interruptible Sleep 的縮寫,也就是可中斷狀態睡眠,表示進程因為等待某個事件而被系統掛起。當進程等待的事件發生時,它會被喚醒並進入 R 狀態。
  • I 是 Idle 的縮寫,也就是空閑狀態,用在不可中斷睡眠的內核線程上。前面說了,硬件交互導致的不可中斷進程用 D 表示,但對某些內核線程來說,它們有可能實際上並沒有任何負載,用 Idle 正是為了區分這種情況。要注意,D 狀態的進程會導致平均負載升高, I 狀態的進程卻不會。
  • T 或者 t,也就是 Stopped 或 Traced 的縮寫,表示進程處於暫停或者跟蹤狀態。
  • X,也就是 Dead 的縮寫,表示進程已經消亡,所以不會在 top 或者 ps 命令中看到它。

 

不可中斷狀態

不可中斷狀態,這其實是為了保證進程數據與硬件狀態一致,並且正常情況下,不可中斷狀態在很短時間內就會結束。所以,短時的不可中斷狀態進程,一般可以忽略。
但如果系統或硬件發生了故障,進程可能會在不可中斷狀態保持很久,甚至導致系統中出現大量不可中斷進程。這時,就得注意下,系統是不是出現了 I/O 等性能問題。

 

僵屍進程

僵屍進程,這是多進程應用很容易碰到的問題。正常情況下,當一個進程創建了子進程后,它應該通過系統調用 wait() 或者 waitpid() 等待子進程結束,回收子進程的資源;而子進程在結束時,會向它的父進程發送 SIGCHLD 信號,所以,父進程還可以注冊 SIGCHLD 信號的處理函數,異步回收資源。

如果父進程沒這么做,或是子進程執行太快,父進程還沒來得及處理子進程狀態,子進程就已經提前退出,那這時的子進程就會變成僵屍進程。換句話說,父親應該一直對兒子負責,善始善終,如果不作為或者跟不上,都會導致“問題少年”的出現。

通常,僵屍進程持續的時間都比較短,在父進程回收它的資源后就會消亡;或者在父進程退出后,由 init 進程回收后也會消亡。
一旦父進程沒有處理子進程的終止,還一直保持運行狀態,那么子進程就會一直處於僵屍狀態。大量的僵屍進程會用盡 PID 進程號,導致新進程不能創建,所以這種情況一定要避免。

 

小結

  • 不可中斷狀態,表示進程正在跟硬件交互,為了保護進程數據和硬件的一致性,系統不允許其他進程或中斷打斷這個進程。進程長時間處於不可中斷狀態,通常表示系統有 I/O 性能問題。
  • 僵屍進程,表示進程已經退出,但它的父進程還沒有回收子進程占用的資源。短暫的僵屍狀態通常不必理會,但進程長時間處於僵屍狀態,就應該注意了,可能有應用程序沒有正常處理子進程的退出。

 

Reference

https://time.geekbang.org/column/article/71064

https://time.geekbang.org/column/article/71382

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM