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> | 塊存儲設備名。 |
<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的差值即為在該資源上等待的耗時。 |