Reduza os tempos de repetição / espera de blocos ruins no Ubuntu

10

Como posso reduzir o tempo de espera de E / S e os tempos de nova tentativa para que o sistema operacional não tente gravar continuamente em uma unidade com falha?

Eu tenho um sistema que eu uso para fazer cópias de conteúdo demo que são emprestadas aos clientes em discos rígidos de desktop SATA comuns. Conectamos várias unidades ao mesmo tempo via SAS e copiamos o conteúdo para elas usando um script.

Como as unidades são emprestadas, ocasionalmente algumas voltam danificadas, mas eu não sei se elas estão danificadas; portanto, na próxima vez em que a unidade for reutilizada em uma operação de cópia, ela desacelera outras unidades à medida que o sistema tenta E / S novamente nessa unidade. Às vezes, pode levar horas até eu notar a unidade defeituosa e removê-la. Depois que a unidade é removida, o restante começa a gravar na velocidade normal.

Eu não ligo para recuperar as unidades defeituosas. Eu só preciso eliminá-los para que eles não diminuam o ritmo.

Também estou pesquisando badblocks e smartmontools e considerando a possibilidade de escrever uma pré-verificação nas unidades antes de começar a escrever.

Sistema operacional: Ubuntu Linux (12.04 lts)

Ryan Sorensen
fonte
O que há de errado com a verificação de dados SMART por meio de udisks/ smartmonctl? Um problema XY clássico aqui, acho.
Deer Hunter
2
Obrigado, vou pesquisar mais sobre smartmonctl. Na minha experiência, se os setores defeituosos ocorreram durante a última remessa, o status SMART mostra que a unidade ainda está boa e funciona bem até alguma parte aleatória durante a cópia e depois diminui para um rastreamento, afetando outras unidades até é removido.
21813 Ryan Sorensen
A pergunta não recebeu uma resposta direta; portanto, não sabemos se é possível no linux: como reduzir o tempo de espera de IO e os tempos de nova tentativa?
imz - Ivan Zakharyaschev
@ imz - IvanZakharyaschev unix.stackexchange.com/a/147304/25985 No entanto, o kernel registra esses erros; portanto, se tudo o que você quer fazer é capturar um disco com falha antes que ele se torne mais problema, você pode verificar os logs do sistema em intervalos regulares.
28914 goldilocks
@gol E se eu quiser pegá-lo mais rápido? Sem esperar, Deus sabe quanto tempo antes da operação de IO desbloquear relatando um erro? (Na verdade, estou tentando salvar os dados de um disco com erros, mas meu problema é semelhante: encontrar esses setores "errôneos" causa enormes atrasos. ... Talvez eu também possa seguir os conselhos e inventar uma maneira de alimente as informações do teste SMART para ddrescueque ele nem toque nos setores informados pela SMART.)
imz - Ivan Zakharyaschev

Respostas:

7

Eu não usei esse ajuste antes, mas você provavelmente deseja ajustar o eh_timeout (tempo limite de tratamento de erros) para a unidade em questão:

[root@localhost device]# cat /sys/block/sda/device/eh_timeout
10
[root@localhost device]# 

O exemplo acima mostra sdadefinido para 10 segundos. Da Base de Conhecimento da Red Hat:

Em certas configurações de armazenamento (por exemplo, configurações com muitos LUNs), o código de tratamento de erros SCSI pode gastar muito tempo emitindo comandos como TEST UNIT READY para dispositivos de armazenamento que não respondem. Um novo parâmetro sysfs, eh_timeout, foi adicionado ao objeto de dispositivo SCSI, o que permite a configuração do valor de tempo limite para os comandos TEST UNIT READY e REQUEST SENSE usados ​​pelo código de tratamento de erros SCSI. Isso diminui a quantidade de tempo gasto na verificação desses dispositivos que não respondem. O valor padrão de eh_timeout é 10 segundos, que era o valor de tempo limite usado antes da adição dessa funcionalidade.

Bratchley
fonte
Estou verificando isso agora. O Ubuntu não possui um eh_timeout, mas possui um arquivo de tempo limite que pode ser a mesma coisa. O valor padrão do Ubuntu parece ser 30 segundos. Irá reduzi-lo para 5 segundos e informar novamente.
Ryan Sorensen
1
Por curiosidade, qual foi o seu resultado?
Bratchley
Definir o sinalizador de tempo limite em 12.04 não pareceu fazer nada. Estou planejando atualizar um sistema de teste para 14.04 neste fim de semana porque ele tem eh_timeout (e também timeout).
Ryan Sorensen
@RyanSorensen, você teve a chance de ver se esse parâmetro funciona?
Nat
Não consegui modificar, eh_timeoutmas mudei timeoutpara realizar a tarefa em questão.
GuitarPicker
2

Monitore /sys/block/<dev>/statos dispositivos de seu interesse e compare o 10º parâmetro (io_ticks).

por exemplo, ticks = io_ticks - prev_ticks / seconds_deltatime / 10

Essa é a porcentagem de tempo disponível que o disco gastou aguardando o disco io.

Vale a pena verificar quase 100%, é claro, ou fique realmente esperto e compare-o com a média de todos os seus discos e escolha qualquer disco acima da média.

Veja a documentação estatística da camada de blocos .

Caso contrário, use algo como Munin e faça um gráfico. Você pode alertar Munin se ultrapassar um limite, por exemplo, 90% ou o que o gráfico mostrar for um bom valor de alerta.

por exemplo, veja estes dois gráficos de Munin mostrando que / dev / sdi precisa ser visualizado. Neste exemplo, se / dev / sdi fizer parte de uma matriz, toda a matriz sofrerá por causa disso.

Utilização do disco por dispositivo - por dia

Utilização de disco por dispositivo - por semana

Se você olhar o gráfico da semana, verá que / dev / sdc também pode ser lento.

Devo acrescentar que / dev / sdi acima não está quebrado, é apenas um disco lento (na verdade, um disco verde que alguém adicionou a uma matriz de discos sata de nível corporativo) que reduziu a velocidade da matriz. Um disco com falha real se destacaria como um polegar dolorido.

Em resumo, eu provavelmente usaria um script se tivesse tempo, mas Munin se quisesse apenas uma solução rápida e a conexão com o servidor era fácil.

Ian Macintosh
fonte
Obrigado! As informações sobre as estatísticas io no Linux são realmente novas e parecem ser úteis (para mim) nessas situações.
imz - Ivan Zakharyaschev 6/08/14