某生產環境伺服器(多個服務都安裝在1台伺服器上)
伺服器負載一致居高不下,升級過硬體以後有好轉,CPU和記憶體的有所緩解,不過磁碟IO的依然如故;
使用nmon查看由多塊磁碟組成一個LVM分割區,寫一直是100%;
使用lsof查看,該分區的主要讀寫的是MySQL和Redis;
使用iotop查看io排行,前幾個分別是:
[jbd2/dm-0-8]
[flush-253:0]
[redis]
[mysql]
對前2個進程不太了解,有沒有那位比較熟悉的大神指點下,前2個進程的用途以及他們和Redis的IO優化建議;
排查這個問題從三方面考慮:
1、應用層
redis 狀態監控,看是否有應用效能問題
mysql 狀態監控,查看慢查詢日誌等相關的問題點
2、系統層
flush-253:0 和 jbd2/dm-0-8 他們都是作業系統真對磁碟和檔案系統的進程,本質上來說還是 應用層產生的系統操作。
3、硬體
查看磁碟狀態,伺服器硬體問題
redis io高的問題我遇到過,和rdb方式存盤有關
redis預設配置
save 900 1
save 300 10
save 60 10000
以上表示的意思是,
900秒之內對服務進行了至少一次修改或
300秒之內伺服器進行了至少10次修改或
60秒之內對伺服器進行了至少10000次修改
會觸發一次存盤.
rdb方式是會將主進程fork一個子進程,然後將子進程的資料全部存到磁碟上,注意是全部.
也就是說,比如你有一個redis佔用了10G內存,那麼每隔最多900秒,這10G內存裡的數據會全部存到磁盤上,如果你的設備io能力比較差,或者redis數據量還要更大,那麼會出現在一個存盤週期裡無法完成存盤操作,這樣的話,就會一直存盤,就會引發io高.
解決的辦法可以
1延長redis盤的週期.
2 對redis進行切分,單一redis進程不要保存太多資料.
3 嘗試使用aof方式.