1. 程式人生 > >Linux效能優化-不可中斷和殭屍程序

Linux效能優化-不可中斷和殭屍程序


程序的狀態
R,表示程序正在CPU就緒佇列中,正在執行或正在等待執行
D,不可中斷狀態睡眠,一般表示程序正在跟硬體互動,並且互動過程中不允許被其他程序或中斷打斷
Z,是殭屍程序,子程序結束了但相應資源還沒被父程序回收
S,是可中斷狀態睡眠,表示程序正在等待某個事件而被系統掛Q,當程序等待的事件發生時會進入R狀態
I,是idle的縮寫就是空閒程序,用在不可中斷睡眠的核心執行緒上,硬體互動導致的不可中斷程序用D表示,但對
   某些核心執行緒來說,他們有可能實際上並沒有任何負載,用Idle正式為了區分這種情況,注意D狀態
   的程序會導致平均負載升高,I狀態的程序不會
T,stopped或者trace的縮寫,表示程序處於暫停或跟蹤狀態,向一個程序法送SIGSTOP他就會影響這個狀態,
   再發送SIGCONT訊號,又會變成恢復狀態,用gdb打斷點就會使這個程序變成t狀態
X,表示程序已經消亡,所以不會在top或者ps中看到ta

man ps的結果
 

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

不可中斷程序是為了保證程序資料與硬體狀態一直,在正常情況下,不可中斷在很短時間內就會結束,所以
短時間的不可中斷可以忽略
但如果系統或硬體發生了故障,程序可能會在不可中斷狀態保持很久,甚至導致系統中出現大量不可中斷程序,
這時,就需要注意了,系統是不是出現了I/O效能問題

殭屍程序,父程序沒有及時回收導致的
子程序結束後會向父程序法送SIGCHLD訊號,父程序接受此訊號後會回收
父程序也可以遮蔽這個訊號,讓init去處理


程序組 和 會話
程序組 表示一組相互關聯的程序,比如每個子程序都是父程序所在組的成員
會話   是指共享同一個控制終端的一個或多個程序組
通過SSH登入伺服器,開啟一個控制終端TTY,這個控制終端就對應一個會話,在終端中執行的命令以及他們的子程序就夠成了一個個的程序組,其中在後臺執行的命令構成後臺程序組,在前臺執行的命令構成前臺程序組

 


iowait高不一定代表I/O有效能瓶頸,當系統中只有I/O型別的程序在執行時,iowait也會很高,但實際上,磁碟的讀寫遠沒有達到效能瓶頸的程式
因此,碰到iowait升高時,需要先用dstat,pidstat等工具,確認是不是磁碟I/O的問題,然後再找到是哪些程序導致了I/O問題

等待I/O的程序一般是不可中斷狀態,所以用ps命令找到D狀態(不可中斷狀態)的程序,多位可疑程序
如果是殭屍程序,可疑用perf工具,來分析系統的CPU時鐘事件,在參考的例子中,是直接I/O導致的問題
對應原始碼找到位置中的問題
殭屍程序可以用perf top,再加上pstree找出父程序,檢查wait/waitpid呼叫,或者SIGCHLD訊號處理函式註冊

 

參考

iowait 使用率過高案例