Linux 進程的 Uninterruptible sleep(D) 狀態


首先,說一下產生D狀態的原因。

上圖闡釋了一個進程運行的情況,首先,運行的時候,進程會向內核請求一些服務,內核就會將程序掛起進程,並將進程放到parked隊列,通常這些進程只會在parked隊列中停留很短的時間,在ps(1)列表中是不會出現的。但是如果內核因為某些原因不能提供相應服務的話。例如,進程要讀某一個特定的磁盤塊,但是磁盤控制器壞了,這時,除非進程完成讀磁盤,否則內核無法將該進程移出parked隊列,此時該進程標志位就會被置為D。由於進程只有在運行的時候才能接受到signals,所以此時在parked隊列上的進程也就無法接收到信號了。解決這個問題的方法要么是給資源給該進程,要么是reboot。
通俗一點說,產生D狀態的原因出現uninterruptible sleep狀態的進程一般是因為在等待IO,例如磁盤IO、網絡IO等。在發出的IO請求得不到相應之后,進程一般就會轉入uninterruptible sleep狀態,例如若NFS服務端關閉時,如果沒有事先amount相關目錄。在客戶端執行df的話就會掛住整個會話,再用ps axf查看的話會發現df進程狀態位已經變成D。

 

出現負載較高的情況,可以通過vmstat查看是否是由於uninterruptible sleep進程引起的,其中vmstat命令中的procs部分的b列就表示uninterruptible sleep的數量:

 Procs
       r: The number of runnable processes (running or waiting for run time).
       b: The number of processes in uninterruptible sleep.

如上圖,該服務器存在uninterruptible sleep進程,通過 ps aux查看,是數據庫的寫盤進程,初步判斷進程在等待io。

 

注:

  由於只有運行狀態的進程才可以接受信號,所以處於uninterruptible sleep的進程,是無法用kill命令殺掉的,即使是加9或15的信號。

 

 

參考:

http://www.dewen.net.cn/q/5664


免責聲明!

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



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