一、原因分析:
占用IO過高,可以做如下考慮:
1、首先考慮寫日志內容過多(或者訪問量較大)
1)日志打印的內容是否合理:前端應用服務器,要避免程序頻繁打本地日志、或者異常日志
2)日志級別是否合理
3)考慮異步寫日志(一般可以解決CPU鋸齒波動),為減少磁 盤IO操作,將日志寫如內存分區;但日志量太大,很容易將內存寫滿,再考慮將日志進行壓縮。
2、磁盤滿(壓測過程中現象:TPS降低,響應時間增加)
1)找到導致磁盤滿的大文件,合理的刪除,最好有定期清理腳 本,可以定期清理
2)對磁盤空間進行擴大磁盤容量
3)不好清理的,在主硬盤上進行讀寫操作,基礎數據定時移動到掛載硬盤上。
3、數據庫連接數超限制,導致sleep比較多,sleep任務太多的處理:
1)程序里每次連接數據庫后,記得關閉數據庫。
2)或者,在mysql配置文件中,設置mysql超時時間wait_timout, 默認是八小時,設置低一點
4、數據庫IO過高,查詢量大,可以進行讀寫分離(增加讀庫)或者分庫操作,減小磁盤壓力,調優一些buffer參數以降低IO寫的頻率
5、磁盤IO過高是由於讀寫文件導致的
1)可以利用raid來減輕壓力
6、磁盤本身性能不足
1)考慮更換新磁盤(性能強勁的)
二、常見定位問題的方法:
Linux系統出現了性能問題,一般我們可以通過top、iostat、iotop、free、vmstat等命令來查看初步定位問題。
今天我們講解就是iostat和iotop,定位問題的一般步驟:
Step-1】 iostat這個命令可以給我們提供豐富的IO狀態數據,一般我們先通過該命令來查看是否存在性能瓶頸
Step-2】用iotop找出io高的進程
1、iostat常見用法:
iostat -d -k 1 10 #查看TPS和吞吐量信息
參數 -d 表示,顯示設備(磁盤)使用狀態;
-k某些使用block為單位的列強制使用Kilobytes為單位;
1 10表示,數據顯示每隔1秒刷新一次,共顯示10次
iostat -d -x -k 1 10 #查看設備使用率(%util)、響應時間(await)
使用-x參數我們可以獲得更多統計信息。
注意】一般%util大於70%,I/O壓力就比較大,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸。磁盤可能存在瓶頸。
iostat還可以用來獲取cpu部分狀態值:
iostat -c 1 10 #查看cpu狀態
注意】idle小於70% IO壓力就較大了,一般讀取速度有較多的wait。
2、我們通過上面iostat的常用命令基本可以判斷IO是否存在瓶頸了,然后我們通過iotop命令來抓出罪魁禍首的進程,這里比較簡單直接輸入命令,然后執行(一般抓到的是java進程、mysqld,干的越多問題越多)
參考:https://blog.csdn.net/yw804909465/article/details/106758497