生產故障之nfs掛載導致系統負載巨高
最近我們在執行代碼更新的時候執行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掛載導致系統負載巨高