1. 程式人生 > 其它 >程序監控分析

程序監控分析

程序狀態

  • 通過top和ps都可以獲取到程序的狀態,其中top的S列輸出為程序狀態,各自代表的含義如下:
    • 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 的縮寫,表示程序處於暫停或者跟蹤狀態。向一個程序傳送 SIGSTOP 訊號,它就會因響應這個訊號變成暫停狀態(Stopped);再向它傳送 SIGCONT 訊號,程序又會恢復執行(如果程序是終端裡直接啟動的,則需要你用 fg 命令,恢復到前臺執行);
    • X,也就是 Dead 的縮寫,表示程序已經消亡,所以你不會在 top 或者 ps 命令中看到它。
  • 在ps中會出現Ss+和D+狀態的程序,分別表示
    • s 表示這個程序是一個會話的領導程序,會話是指共享同一個控制終端的一個或多個程序組;
      • 表示前臺程序組,程序組表示一組相互關聯的程序,比如每個子程序都是父程序所在組的成員。
  • 程序狀態統計,top命令

程序資源

  • 程序使用的cpu資源
    • 通過ps -aux | sort -k 3 -r (通過sort排序第三列的cpu百分比)
  • 通過top互動下按'P'排序cpu使用率
  • 程序使用的mem資源
    • 通過ps -aux | sort -k 4 -r
  • 通過top互動按鍵'M'排序mem使用率

不可中斷程序分析

  • 現象:系統負載和CPU iowait很高
  • 工具:能同時顯示cpu和io資訊,vmstat,iostat,dstat
    • dstat
  • vmstat(bi:每秒讀取的塊數(讀磁碟),bo:每秒寫入的塊數(寫磁碟))
  • iostat
  • 監控結果:磁碟IO和CPU iowait變化相關
  • 進一步確認程序
    • 通過top檢視,是否有D狀態(不可中斷程序)的程序(這裡用dd命令模擬io操作)
  • 記錄D狀態程序PID後
    • 使用pidstat檢視程序對應的IO操作
  - 使用pidstat檢視系統哪些程序進行IO操作
  • 通過strace追蹤程序
  • 通過上面輸出看出:程序11432正在進行以512b大小的重複的讀寫
  • 這與程序11432實際做的事情是一致的(同過dd模擬的場景)
  • 通過perf追蹤程序呼叫
    • perf record -g 錄製15秒左右
    • perf report 回放錄製
  • 找到程序dd,按回車展開,可以看到呼叫系統寫函式或者庫(swapper 是核心中的排程程序,可以先忽略掉)

殭屍程序

  • 殭屍程序是因為父程序沒有回收子程序的資源而出現的
  • 要解決掉殭屍程序,就要找到他們的父程序,然後在父程序裡解決
  • 查詢父程序的命令pstree (Centos上的包為psmisc)
    • -a : 輸出命令列選項
    • p : 程序PID
    • s :指定程序的父程序
  • 查詢對應父程序對於子程序清理的方法