1. 程式人生 > >Linux系統之執行狀態分析及問題排查思路

Linux系統之執行狀態分析及問題排查思路

〇、一件事兒

以下分析是站在Java工程師的角度來分析的。

一、CPU分析

分析CPU的繁忙程度,兩個指標:系統負載和CPU利用率

1、系統負載分析

系統負載:在Linux系統中表示,一段時間內正在執行程序數和CPU執行佇列中就緒等待程序數,以及非常重要的休眠但不可中斷的程序數的平均值(具體load值的計算方式,有興趣可以自行深究,這裡不深究)。說白了就是,系統負載與R(Linux系統之程序狀態)和D(Linux系統之程序狀態)狀態的程序有關,這兩個狀態的程序越多,負載越高。

檢視系統負載,見top命令:第1部分。

  1. 怎麼看load average的值?
    通常先看15分鐘的load值,如果load很高,再看1分鐘和5分鐘的load值,檢視是否有下降趨勢。短時間內load值高,無須太擔心;但是如果長時間內load值持續過高,那麼就要趕緊看看發生了什麼。

  2. 需要警惕的load average的值(以單核CPU為例):
    • load值持續大於0.7,必須開始找問題出在哪裡,防止情況惡化;
    • load值持續大於1.0,解決問題已迫在眉睫;
    • load值持續大升高達到5.0,表示各種請求幾乎得不到響應,機器幾近崩潰;

      對於多核機器,則需要根據CPU個數來判斷系統負載是否過高。如,若認為0.7算是單核機器負載的安全線的話,則四核機器的負載最好保持在3(4*0.7 = 2.8)以下。

2、CPU利用率分析

  1. 看CPU的空閒率,使用者程序CPU使用率和系統程序CPU使用率。
  2. 看個別程序的CPU利用率是否明顯高於其他程序:
    • 死迴圈?
    • 複雜計算?
    • 超大物件耗時讀寫?

檢視CPU利用率,見top命令:第3部分和第5部分。

3、綜合兩個分析

  1. CPU利用率高,系統負載低
    • 死迴圈?
    • 複雜計算?
    • 超大物件耗時讀寫?
  2. 系統負載高,CPU利用率低
    • 大量IO操作?
    • 大量死鎖?
    • 大量執行耗時SQL?
    • 記憶體不足,頻繁GC?
  3. 系統負載高,CPU利用率高
    • 大量程序出現死迴圈?
    • 大量程序進行復雜計算?
    • 大量程序對超大物件耗時讀寫?
    • 硬體無法支撐應用,升級機器?

三、記憶體分析

  1. 看總記憶體的使用情況;
  2. 是否有個別程序記憶體消耗明顯高?
    • JVM記憶體設定是否合理?
    • 是否有大物件長時間未釋放?

檢視記憶體使用情況,見free命令和top命令:第5部分。

四、I/O分析

  1. 如果avgqu-sz比較大,表示相當量的io在等待;
  2. 如果svctm比較接近await,說明I/O幾乎沒有等待時間;如果 await遠大於svctm,說明I/O 佇列太長,io響應太慢,則需要進行必要優化;
  3. 如果%util接近 100%(70%為安全線),說明產生的I/O請求太多,I/O系統已經滿負荷,該磁碟可能存在瓶頸;
  4. 如果I/O存在瓶頸,可以用pidstat命令找到I/O讀寫高的程序;

檢視I/O讀寫狀況,見iostat命令。

五、網路分析

netstat分析:

  1. 分析連線狀態
    • 若服務端出現了大量TIME_WAIT狀態的連線,說明該伺服器經常主動發起連線關閉操作,這是不可取的;
    • 若一個系統頻繁出現CLOSE_WAIT狀態的連線,說明該系統並未立即處理連線關閉請求,系統存在缺陷;
  2. 分析網路佇列
    • 若Recv-Q過大,說明系統未能及時處理外部發來的請求;
    • 若Send-Q過大,說明系統發包速度過快以至於連線無法及時將資料發出,或者對端接收資料包慢

      這兩個值通常應該為0,如果不為0可能是有問題的;資料包在兩個佇列裡都不應該有堆積;可接受短暫的非0情況。

  3. 分析伺服器端能否正常處理客戶端連線
    如果Recv-Q佇列大小值>=設定的somaxconn值(cat /proc/sys/net/core/somaxconn)說明伺服器無法適應當前連線建立速度,不能及時accept新的連線。

    客戶端在呼叫listen時,會傳遞backlog引數,該引數為“已建立連線但未被程式accept的連線佇列的長度”,核心層會根據cat /proc/sys/net/core/somaxconn值與傳入的backlog值,選擇兩者中的小值作為“已建立連線但未被伺服器accept的連線佇列長度”

tcpdump分析:

tcpdump通過抓指定埠的資料包,可以分析指定程序的資料包流量。

通過抓包工具tcpdump及網路狀態檢視命令netstat可以幫助定位客戶端、服務端相關網路問題,在日誌匱乏或效能統計資訊不足以分析伺服器問題時,可以輔助分析伺服器相關模組效能。

檢視網路連線狀況,見netstat命令和tcpdump命令。

六、排查思路

  1. 系統負載、CPU利用率、記憶體、I/O、網路等因素綜合考慮,才是解決問題的關鍵。
  2. 先整體分析哪塊問題,再定位特徵程序(例如CPU利用率明顯高於其他程序的程序),進而結合jstack定位到執行緒和程式碼。