測試伺服器IO
最近伺服器反映很慢,檢視伺服器上的應用程式經常出現超時等等,而且還有時候出現卡死的情況,經過發現伺服器I/O壓力很大,壓力來自硬碟的I/O訪問已經達到100%
最後原因是線上業務程式碼同一時間寫入導致伺服器硬碟I/O爆表了,我這裡紀錄一下為了方便各位和自己今後遇到此類問題能儘快解決
使用 top 命令來看一下實時檢視系統狀態資訊
[root@Mike-VM-Node-172_31_225_214 ~]# top
CPU狀態(CPU s): 使用者程序佔用比率、系統程序佔用比率、使用者的nice 優先順序程序佔用比率及空閒CPU資源比率等;
記憶體狀態 (Mem): 記憶體總量、使用量、空閒量等;
交換分割槽狀態( Swap):交換分割槽總量、使用量、空閒量等;
其中CPU狀態下的引數說明 :
- us:使用者態使用的CPU時間比
- sy:系統態使用的CPU時間比
- ni: 用做nice加權的程序分配的使用者態CPU時間比
- id:空閒的CPU時間比
- wa:CPU等待磁碟寫入完成時間
- hi:硬中斷消耗時間
- si:軟中斷消耗時間
- st:虛擬機器偷取時間
可以看到伺服器的wa(71.1%)特別高,IO等待所佔用的CPU時間的百分比,高過30%時IO壓力高,說明是磁碟IO有問題
我們使用 iostat 等命令繼續進行詳細分析,如果伺服器上沒有 iostat 要進行安裝如下
[root@Mike-VM-Node-172_31_225_214 ~]# yum install sysstat [root@Mike-VM-Node-172_31_225_214 ~]# iostat Linux 3.10.0-514.26.2.el7.x86_64 (Mike-VM-Node172_31_225_214.com) 11/03/2020 _x86_64_ (1 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.14 0.00 0.04 0.01 0.00 99.81 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn vda0.44 1.38 4.59 1786837 5940236 [root@Mike-VM-Node-172_31_225_214 ~]#
引數說明:
%user:CPU處在使用者模式下的時間百分比
%nice:CPU處在帶NICE值的使用者模式下的時間百分比
%system:CPU處在系統模式下的時間百分比
%iowait:CPU等待輸入輸出完成時間的百分比
%steal:管理程式維護另一個虛擬處理器時,虛擬CPU的無意識等待時間百分比
%idle:CPU空閒時間百分比
tps:該裝置每秒的傳輸次數,"一次傳輸"意思是"一次I/O請求"。多個邏輯請求可能會被合併為"一次I/O請求"。"一次傳輸"請求的大小是未知的
kB_read/s:每秒從裝置讀取的資料量
kB_wrtn/s:每秒向裝置寫入的資料量
kB_read:讀取的總資料量
kB_wrtn:寫入的總數量資料量;這些單位都為Kilobytes
使用iostat -x 1 10 命令檢視一下IO狀態
[root@Mike-VM-Node-172_31_225_214 ~]# iostat -x 1 10 Linux 3.10.0-514.26.2.el7.x86_64 (Mike-VM-Node172_31_225_214.com) 11/03/2020 _x86_64_ (1 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.13 0.00 0.04 97.01 0.00 99.82 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util vda 0.00 0.10 0.06 0.33 1.07 4.42 28.07 0.00 10.94 22.13 8.83 0.35 0.01 avg-cpu: %user %nice %system %iowait %steal %idle 1.00 0.00 4.00 95.00 0.00 0.00 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util vda 0.00 0.00 0.00 2140.00 0.00 8560.00 8.00 19.87 9.29 0.00 9.29 0.47 100.00
可以檢視 %util 100.00 %idle 99.82
%util的值一直在增加,磁碟的利用率越來越高,說明對io操作越來越頻繁,對磁碟資源的使用越來越多,這與增加對於io操作的執行緒是一致的
如果 %util 已經 100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁碟可能存在瓶頸
idle大於99% IO壓力已經到很極限,一般讀取速度有較多的wait
引數說明:
rrqm/s: 每秒進行 merge 的讀運算元目。即 rmerge/s
wrqm/s: 每秒進行 merge 的寫運算元目。即 wmerge/s
r/s: 每秒完成的讀 I/O 裝置次數。即 rio/s
w/s: 每秒完成的寫 I/O 裝置次數。即 wio/s
rkB/s: 每秒讀K位元組數。是 rsect/s 的一半,因為每扇區大小為512位元組
wkB/s: 每秒寫K位元組數。是 wsect/s 的一半
avgrq-sz: 平均每次裝置I/O操作的資料大小 (扇區)
avgqu-sz: 平均I/O佇列長度
rsec/s: 每秒讀扇區數。即 rsect/s
wsec/s: 每秒寫扇區數。即 wsect/s
r_await:每個讀操作平均所需的時間
不僅包括硬碟裝置讀操作的時間,還包括了在kernel佇列中等待的時間
w_await:每個寫操作平均所需的時間
不僅包括硬碟裝置寫操作的時間,還包括了在kernel佇列中等待的時間
await: 平均每次裝置I/O操作的等待時間 (毫秒)
svctm: 平均每次裝置I/O操作的服務時間 (毫秒)
%util: 一秒中有百分之多少的時間用於 I/O 操作,即被io消耗的cpu百分比
如果你想對硬碟做一個IO負荷壓力測試可以用 fio 命令,如果伺服器上沒有 fio 要進行安裝如下
[root@Mike-VM-Node-172_31_225_214 ~]# yum install -y fio
下面這命令將在指定目錄下,生成30個1G檔案,是多執行緒併發執行的
[root@Mike-VM-Node-172_31_225_214 /tmp]# fio -directory=/tmp/ -name=readtest -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=4k -size=1G -numjobs=30 -runtime=3 -group_reporting
numjobs=30 表示30個併發
-rw=可供選擇的有read單測讀write單測寫rw讀寫同時測randrw隨機讀寫同時測randread單測隨機讀randwrite單測隨機寫
-runtime=單位是秒,表示測試的總時長
本文分享完畢,感謝支援點贊~~