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 가상 머신이 동시에 실행되고 있으므로 하나의 가상 머신에서만 오류가 나타나지 않습니다.

시간 초과 설정(예: /etc/rc.local):

리눅스:

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

이 패턴( sd?)이 하드웨어와 일치하지 않으면 시간 초과를 검색하여 수동으로 확인하십시오.

find /sys/ -name timeout

데비안/kBSD(GNU/kFreeBSD 9.0-2-amd64):

sysctl kern.cam.da.default_timeout=86400

(타임아웃을 비활성화하는 대신 대폭 늘렸습니다. 이것이 원인이라고 판명되면 보다 적절한 값을 설정할 수 있습니다.)

다시 말하지만, 이것이 정확히 내 VM에 발생한 시간 초과인지 확인하지 못했습니다(또는 이것이오직시간 초과), 하지만 시스템을 높은 부하(하드 드라이브 시간 초과를 유발하는 부하 유형)에 놓았고 하드 드라이브 시간 초과가 아직 발생하지 않았다는 점을 고려하면(네트워크 시간 초과는 이전과 같았지만) 이것이 적어도 해결책의 일부인 것 같습니다.

관련 정보