I/Oハングは、システムが不安定になったり、時間のかかるI/O要求のためにダウンしたりしたときに発生します。 I/Oハングを正確に検出するために、Alibaba Cloud Linux 2およびAlibaba Cloud Linux 3は、コアデータ構造を拡張して、低システムオーバーヘッドでI/Oハングを識別および検出できる機能を提供します。 このトピックでは、この機能のインターフェイスとインターフェイスの使用例について説明します。
インターフェイス説明
インターフェイス | 説明 |
/sys/block/<device>/queue/hang_threshold | このインターフェイスを使用すると、I/Oハングのしきい値を照会および変更できます。 しきい値の単位: ms。 デフォルト値: 5000。 |
/sys/block/<デバイス>/hang | このインターフェイスを使用すると、デバイスでハングしているI/Oのしきい値を超えるI/O操作の数を照会できます。 |
/sys/kernel/debug/block/<device>/rq_hang | このインターフェイスを使用すると、I/Oハングに関する詳細を照会できます。 |
/proc/<pid>/wait_res | このインターフェイスを使用すると、プロセスが待機しているリソースに関する情報を照会できます。 |
/proc/<pid>/task/<tid>/wait_res | このインターフェイスを使用すると、スレッドが待機しているリソースに関する情報を照会できます。 |
次の表に、上記のインターフェイスの変数を示します。
変数 | 説明 |
<デバイス> | ブロックストレージデバイスの名前。 |
<pid> | プロセスのID。 |
<tid> | スレッドID。 |
例 1
/sys/block/<device>/queue/hang_threshold
インターフェイスを呼び出して、I/Oハングのしきい値を変更できます。 この例では、閾値は5,000 msから10,000 msに変更される。
vdbディスクのI/Oハングのしきい値を10,000 msに変更します。
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 # The value on the left indicates the number of read operations that cause I/O hangs. The value on the right indicates the number of write operations that cause I/O hangs.
例 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, . r60c360c1500.8ffages | ELVPRIV | IO_ffAT | STATS, .state=in_flight, .tag=118, .internal_tag=67, .start_time_ns=1260981417094, io_59bio c.8. 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 is the value of Field 1, 0000000000000000 is the value of Field 2, 4310058496 is the value of Field 3, and 4310061448 is the value of Field 4.
次の表に、サンプル出力のパラメーターを示します。
パラメーター | 説明 |
フィールド1 | プロセスが待機しているリソースのタイプ。 値1は、ファイルシステム内のキャッシュページを示します。 値2は、ブロックI/O層を示す。 |
フィールド2 | プロセスが待機しているリソース (キャッシュページまたはブロックI/O層) のアドレス。 |
フィールド3 | プロセスがリソースを待ち始めた時刻。 |
フィールド4 | ファイルが読み取られている現在の時刻。 フィールド4とフィールド3の違いは、プロセスがリソースを待つのにかかる時間です。 |