1. 程式人生 > 實用技巧 >測試伺服器IO

測試伺服器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狀態下的引數說明 :

  1. us:使用者態使用的CPU時間比
  2. sy:系統態使用的CPU時間比
  3. ni: 用做nice加權的程序分配的使用者態CPU時間比
  4. id:空閒的CPU時間比
  5. wa:CPU等待磁碟寫入完成時間
  6. hi:硬中斷消耗時間
  7. si:軟中斷消耗時間
  8. 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 vda
0.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=單位是秒,表示測試的總時長

本文分享完畢,感謝支援點贊~~