I/O ハングは、時間のかかる I/O リクエストが原因でシステムが不安定になったり、ダウンしたりした場合に発生します。 I/O ハングを正確に検出するために、Alibaba Cloud Linux 2 と Alibaba Cloud Linux 3 はコアデータ構造を拡張し、低いシステムオーバーヘッドで I/O ハングを識別および検出できる機能を提供します。 このトピックでは、この機能のインターフェイスとインターフェイスの使用例について説明します。
インターフェイスの説明
インターフェイス | 説明 |
/sys/block/<device>/queue/hang_threshold | このインターフェイスを使用すると、I/O ハングのしきい値をクエリおよび変更できます。 しきい値の単位:ミリ秒。 デフォルト値:5000。 |
/sys/block/<device>/hang | このインターフェイスを使用すると、デバイスで I/O ハングのしきい値を超えた I/O 操作の数をクエリできます。 |
/sys/kernel/debug/block/<device>/rq_hang | このインターフェイスを使用すると、I/O ハングの詳細をクエリできます。 |
/proc/<pid>/wait_res | このインターフェイスを使用すると、プロセスが待機しているリソースに関する情報をクエリできます。 |
/proc/<pid>/task/<tid>/wait_res | このインターフェイスを使用すると、スレッドが待機しているリソースに関する情報をクエリできます。 |
次の表は、上記のインターフェイスの変数を示しています。
変数 | 説明 |
<device> | ブロックストレージデバイスの名前。 |
<pid> | プロセスの ID。 |
<tid> | スレッド ID。 |
例 1
/sys/block/<device>/queue/hang_threshold インターフェイスを呼び出して、I/O ハングのしきい値を変更できます。 この例では、しきい値は 5,000 ミリ秒から 10,000 ミリ秒に変更されます。
vdb ディスクの I/O ハングのしきい値を 10,000 ミリ秒に変更します。
echo 10000 > /sys/block/vdb/queue/hang_threshold変更結果を表示します。
cat /sys/block/vdb/queue/hang_threshold出力例:
10000
例 2
/sys/block/<device>/hang インターフェイスを呼び出して、ディスクで I/O ハングを引き起こす I/O 操作の数をクエリできます。 この例では、vdb ディスクが使用されます。
コマンド例:
cat /sys/block/vdb/hang出力例:
0 1 # 左側の値は、I/O ハングを引き起こす読み取り操作の数を示します。 右側の値は、I/O ハングを引き起こす書き込み操作の数を示します。例 3
/sys/kernel/debug/block/<device>/rq_hang インターフェイスを呼び出して、I/O ハングの詳細をクエリできます。 この例では、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 }}上記の出力は、I/O 操作の詳細を示しています。 io_start_time_ns は I/O リクエストの開始時刻を示し、このパラメーターには値が割り当てられています。 これは、I/O リクエストがタイムリーに処理されなかったことを示しており、I/O 時間が長くなります。
例 4
/proc/<pid>/wait_res インターフェイスを呼び出して、プロセスが待機しているリソースに関する情報をクエリできます。 この例では、577 プロセスが使用されます。
コマンド例:
cat /proc/577/wait_res出力例:
1 0000000000000000 4310058496 4310061448 # 1 はフィールド 1 の値、0000000000000000 はフィールド 2 の値、4310058496 はフィールド 3 の値、4310061448 はフィールド 4 の値です。次の表は、出力例の各パラメーターを示しています。
パラメーター | 説明 |
フィールド 1 | プロセスが待機しているリソースの種類。 値 1 は、ファイルシステム内のキャッシュページを示します。 値 2 は、ブロック I/O 層を示します。 |
フィールド 2 | プロセスが待機しているリソース(キャッシュページまたはブロック I/O 層)のアドレス。 |
フィールド 3 | プロセスがリソースの待機を開始した時刻。 |
フィールド 4 | ファイルが読み取られている現在の時刻。 フィールド 4 とフィールド 3 の差は、プロセスがリソースを待機するのにかかった時間です。 |