故障排查——負載Load過高

本篇將介紹負載過高的處理方案。

負載

在Linux系統中,uptimewtop等命令都會有系統平均負載load average的輸出:

load

產生原因

負載受到多個因素影響,帶寬、系統硬件配置、內核參數、應用程序等。

排查步驟

在查看了top命令所顯示的狀態後,需要依據其來做優化,但top命令顯示的只是表象,所以我們可以通過iostat或者vmstat命令進一步的觀察。

  1. 查看系統負載

  • procs
    r 列表示運行和等待cpu時間片的進程數,如果長期大於1,說明cpu不足,需要增加cpu
    b 列表示在等待資源的進程數,比如正在等待I/O、或者內存交換等。

  • cpu 表示cpu的使用狀態
    us 列顯示了用戶方式下所花費 CPU 時間的百分比。us的值比較高時,說明用戶進程消耗的cpu時間多,但是如果長期大於50%,需要考慮優化用戶的程序
    sy 列顯示了內核進程所花費的cpu時間的百分比。這裏us + sy的參考值爲80%,如果us+sy 大於 80%說明可能存在CPU不足
    wa 列顯示了IO等待所佔用的CPU時間的百分比。這裏wa的參考值爲30%,如果wa超過30%,說明IO等待嚴重,這可能是磁盤大量隨機訪問造成的,也可能磁盤或者磁盤訪問控制器的帶寬瓶頸造成的(主要是塊操作)。
    id 列顯示了cpu處在空閒狀態的時間百分比

  • system 顯示採集間隔內發生的中斷數
    in 列表示在某一時間間隔中觀測到的每秒設備中斷數。
    cs列表示每秒產生的上下文切換次數,如當 cs 比磁盤 I/O 和網絡信息包速率高得多,都應進行進一步調查。

  • memory
    swpd 切換到內存交換區的內存數量(k表示)。如果swpd的值不爲0,或者比較大,比如超過了100m,只要si、so的值長期爲0,系統性能還是正常
    free 當前的空閒頁面列表中內存數量(k表示)
    buff 作爲buffer cache的內存數量,一般對塊設備的讀寫才需要緩衝。
    cache: 作爲page cache的內存數量,一般作爲文件系統的cache,如果cache較大,說明用到cache的文件較多,如果此時IO中bi比較小,說明文件系統效率比較好。

  • swap
    si 由內存進入內存交換區數量。
    so由內存交換區進入內存數量。

  • I/O
    bi 從塊設備讀入數據的總量(讀磁盤)(每秒kb)。
    bo 塊設備寫入數據的總量(寫磁盤)(每秒kb)
    這裏我們設置的bi+bo參考值爲1000,如果超過1000,而且wa值較大應該考慮均衡磁盤負載,可以結合iostat輸出來分析。

  1. 查看磁盤負載
    iostat
    rrqm/s: 每秒進行 merge 的讀操作數目。即 delta(rmerge)/s
    wrqm/s: 每秒進行 merge 的寫操作數目。即 delta(wmerge)/s
    r/s: 每秒完成的讀 I/O 設備次數。即 delta(rio)/s
    w/s: 每秒完成的寫 I/O 設備次數。即 delta(wio)/s
    rsec/s: 每秒讀扇區數。即 delta(rsect)/s
    wsec/s: 每秒寫扇區數。即 delta(wsect)/s
    rkB/s: 每秒讀K字節數。是 rsect/s 的一半,因爲每扇區大小爲512字節。(需要計算)
    wkB/s: 每秒寫K字節數。是 wsect/s 的一半。(需要計算)
    avgrq-sz: 平均每次設備I/O操作的數據大小 (扇區)。delta(rsect+wsect)/delta(rio+wio)
    avgqu-sz: 平均I/O隊列長度。即 delta(aveq)/s/1000 (因爲aveq的單位爲毫秒)。
    await: 平均每次設備I/O操作的等待時間 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)
    svctm: 平均每次設備I/O操作的服務時間 (毫秒)。即 delta(use)/delta(rio+wio)
    %util: 一秒中有百分之多少的時間用於 I/O 操作,或者說一秒中有多少時間 I/O 隊列是非空的。即 delta(use)/s/1000 (因爲use的單位爲毫秒)

如果 %util 接近 100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸。idle小於70% IO壓力就較大了,一般讀取速度有較多的wait。同時可以結合vmstat 查看查看b參數(等待資源的進程數)和wa參數(IO等待所佔用的CPU時間的百分比,高過30%時IO壓力高)。

也可以輸入ps -axjf指令查看進程狀態。查看STAT列是否存在 D 狀態進程。(D 狀態是指不可中斷的睡眠狀態。該狀態進程無法被殺死,也無法自行退出。)
ps
若出現較多 D 狀態進程,通過恢復該進程依賴資源或重啓系統解決(萬能)。

健康範圍

負荷 1.00 說明系統已經沒有剩餘的資源了。在實際情況中 ,有經驗的系統管理員都會將這條線劃在 0.70(在多核處理中,你的系統均值不應該高於處理器核心的總數量):

需要進行調查法則”: 如果長期你的系統負載在 0.70 上下,那麼你需要在事情變得更糟糕之前,花些時間瞭解其原因。

現在就要修復法則”:1.00 。 如果你的服務器系統負載長期徘徊於 1.00,那麼就應該馬上解決這個問題。否則,你將半夜接到你上司的電話,這可不是件令人愉快的事情。

凌晨三點半鍛鍊身體法則”:5.00。 如果你的服務器負載超過了 5.00 這個數字,那麼你將失去你的睡眠,還得在會議中說明這情況發生的原因,總之千萬不要讓它發生。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章