IO hang是指在系統運行過程中,因某些IO耗時過長而引起的系統不穩定甚至宕機。為了準確檢測出IO hang,Alibaba Cloud Linux 2和Alibaba Cloud Linux 3擴充核心資料結構,增加了在較小的系統開銷下,快速定位並檢測IO hang的功能。本文主要介紹實現該功能的介面以及介面操作樣本。
介面說明
介面 | 描述 |
/sys/block/<device>/queue/hang_threshold | 該介面能夠查看和修改用於檢測IO hang的閾值,單位為ms,預設值為5000。 |
/sys/block/<device>/hang | 該介面能夠輸出對應裝置上超過IO hang閾值的讀寫IO個數。 |
/sys/kernel/debug/block/<device>/rq_hang | 該介面能夠擷取IO hang的詳細資料。 |
/proc/<pid>/wait_res | 該介面能夠擷取進程正在等待的資源資訊。 |
/proc/<pid>/task/<tid>/wait_res | 該介面能夠擷取線程正在等待的資源資訊。 |
以上介面中變數說明如下。
變數名 | 說明 |
<device> | Block Storage裝置名稱。 |
<pid> | 進程ID。 |
<tid> | 線程ID。 |
樣本一
您可以根據需求調用介面/sys/block/<device>/queue/hang_threshold
修改用於檢測IO hang的閾值。本樣本中將預設閾值5000 ms修改為10000 ms。
將磁碟vdb下的用於檢測IO hang的閾值修改為10000 ms。
echo 10000 > /sys/block/vdb/queue/hang_threshold
查看修改結果。
cat /sys/block/vdb/queue/hang_threshold
返回結果樣本。
10000
樣本二
您可以調用介面/sys/block/<device>/hang
查詢磁碟上產生IO hang的讀寫IO個數。本樣本查詢的磁碟為vdb。
查詢命令如下。
cat /sys/block/vdb/hang
返回結果樣本。
0 1 # 左邊參數表示產生IO hang的讀IO的個數,右邊參數表示產生IO hang的寫IO的個數
樣本三
您可以調用介面/sys/kernel/debug/block/<device>/rq_hang
擷取產生IO hang的詳細資料。本樣本中的磁碟為vdb。
查詢命令如下。
cat /sys/kernel/debug/block/vdb/rq_hang
返回結果樣本如下。
ffff9e50162fc600 {.op=WRITE, .cmd_flags=SYNC, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=118, .internal_tag=67, .start_time_ns=1260981417094, .io_start_time_ns=1260981436160, .current_time=1268458297417, .bio = ffff9e4907c31c00, .bio_pages = { ffffc85960686740 }, .bio = ffff9e4907c31500, .bio_pages = { ffffc85960639000 }, .bio = ffff9e4907c30300, .bio_pages = { ffffc85960651700 }, .bio = ffff9e4907c31900, .bio_pages = { ffffc85960608b00 }}
上述樣本顯示了IO的詳細資料,從資訊中擷取到IO請求開始時間io_start_time_ns
已被賦值。表明該IO請求未被及時處理,從而導致IO耗時過長。
樣本四
您可以調用介面/proc/<pid>/wait_res
擷取進程正在等待的資源資訊。本樣本所查詢的進程ID為577
。
查詢命令如下。
cat /proc/577/wait_res
返回結果樣本。
1 0000000000000000 4310058496 4310061448 #樣本值依次對應Field 1 Field 2 Field 3 Field 4
返回結果樣本中參數說明如下。
參數 | 說明 |
Field 1 | 等待的資源類型。1表示檔案系統中的快取頁面(page),2表示塊層bio。 |
Field 2 | 等待的資源(page/bio)地址。 |
Field 3 | 等待資源開始時間。 |
Field 4 | 讀取該檔案的目前時間,與Field 3的差值即為在該資源上等待的耗時。 |