Linuxでは、ハードディスクのタイムアウト(操作を中止しようとする)を無効にできます。

Linuxでは、ハードディスクのタイムアウト(操作を中止しようとする)を無効にできます。

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

最後に、これが発生したときに私のストレージ(LinuxとFreeBSD)で接続に問題があり、1時間以上機能しない2つのVMが稼働していました。ストレージ自体は問題なくエラーもなく、接続を修正した後、仮想マシン(やはり停止しているように見える)が再び機能するようでした。

ただし、Linux仮想マシンは要求を中断することを決定し、システムを使用できなくなりました(ほとんどのディレクトリにある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仮想マシンはエラーを記録せずに正常に動作しました。明らかにFreeBSDだけが期待どおりに機能し、何も中断しません(FreeBSDシステムで同様のカーネルメッセージを見たようですが)。

タイムアウト後にカーネルが保留中の書き込み要求を終了する理由がわかりません。場合によってはこれは意味があるかもしれませんが、私の場合は確かにそうではありません。実際には不要なリスクです(タイムアウトがなければ、接続が復元された後にLinux VMが正常に継続し、すべてが再び正常に機能します)。

固定ハードディスクのLinuxカーネルタイムアウト(vm)を無効にする方法は?


編集する:

Linux仮想マシンには、通常の(SCSIタイプの)物理ドライブのように見えるハードドライブ(/ dev / sda)が1つしかありません。
lspci はこのコントローラーをリストします: "SCSI Storage Controller [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

答え1

タイムアウトが見つかりました。ほとんどのシステムでは、デフォルトのタイムアウトは30秒です。これが関連するタイムアウトであるかどうかはわかりませんが、いくつかのVMでタイムアウトを増やしてシステムに負荷をかけていましたが、これまでVMでハードディスクのタイムアウトが発生していませんでした。

また、一部のコメントでは、仮想マシンで構成したハードドライブについて混乱を表明し、その情報を質問に追加しました。また、複数のLinux仮想マシンが同時に実行されているため、1つの仮想マシンでのみエラーは発生しません。

タイムアウト設定(例/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で発生したタイムアウトであることを確認できませんでした(またはこれがただタイムアウト)、しかしシステムを高負荷(ハードドライブタイムアウトを引き起こす負荷タイプ)に置き、ハードドライブタイムアウトがまだ発生していないことを考慮すると(ネットワークタイムアウトは以前と同じですが)、これは少なくとも解決策の一部ですそうです。

関連情報