【服務器性能】磁盤IO-wait過高導致http請求pending超時

**問題:**某系統web無法登陸,F12查看登陸請求一直pending,請求pending狀態持續了1min,服務器返回status=504超時狀態,無法登錄。如下圖(問題現象登陸校驗窗口都沒有出來)
問題現象
2 問題分析
前端已經無法登陸,只能上後臺開始排查
1 先看httpserver進程是否正常(幾天前啓動的),pass
2 看who看下是不是有其他人在操作服務器(可能是入侵。。。) ,只有我一個在線。 pass
3 Top命令,查看機器資源消耗情況(如下圖):
1)cpu,內存使用佔用率都很低 pass
2)但是load average 的高值接近20(cpu邏輯核是40的,看來整體負載不是很高)。 ???
3)iowait 18,這個值是個疑問?經驗單iowait<20 系統整體使用是不受影響的 ???
4)系統調度hi,si,st參數全是0無壓力 pass
5)磁盤佔用df -h(lsblk)磁盤存儲無問題 pass
5)這是什麼情況? 網絡故障嗎?
6)從客戶端到服務端測試網絡連接情況ping -t ,無丟包響應時間小於50ms pass
7)查一圈沒有明確找到原因 ,那就繼續仔細分析系統的各參數(從可疑的參數入手)
top命令
系統資源情況整體分析,vmstat -w 3 20 分析下系統整體資源情況,通過下圖可以確認是就是iowait高而且procs(b)可以看出等等io的隊列穩定在11,那麼這些排隊的資源什麼時候回等到io響應?是不是等待io過長導致的 timeout?
vmstat
有iowait那麼是什麼進程在使用佔用io,
通過pidstat找出佔用io多的程序。(如下圖)可確定只有pika進程獨佔io,讀寫都有,排名榜首。
pidstat
怎麼解決? 確認該系統不是線上系統環境後,我們就可以kill暴力嘗試,直接kill掉pika進程。觀察系統資源情況(如下圖),iowait從18降到0了,從web登錄恢復正常了,可以確定就是該問題就是iowait引起的。
正常狀態
PS:如果不能kill進程,那怎麼確認問題? 這就會複雜一些,因爲已經推測是iowait導致一些進程timeout的,那麼怎麼確認是不是timeout,通過web服務的log監控日誌(配合strace追蹤定位服務情況),確認是不是該進程請求等待時間過多導致的超時。定位到原因後確認怎麼處理。

總結:
1 通過暴力kill,已經確認是pika進程讀寫多導致很多程序排隊請求io,web服務請求排隊超時,所有前端http返回碼爲504。
2 通過iostat命令長時間觀察了讀寫,寫最高是40M/s,讀是15M/s,這個數據很低,普通機械磁盤讀寫峯值在150M/s左右(塊大小順序操作),可見落地到實際應用中磁盤的讀寫性能和白皮書的差距很大。
3 通過系統資源分析,只有磁盤系統存在瓶頸,看來load aveager的值也是io性能造成的
建議:
1 應用程序優化
2 磁盤性能優化(多盤RAID或者SSD,高轉速的機械盤)

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