天天看點

linux程序狀态D和Z的處理linux程序狀态D和Z的處理

原貼:http://www.lupaworld.com/94908/viewspace-60895.html

linux程序狀态D和Z的處理

上一篇 / 下一篇  2008-05-21 16:44:05 / 個人分類:linux程式設計

檢視( 327 ) / 評論( 4 ) / 評分( 0 / 5 ) 長期生活在 Linux 環境裡,漸漸地就有一種環保意識油然而生。比如,我們會在登入提示裡寫上“悟空,我跟你說過叫你不要亂扔東西,亂扔東西是不對的。哎呀我話沒說完你怎麼把棍子扔掉了?月光寶盒是寶物,亂扔它會污染環境,要是砸到小朋友怎麼辦?就算砸不到小朋友,砸到了花花草草也不好嘛...”;在使用者預設目錄裡放一個題為 “自覺保護環境 請勿堆放垃圾”的空檔案,并用 chattr +i 設為不可修改;看到垃圾檔案就立即掃入 /tmp 目錄,然後發廣播通知垃圾制造者自己去 /tmp 認領,且警告其下不為例...我們深知,系統環境的整潔有利于系統管理者保持良好的心情、清晰的思路和穩定的工作狀态。

  有一類垃圾卻并非這麼容易打掃,那就是我們常見的狀态為 D (Uninterruptible sleep) ,以及狀态為 Z (Zombie) 的垃圾程序。這些垃圾程序要麼是求而不得,像怨婦一般等待資源(D),要麼是僵而不死,像冤魂一樣等待超度(Z),它們在 CPU run_queue 裡滞留不去,把 Load Average 弄的老高老高,沒看過我前一篇blog的國際友人還以為這兒民怨沸騰又出了什麼大事呢。怎麼辦?開槍!kill -9!看你們走是不走。但這兩種垃圾程序偏偏是刀槍不入的,不管換哪種槍法都殺不掉它們。無奈,隻好reboot,像剿滅禽流感那樣不分青紅皂白地一律撲殺!

  悟空,我們所運維的可是24*7全天候對外部客戶服務的系統,怎麼能動不動就 reboot ?我們的考核名額可是4個9(99.99%,全年計劃外當機時間不得超過52分鐘34秒),又不是4個8,你稍微遇到點事就reboot,還要不要可用性了?再說,現在社會都開始奔和諧去了,我們對于 D 和 Z 這兩種垃圾程序,也該盡可能采取慈悲手段,能解決其困難的,就創造條件,解決其實際困難,能消除其冤結的,就誦經燒紙,消除其前世冤結,具體問題應具體分析具體解決,濫殺無辜隻會導緻冤冤相報因果循環。

  貧僧還是回來說正題。怨婦 D,往往是由于 I/O 資源得不到滿足,而引發等待,在核心源碼 fs/proc/array.c 裡,其文字定義為“ "D (disk sleep)", ”(由此可知 D 原是Disk的打頭字母),對應着 include/linux/sched.h 裡的“ #define TASK_UNINTERRUPTIBLE 2 ”。舉個例子,當 NFS 服務端關閉之時,若未事先 umount 相關目錄,在 NFS 用戶端執行 df 就會挂住整個登入會話,按 Ctrl+C 、Ctrl+Z 都無濟于事。斷開連接配接再登入,執行 ps axf 則看到剛才的 df 程序狀态位已變成了 D ,kill -9 無法殺滅。正确的處理方式,是馬上恢複 NFS 服務端,再度提供服務,剛才挂起的 df 程序發現了其苦苦等待的資源,便完成任務,自動消亡。若 NFS 服務端無法恢複服務,在 reboot 之前也應将 /etc/mtab 裡的相關 NFS mount 項删除,以免 reboot 過程例行調用 netfs stop 時再次發生等待資源,導緻系統重新開機過程挂起。

  冤魂 Z 之是以殺不死,是因為它已經死了,否則怎麼叫 Zombie(僵屍)呢?冤魂不散,自然是生前有結未解之故。在UNIX/Linux中,每個程序都有一個父程序,程序号叫PID(Process ID),相應地,父程序号就叫PPID(Parent PID)。當程序死亡時,它會自動關閉已打開的檔案,舍棄已占用的記憶體、交換空間等等系統資源,然後向其父程序傳回一個退出狀态值,報告死訊。如果程式有 bug,就會在這最後一步出問題。兒子說我死了,老子卻沒聽見,沒有及時收棺入殓,兒子便成了僵屍。在UNIX/Linux中消滅僵屍的手段比較殘忍,執行 ps axjf 找出僵屍程序的父程序号(PPID,第一列),先殺其父,然後再由程序天子 init(其PID為1,PPID為0)來一起收拾父子僵屍,超度亡魂,往生極樂。注意,子程序變成僵屍隻是礙眼而已,并不礙事,如果僵屍的父程序目前有要務在身,則千萬不可貿然殺之。 備注: PROCESS STATE CODES

Here are the different values that the s, stat and state output specifiers

(header "STAT" or "S") will display to describe the state of a process.

D Uninterruptible sleep (usually IO)

R Running or runnable (on run queue)

S Interruptible sleep (waiting for an event to complete)

T Stopped, either by a job control signal or because it is being traced.

W paging (not valid since the 2.6.xx kernel)

X dead (should never be seen)

Z Defunct ("zombie") process, terminated but not reaped by its parent.

For BSD formats and when the stat keyword is used, additional characters may

be displayed:

< high-priority (not nice to other users)

N low-priority (nice to other users)

L has pages locked into memory (for real-time and custom IO)

s is a session leader

l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)

+ is in the foreground process group

導入論壇 收藏 分享給好友 管理 舉報

TAG:

linux程式狀态D和Z的處理linux程式狀态D和Z的處理
引用 删除 Guest   /   2009-05-22 16:37:51
評 -5 分
linux程式狀态D和Z的處理linux程式狀态D和Z的處理
引用 删除 ckhitler   /   2009-05-19 19:13:54
不錯。我之前也寫過這樣的文章,程序有6種狀态,分别是(z,x,s,d,t,r),UNIX是一套偉大的系統.
linux程式狀态D和Z的處理linux程式狀态D和Z的處理
引用 删除 gnufeng   /   2008-09-13 08:13:30
對D狀态的處理好像還不完全啊,有沒有辦法讓程序永遠沒有D狀态呢?
linux程式狀态D和Z的處理linux程式狀态D和Z的處理
引用 删除 陳莉君   /   2008-05-21 23:15:31

繼續閱讀