禍害阿里雲宕機 3 小時的 IO HANG 究竟是個什麼鬼?!

尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️

加入LINE好友

禍害阿裡雲宕機 3 小時的 IO HANG 究竟是個什麼鬼?!

作者 | 王知無

責編 | 郭 芮

2019年3月3日凌晨,微博炸鍋,有網友反映說阿里雲疑似出現宕機,華北很多互聯網公司受到暴擊傷害,APP、網站全部癱瘓,我自己的朋友圈和微信群里也有好友反饋,剛剛從被窩被叫起來去修Bug,結果發現服務器登不上去了……

凌晨2點37分,阿里雲官方回應稱:華北2地域可用區C部分ECS服務器等實例出現IO HANG,經緊急排查處理後逐步恢復,此外將根據協議盡快賠償。並已經全面排查其他地域及可用區,未發現此類情況。

IO HANG

那麼問題來了,IO HANG是個什麼鬼?簡單的說,就是服務器磁盤讀寫過慢,導致線程和進程掛起。大量讀寫線程/進程掛起導致服務器宕機……

阿里雲有大量的類似RDS、HybridDB數據庫,支持海量數據在線事務(OLTP)和在線分析(OLAP),需要大量的IO讀寫,而Linux的IO性能將直接影響SQL的執行速度,嚴重情況下將導致服務器卡死和宕機。

如何監控自己服務器的IO情況呢?本文將帶大家詳細了解這些常用的命令。

如何監控自己服務器的IO情況?

常用的命令包括:top,iostat和iotop。那麼他們都有什麼區別,以及如何使用呢?我們一一分解。

我本機安裝的是CentOS-7的虛擬機,內核信息為:

禍害阿裡雲宕機 3 小時的 IO HANG 究竟是個什麼鬼?!

top命令

top命令提供了實時的對系統處理器的狀態監視。它將顯示系統中CPU最”敏感”的任務列表,該命令可以按CPU使用、內存使用和執行時間對任務進行排序,而且該命令的很多特性都可以通過交互式命令。

在Linux下,輸入`top` :

禍害阿裡雲宕機 3 小時的 IO HANG 究竟是個什麼鬼?!

Tasks、Cpus、Mem和Swap分別代表了進程信息、CPU信息和內存信息。 各個列表示的指標意義如下 :

PID 進程id

USER 進程所有者用戶名

PR 優先級

NI nice值

VIRT 進程使用的虛擬內存總量
RES 進程使用的未被換出的物理內存大小

SHR 共享內存大小
S 進程狀態 S=睡眠 T=跟蹤 R=運行 Z=僵屍進程 D=不可中斷的睡眠進程
CPU cpu時間統計
MEM 物理內存占比
TIME+ 進程使用的CPU時間總計 單位1/100秒
COMMAND 命令行命令名

top常用的交互式命令使用格式:

top [-] [d] [p] [q] [c] [C] [S] [s] [n]

參數說明:

d:指定每兩次螢幕信息刷新之間的時間間隔,當然用戶可以使用s交互命令來改變之;

p:通過指定監控進程ID來僅僅監控某個進程的狀態;

q:該選項將使top沒有任何延遲的進行刷新。如果調用程序有超級用戶權限,那麼top將以盡可能高的優先級運行;

S:指定累計模式;

s:使top命令在安全模式中運行,這將去除交互命令所帶來的潛在危險;

i:使top不顯示任何閒置或者僵死進程;

c:顯示整個命令行而不只是顯示命令名。

通過top命令,我們即可查到當前服務器的進程占用CPU和內存情況。

iostat命令

iostat主要用於監控系統設備的IO負載情況,iostat首次運行時顯示自系統啟動開始的各項統計信息,之後運行iostat將顯示自上次運行該命令以後的統計信息。用戶可以通過指定統計的次數和時間來獲得所需的統計信息。

基本使用:

$iostat -d -k 2

參數說明:

-d:顯示設備(磁盤)使用狀態;

-k:某些使用block為單位的列強制使用Kilobytes為單位;

2:數據顯示每隔2秒刷新一次。

禍害阿裡雲宕機 3 小時的 IO HANG 究竟是個什麼鬼?!

如果提示沒有iostat命令需要使用yum安裝,安裝命令如下:

`yum install sysstat`

參數解釋如下:

tps:該設備每秒的傳輸次數,一次傳輸意思是「一次I/O請求」,多個邏輯請求可能會被合併為「一次I/O請求」;

kB_read/s:每秒從設備(drive expressed)讀取的數據量;kB_wrtn/s:每秒向設備(drive expressed)寫入的數據量;

kB_read:讀取的總數據量;

kB_wrtn:寫入的總數量數據量,這些單位都為Kilobytes。

上面的例子中,我們可以看到磁盤sda以及它的各個分區的統計數據,當時瞬時統計的磁盤總TPS是1.88,下面是各個分區的TPS(因為是瞬間值,所以總TPS並不嚴格等於各個分區TPS的總和)。

在實際業務中,我們經常使用的命令是:

iostat -xdm

例如:iostat -xdm 2,2代表2秒鐘刷新一次。

禍害阿裡雲宕機 3 小時的 IO HANG 究竟是個什麼鬼?!

我們可以看到,%util這個參數即代表磁盤繁忙程度。100%表示磁盤繁忙, 0%表示磁盤空閒。但是我們需要注意,磁盤繁忙程度並不意味著磁盤讀寫速度大小。

iostat是系統級別的監控指令,iostat給我們的展示結果揭示了我們當前服務器磁盤的繁忙程度,雖然有一定的指導意義,但是不能精確到進程級別,這時候我們就需要iotop了。

iotop命令

我們上文講到top命令,顧名思義,iotop代表io版本的top命令,使用起來簡單粗暴,直接在命令行敲下:iotop。

禍害阿裡雲宕機 3 小時的 IO HANG 究竟是個什麼鬼?!

iotop命令可以按進程統計IO狀況,我們可以指導當前系統哪些進程在占用IO,百分比是多少,占用IO的進程是在讀,還是在寫,讀寫量是多少等信息。然後我們可以定位到具體的進程,查看進程詳情。

同樣個iotop命令有一個很像的命令叫做pidstat,參數很多。

例如:`pidstat -d` :

禍害阿裡雲宕機 3 小時的 IO HANG 究竟是個什麼鬼?!

我們同樣可以看到每個進程的讀寫情況,然後定位到具體的線程去查看問題。

總結

在生產實踐中,實時監控我們的服務器IO情況至關重要,尤其是數據庫所在的服務器,它直接關係到我們的程序的讀寫速度、SQL的執行情況等。

服務器IO的情況是我們選擇服務器的重要考慮因素之一。IO變差,輕則寫入服務讀寫響應緩慢,重則導致大量進程長時間掛起,數據庫擁堵卡死,服務器嚴重卡頓,甚至宕機。