web-dev-qa-db-ja.com

Linuxでハードドライブのタイムアウトを無効にできますか(タスクの中止を試みます)

残念ながら、ハードドライブ(通常は仮想ドライブ)が遅い場合、Linuxはタイムアウト後にそのドライブへの要求を中止し、データが破損する可能性があります。

前回これが起こったとき、ストレージで2つの仮想マシン(LinuxおよびFreeBSD)を実行していましたが、接続の問題があり、1時間以上フリーズしていました。ストレージ自体は問題なく、そこにエラーはなく、接続を修正した後、vms(明らかにフリーズされていた)は再び機能しているように見えました。

ただし、Linux vmは要求を中止して、システムを使用不可にすることを決定しました(ほとんどのディレクトリのlsがスタックしたため、オプションなしでマウントしたため、他の多くのものが機能しなくなりました)。再起動が必要でした。これらはエラー(dmesg)です。

...
[86707.916728] Write(10): 2a 00 02 4c 9e 38 00 03 c0 00
[86707.916732] mptscsih: ioc0: task abort: SUCCESS (rv=2002) (sc=ffff880036865500)
[86707.916734] mptscsih: ioc0: attempting task abort! (sc=ffff880036866100)
[86707.916735] sd 2:0:0:0: [sda] CDB: 
[86707.916736] Write(10): 2a 00 02 4c a1 f8 00 03 c0 00
[86707.916739] mptscsih: ioc0: task abort: SUCCESS (rv=2002) (sc=ffff880036866100)
[86707.916741] mptscsih: ioc0: attempting task abort! (sc=ffff880036865c80)
[86707.916742] sd 2:0:0:0: [sda] CDB: 
[86707.916743] Write(10): 2a 00 02 4c a5 b8 00 03 c0 00
[86707.916746] mptscsih: ioc0: task abort: SUCCESS (rv=2002) (sc=ffff880036865c80)
[86707.916748] mptscsih: ioc0: attempting task abort! (sc=ffff880036864300)
[86707.916749] sd 2:0:0:0: [sda] CDB: 
[86707.916750] Write(10): 2a 00 02 4c a9 78 00 02 b0 00
[86707.916753] mptscsih: ioc0: task abort: SUCCESS (rv=2002) (sc=ffff880036864300)

FreeBSD vmにエラーが記録されておらず、正常に動作しているのは興味深いことです。どうやら、FreeBSDだけが期待どおりに機能し、何も中止しませんでした(ただし、FreeBSDシステムで同様のカーネルメッセージを見たと思います)。

タイムアウト後にカーネルが保留中の書き込み要求を強制終了する理由がわかりません。それはおそらくいくつかのケースでは理にかなっていますが、私のケースでは確かにそうではありません-それは実際には不必要なリスクです(そのタイムアウトがないと、接続が復元された後、Linux vmは正常に続行され、すべてが再び機能します)。

フリーズしたハードドライブのLinuxカーネルタイムアウト(vm)を無効にするにはどうすればよいですか?


編集:

Linux vmには1つのハードドライブ(/ dev/sda)のみがあり、通常の(SCSIタイプの)物理ドライブのように見えます。
lspciがこのコントローラーをリストします:「SCSIストレージコントローラー[0100]:LSI Logic/Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI [1000:0030](rev 01)」。

次に、別の例(異なるvm、同じホスト、Linuxも)を示します(この場合、ストレージは失われませんでしたが、ホストに大きな負荷がかかっていました)。

[1179039.664031] ata2: lost interrupt (Status 0x18)
[1179039.727188] ata2: drained 8 bytes to clear DRQ
[1179039.727272] ata2.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen
[1179039.740720] sr 1:0:0:0: CDB:
[1179039.740759] Get event status notification: 4a 01 00 00 10 00 00 00 08 00
[1179039.740768] ata2.00: cmd a0/00:00:00:08:00/00:00:00:00:00/a0 tag 0 pio 16392 in
         res 40/00:02:00:08:00/00:00:00:00:00/a0 Emask 0x4 (timeout)
[1179039.740770] ata2.00: status: { DRDY }
[1179039.748067] ata2: soft resetting link
[1179039.937757] ata2.00: configured for UDMA/33
[1179039.943435] ata2: EH complete

編集:

そして、これはDebian/kBSD(FreeBSDカーネル)システム(同じホスト、同じ状況、異なるvm)でのタイムアウトエラーの様子です。

mpt0: request 0xffffff80007305d0:62955 timed out for ccb 0xfffffe000a3bb800 (req->ccb 0xfffffe000a3bb800)
mpt0: request 0xffffff800072fa90:62956 timed out for ccb 0xfffffe000a3d1000 (req->ccb 0xfffffe000a3d1000)
mpt0: request 0xffffff8000726070:62962 timed out for ccb 0xfffffe000a428000 (req->ccb 0xfffffe000a428000)
mpt0: attempting to abort req 0xffffff80007305d0:62955 function 0
mpt0: completing timedout/aborted req 0xffffff8000726070:62962
mpt0: completing timedout/aborted req 0xffffff80007305d0:62955
mpt0: completing timedout/aborted req 0xffffff800072fa90:62956
mpt0: abort of req 0xffffff80007305d0:0 completed
mpt0: request 0xffffff8000726190:64136 timed out for ccb 0xfffffe000a3d1800 (req->ccb 0xfffffe000a3d1800)
mpt0: attempting to abort req 0xffffff8000726190:64136 function 0
mpt0: completing timedout/aborted req 0xffffff8000726190:64136
mpt0: abort of req 0xffffff8000726190:0 completed
mpt0: request 0xffffff8000721990:50970 timed out for ccb 0xfffffe00024bf800 (req->ccb 0xfffffe00024bf800)
mpt0: attempting to abort req 0xffffff8000721990:50970 function 0
mpt0: completing timedout/aborted req 0xffffff8000721990:50970
mpt0: abort of req 0xffffff8000721990:0 completed
mpt0: request 0xffffff80007279c0:61393 timed out for ccb 0xfffffe000a3cf000 (req->ccb 0xfffffe000a3cf000)
mpt0: request 0xffffff8000732550:61395 timed out for ccb 0xfffffe000a428000 (req->ccb 0xfffffe000a428000)
mpt0: attempting to abort req 0xffffff80007279c0:61393 function 0
mpt0: completing timedout/aborted req 0xffffff80007279c0:61393
mpt0: completing timedout/aborted req 0xffffff8000732550:61395
mpt0: abort of req 0xffffff80007279c0:0 completed
5
basic6

ほとんどのシステムではデフォルトで30秒に設定されているようですが、タイムアウトが見つかりました。これが適切なタイムアウトかどうかは完全にはわかりませんが、一部のVMでこれを増やして、システムに大きな負荷をかけ、VM内でこれまでHDDタイムアウトを設定していませんでした。

また、コメントのいくつかは、私がvmで設定したhddについて混乱を表しています。そのため、その情報を質問に追加しました。また、複数のLinux VMを同時に実行しているため、単一のVMだけにエラーが表示されるわけではありません。

タイムアウト設定(例:/etc/rc.local):

Linux:

TIMEOUT=86400
for f in /sys/block/sd?/device/timeout; do
    echo $TIMEOUT >"$f"
done

このパターン(sd?)がハードウェアと一致しません。タイムアウトを検索し、手動で確認してください:

find /sys/ -name timeout

Debian/kBSD(GNU/kFreeBSD 9.0-2-AMD64):

sysctl kern.cam.da.default_timeout=86400

(タイムアウトを無効にするのではなく、大幅に増やしました。これが原因であることが判明した場合は、より適切な値が設定される可能性があります。)

繰り返しますが、これは正確に私のVMが実行されているタイムアウトであること(またはonlyタイムアウトであること)を確認していませんが、システムを高負荷(種類hddタイムアウトをトリガーするために使用された負荷の1つであり、hddタイムアウトはまだ発生していません(以前のようにネットワークタイムアウトは発生していますが)、これは少なくとも解決策の一部であると思われます。

7
basic6