O tempo limite do disco rígido pode ser desabilitado no Linux (tentativa de anulação da tarefa)

5

Infelizmente, quando um disco rígido (geralmente uma unidade virtual) está lento, o Linux interrompe as solicitações para essa unidade após um tempo limite, possivelmente causando corrupção de dados.

Última vez que isso aconteceu comigo, eu tinha 2 vms rodando (Linux e FreeBSD) em um armazenamento, que tinha problemas de conectividade e estava congelado por mais de uma hora. O armazenamento em si é bom, não há erros lá, e depois de corrigir a conexão, o vms (que obviamente também estava congelado) parecia estar funcionando novamente.

No entanto, o Linux vm tinha decidido abortar pedidos, tornando o sistema inutilizável (na maioria dos diretórios, o ls ficou preso, o mesmo aconteceu com o mount sem opções e muitas outras coisas não funcionaram mais); uma reinicialização foi necessária. Estes são os erros (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)

É interessante que o FreeBSD vm não tenha erros registrados e esteja funcionando bem. Então, aparentemente, apenas o FreeBSD funcionava como esperado, não abortando nada (embora eu ache que eu tenha visto mensagens do kernel similares em sistemas FreeBSD).

Eu não sei porque o kernel está matando pedidos pendentes de gravação depois de um tempo limite. Provavelmente faz sentido em alguns casos, mas certamente não no meu caso - é na verdade um risco desnecessário (sem esse tempo limite, o Linux teria continuado normalmente depois que a conexão tivesse sido restaurada, tudo teria funcionado de novo).

Como o tempo limite do kernel do Linux (vm) para discos rígidos congelados pode ser DESABILITADO?

Editar:

O Linux vm tem apenas 1 disco rígido (/ dev / sda), que deve se parecer com um disco físico normal (tipo SCSI) para ele.
O lspci lista este controlador: "Controlador de armazenamento SCSI [0100]: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI [1000: 0030] (rev 01)".

Aqui está outro exemplo (vm diferente, mesmo host, também Linux) (nesse caso, o armazenamento não foi removido, mas o host estava sobrecarregado):

[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

Editar:

E é assim que os erros de tempo limite aparecem em um sistema Debian / kBSD (kernel do FreeBSD) (mesmo host, mesma situação, diferente 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
    
por basic6 15.12.2014 / 21:44

1 resposta

6

Encontrei um tempo limite, que parece ter um padrão de 30 segundos na maioria dos sistemas. Eu não estou completamente certo de que este é o tempo limite relevante, mas eu o aumento em alguns vms, coloquei o sistema sob uma carga significativa e eu não tive nenhum timeout do hdd na vms até agora.

Além disso, alguns dos comentários estão expressando confusão sobre o disco rígido que eu configurei na VM, então adicionei essa informação à pergunta. E eu tenho vários Linux vms rodando ao mesmo tempo, então os erros não estão aparecendo em apenas uma única vm.

Configuração de tempo limite (por exemplo, em /etc/rc.local ):

Linux:

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

Se esse padrão ( sd? ) não corresponder ao seu hardware, pesquise os tempos limite e verifique-os manualmente:

find /sys/ -name timeout

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

sysctl kern.cam.da.default_timeout=86400

(Eu aumentei significativamente o tempo limite em vez de desativá-lo; se isso for o culpado, um valor mais apropriado poderá ser definido.)

Mais uma vez, não confirmei que este é exatamente o tempo limite em que meus vms estão sendo executados (ou que esse é o tempo limite somente ), mas dado que coloquei o sistema sob carga alta (o tipo de carga que costumava acionar os tempos limite do disco rígido) e nenhum tempo limite do disco rígido ocorreu ainda (embora os tempos limites da rede tenham, como antes), certamente parece que isso pode ser parte da solução.

    
por 06.01.2015 / 17:04