禍害阿里雲宕機3小時的IO HANG究竟是什麼?
本文來自微信公號“CSDN”(ID:CSDNnews),作者 | 王知無, 責編| 郭 芮。
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的虛擬機,內核信息為:
top命令
top命令提供了實時的對系統處理器的狀態監視。它將顯示系統中CPU最"敏感"的任務列表,該命令可以按CPU使用、內存使用和執行時間對任務進行排序,而且該命令的很多特性都可以通過交互式命令。
在Linux下,輸入`top` :

Tasks、Cpus、Mem和Swap分別代表了進程信息、CPU信息和內存信息。各個列表示的指標意義如下 :
PID進程id
USER進程所有者用户名
PR 優先級
NI nice值
VIRT進程使用的虛擬內存總量
RES進程使用的未被換出的物理內存大小
SHR共享內存大小
S 進程狀態S=睡眠T=跟蹤R=運行Z=殭屍進程D=不可中斷的睡眠進程
CPUcpu時間統計
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秒刷新一次。

如果提示沒有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秒鐘刷新一次。

我們可以看到,%util這個參數即代表磁盤繁忙程度。100%表示磁盤繁忙, 0%表示磁盤空閒。但是我們需要注意,磁盤繁忙程度並不意味着磁盤讀寫速度大小。
iostat是系統級別的監控指令,iostat給我們的展示結果揭示了我們當前服務器磁盤的繁忙程度,雖然有一定的指導意義,但是不能精確到進程級別,這時候我們就需要iotop了。
iotop命令
我們上文講到top命令,顧名思義,iotop代表io版本的top命令,使用起來簡單粗暴,直接在命令行敲下:iotop。

iotop命令可以按進程統計IO狀況,我們可以指導當前系統哪些進程在佔用IO,百分比是多少,佔用IO的進程是在讀,還是在寫,讀寫量是多少等信息。然後我們可以定位到具體的進程,查看進程詳情。
同樣個iotop命令有一個很像的命令叫做pidstat,參數很多。
例如:`pidstat -d` :

我們同樣可以看到每個進程的讀寫情況,然後定位到具體的線程去查看問題。
總結
在生產實踐中,實時監控我們的服務器IO情況至關重要,尤其是數據庫所在的服務器,它直接關係到我們的程序的讀寫速度、SQL的執行情況等。
服務器IO的情況是我們選擇服務器的重要考慮因素之一。IO變差,輕則寫入服務讀寫響應緩慢,重則導致大量進程長時間掛起,數據庫擁堵卡死,服務器嚴重卡頓,甚至宕機。
作者:王知無,阿里巴巴高級大數據開發工程師,先後在京東,阿里等大型互聯網公司從事大數據平台、實時計算和離線計算中間件和業務平台開發。自媒體人,業餘講師,希望為更多的互聯網開發人員提供最新和最熱的大數據方向的技術動態,技術前沿研究。