IO待機時間と再試行回数を減らして、OSが障害のあるドライブに継続的に書き込みを試行しないようにするにはどうすればよいですか?
私は、通常のSATAデスクトップハードドライブに顧客に貸し出されるデモコンテンツのコピーを作成するために使用するシステムを持っています。 SAS=を介して一度に多くのドライブを接続し、スクリプトを使用してそれらにコンテンツをコピーします。
ドライブが貸し出されているため、一部が破損して戻ってくることがありますが、それらが破損していることはわかりません。そのため、次にそのドライブがコピー操作で再利用されると、システムが再試行するときに他のドライブの速度が低下しますIOです。不良ドライブに気づいてそれを削除するまでに数時間かかることがあります。ドライブを削除すると、残りのドライブは通常の速度で書き込みを開始します。
不良ドライブを回復する必要はありません。私はそれらを取り除き、他のすべてを遅くしないようにする必要があります。
私はbadblocksとsmartmontoolsについても調査しており、書き込みを始める前にドライブの事前チェックを書き込むことを検討しています。
OS:Ubuntu Linux(12.04 lts)
以前にこの調整パラメータを使用したことはありませんが、問題のドライブの eh_timeout (エラー処理タイムアウト)を調整したい場合があります。
[root@localhost device]# cat /sys/block/sda/device/eh_timeout
10
[root@localhost device]#
上記は、sda
が10秒に設定されていることを示しています。 Red Hatナレッジベースから:
特定のストレージ構成(たとえば、多数のLUNを含む構成)では、SCSIエラー処理コードが、応答のないストレージデバイスにTEST UNIT READYなどのコマンドを発行するのに長い時間を費やす場合があります。 SCSIデバイスオブジェクトに新しいsysfsパラメータeh_timeoutが追加されました。これにより、SCSIエラー処理コードで使用されるTEST UNIT READYコマンドとREQUEST SENSEコマンドのタイムアウト値を設定できます。これにより、これらの応答しないデバイスのチェックに費やされる時間が短縮されます。 eh_timeoutのデフォルト値は10秒です。これは、この機能を追加する前に使用されたタイムアウト値でした。
モニター/sys/block/<dev>/stat
対象のデバイスについて、10番目のパラメーター(io_ticks)を比較します。
例、ticks = io_ticks - prev_ticks / seconds_deltatime / 10
これは、ディスクがディスクIOの待機に費やした使用可能な時間の割合です。
100%に近いのはもちろんチェックする価値があります。そうでなければ、本当に賢くなってすべてのディスクの平均と比較し、平均より上のディスクを選択します。
ブロックレイヤー統計のドキュメント を参照してください。
それ以外の場合は、Muninのようなものを使用してグラフ化します。 Muninがしきい値(90%など)を超えた場合や、グラフで示されているものが適切なアラート値である場合にアラートを出すことができます。
たとえば、/ dev/sdiを確認する必要があることを示す次の2つのMuninグラフを参照してください。この例では、/ dev/sdiが配列の一部である場合、そのために配列全体が影響を受けます。
週のグラフを見ると、/ dev/sdcも遅い可能性があることがわかります。
上記の/ dev/sdiが壊れていないことを追加する必要があります。これは、低速のディスク(実際にはエンタープライズグレードのSATAディスクのアレイに誰かが追加した緑色のディスク)であり、アレイの速度が低下しました。実際に障害が発生したディスクは、親指のように飛び出します。
要約すると、時間があればスクリプトを使用しますが、簡単な解決策が必要でサーバーへの接続が簡単だった場合、Muninは簡単でした。