1. 程式人生 > 實用技巧 >kubernets之存活探針

kubernets之存活探針

最近伺服器反映很慢,檢視伺服器上的應用程式經常出現超時等等,而且還有時候出現卡死的情況,經過發現伺服器I/O壓力很大,壓力來自硬碟的I/O訪問已經達到100%。
  
最後原因是線上業務程式碼同一時間寫入導致伺服器硬碟I/O爆表了,我這裡紀錄一下為了方便各位和自己今後遇到此類問題能儘快解決。
  
使用 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 %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-iodepth1-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=單位是秒,表示測試的總時長。

如果你

①從事功能測試,想進階自動化測試

②在測試界混了1、2年,依然不會敲程式碼

③面試大廠卻屢屢碰壁

我邀你進群吧!來吧~~測試員,313782132(Q群裡有技術大牛一起交流分享,學習資源的價值取決於你的行動,莫做“收藏家”)獲取更多大廠技術、面試資料