1. 程式人生 > >生產故障之nfs掛載導致系統負載巨高

生產故障之nfs掛載導致系統負載巨高

col 有時 登錄 strong 華為 water 不可 中斷 導致

起因
最近我們在執行代碼更新的時候執行saltstack接收反饋信息特別慢,有時候還會出現卡住的現象,而我們的執行流程是通過saltstack-master 發送指令給阿裏雲部署的enter機,由enter機去執行salt指令,

那麽我們就登錄到這臺阿裏雲的enter機上,執行top發現機器負載很高,但是CPU、內存、磁盤IO、網絡IO使用率都不高

技術分享圖片

負載的狀態

1、uninterruptible (等待磁盤輸入輸出/不可中斷狀態)
2、nterruptible (等待鍵盤輸入輸出/可中斷狀態)
3、running(正在運行)

什麽是負載?
負載表示的是等待進程的平均數。在上面進程狀態變換過程中,除了running狀態

,其他都是等待狀態,那麽其他狀態都會加入到負載等待進程中嗎?

事實證明,只有進程處於運行態(running)不可中斷狀態(interruptible)才會被加入到負載等待進程中,也就是下面這兩種情況的進程才會表現為負載的值

  • 即便需要立即使用CPU,也還需等待其他進程用完CPU
  • 即便需要繼續處理,也必須等待磁盤輸入輸出完成才能進行

什麽場景會造成CPU低而負載確很高呢?
通過上面的具體分析負載的意義就很明顯了,負載總結為一句話就是:需要運行處理但又必須等待隊列前的進程處理完成的進程個數。具體來說,也就是如下兩種情況:

  • 等待被授權予CPU運行權限的進程
  • 等待磁盤I/O完成的進程

cpu低而負載高也就是說等待磁盤I/O完成的進程過多,就會導致隊列長度過大,這樣就體現到負載過大了,但實際是此時cpu被分配去執行別的任務或空閑,具體場景有如下幾種。

場景一:磁盤讀寫請求過多就會導致大量I/O等待
場景二:MySQL中存在沒有索引的語句或存在死鎖等情況
場景三:外接硬盤故障,常見有掛了NFS,但是NFS server故障

1、解決當前問題的思路
我們了解了系統負載的基本知識後,開始分析
1、系統負載其實就是運行態或者是不可中斷狀態下的進程反饋的狀態
2、當時考慮了負載高的問題可能出現的場景,那麽最有可能出問題的其實就是場景三,nfs導致負載高
3、那麽首先該阿裏雲的enter機確實是有做nfs的掛載,是將華為雲的一臺elk的機器,掛載到本地的/mnt目錄,而該機器正好前段時間被我們初始化了
4、出現該問題的原因主要是,在根目錄ls的時候直接卡住,因為nfs服務端已經掛掉了

,那麽就會導致進程讀寫請求一直獲取不到資源,從而進程一直是不可中斷狀態,並且該ls 進程還特別多,導致cpu的上下文切換,造成負載很高。

技術分享圖片

2、開始處理故障

1.先把nfs掛載給卸載

umount /mnt

2.重啟服務器
這個ls進程因為是不可中斷狀態,那麽只能重啟機器

reboot  
或
在雲的控制臺執行重啟操作

3.重啟完成後即可完成恢復

uptime

生產故障之nfs掛載導致系統負載巨高