最近服務器反映很慢,查看服務器上的應用程序經常出現超時等等,而且還有時候出現卡死的情況,經過發現服務器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 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 %iowait 95
%util的值一直在增加,磁盤的利用率越來越高,說明對io操作越來越頻繁,對磁盤資源的使用越來越多,這與增加對於io操作的線程是一致的
如果 %util 已經 100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸
%iowait 大於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=單位是秒,表示測試的總時長
本文分享完畢,感謝支持點贊~~
