尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️
作者 | 王知無
責編 | 郭 芮
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=不可中斷的睡眠進程 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秒刷新一次。
如果提示沒有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變差,輕則寫入服務讀寫響應緩慢,重則導致大量進程長時間掛起,數據庫擁堵卡死,服務器嚴重卡頓,甚至宕機。