Por que a E / S pesada reduz meu servidor a um rastreamento?

4

Estou tentando solucionar um problema com E / S em meus discos. A configuração é a seguinte:

  • SO: CentOS 5.6
  • Layout do disco:
    • Discos ( /dev/sda , /dev/sdb )
    • Partição ( /dev/sda1 , /dev/sdb1 )
    • Matriz
    • MD (RAID-1) ( /dev/md0 )
    • Pilha LVM ( /dev/VolGrp00/RootLV )

Inicialmente, percebi que, ao executar uma E / S pesada (por exemplo, mkfs ), o sistema ficava lento, a tal ponto que eu não conseguia mover o ponteiro do mouse na minha sessão X. Eu comecei a registrar algumas métricas e vi que a média de carga iria subir lentamente, até acima de 5,0 no meu servidor dual-core. Ao mesmo tempo, a minha imagem de memória vai de quase 2 GB gratuitos para cerca de 10 MB livres e quase 2 GB de buffer. Com base nisso, suspeito que algum tipo de cache é o culpado, mas não estou familiarizado o suficiente com as porcas e parafusos do LVM, MD e o subsistema de E / S do Linux para saber onde começar a procurar.

Uma esquisitice que encontrei: não parece importar se eu remover a camada LVM e escrever diretamente na matriz, e mesmo remover a matriz não ajuda muito (embora escrever diretamente na partição pareça causar menos tempo rajadas de atrasos do que escrever para o array).

A maioria dos meus testes foi feita com o comando mkfs.ext4 -i 4096 -m 0 <device> , embora eu tenha testado esse comportamento com dd if=/dev/urandom bs=4K of=<device> e recebi resultados semelhantes, então tenho certeza que não é culpa do mkfs. Além disso, eu tentei isso em outro sistema (de outro fornecedor de hardware, mas ainda CentOS 5.6) e novamente ver resultados semelhantes.

Estou bem com qualquer solução que faça com que minhas operações de E / S demorem mais para serem concluídas, embora respostas como "usar o sinalizador de E / S direta" sejam inaceitáveis, pois fazem com que o mkfs passe de 10 minutos para 16 horas (Estive lá, tentei isso). Estou procurando por parâmetros de ajuste e também estou pensando em mudar os agendadores de E / S, mas achei que seria útil pedir orientação à comunidade na direção certa.

EDITAR:

Como se constata, o problema está mais relacionado à pressão da memória e ao gerenciador de memória virtual, que faz com que as solicitações de E / S sejam bloqueadas. Aqui está meu entendimento atual do problema: Como mkfs ou dd são executados, eles geram mais E / S do que os discos podem acompanhar, então o buffer começa a ser preenchido. À medida que o vm.dirty_ratio é atingido, as solicitações de E / S de todos os processos começam a ser bloqueadas até que o cache libere algum espaço ( source ). Ao mesmo tempo, condições de pouca memória acionam o kernel para iniciar a troca de processos da memória física para o disco ... isso gera ainda mais E / S e as solicitações de E / S podem ser bloqueadas enquanto aguardam o cache ser limpo. p>

Eu tentei ajustar vm.dirty_ratio e outros parâmetros relacionados, mas eles só mudam quando o sistema começa a desacelerar (menor relação = maior travamento). Eu também tentei trocar agendadores de I / O e ajustar seus parâmetros para tentar limpar o cache mais rápido, mas não tive sucesso. Como último recurso, tentei executar o mkfs com ionice -c3 , mas como os discos estão quase inativos no momento em que estou executando o mkfs , o mesmo problema se manifesta. Eu acho que a desaceleração poderia ser evitada se houvesse uma maneira de limitar a taxa de requisição de E / S de um processo específico, mas não tenho conhecimento de nada que possa fazer isso.

Eu definitivamente ainda estou aberto a sugestões sobre o que tentar - quem quer que me empurre na direção certa recebe a marca de seleção verde.

OUTRA EDIÇÃO:

Eu tropecei em grupos de controle , mas infelizmente só estão disponíveis a partir do RHEL6. Cgroups poderiam ser empregados para iniciar o mkfs em um grupo com estrangulamento de E / S, mas como esses sistemas devem permanecer 5.6 por enquanto eu terei que continuar procurando outra solução ou lidar com os problemas de lentidão até o momento do upgrade. / p>     

por Justin ᚅᚔᚈᚄᚒᚔ 14.07.2012 / 01:09

1 resposta

6

A partir dos poucos detalhes que você nos deu, parece-me que você precisa ajustar seu agendador de E / S. Isso pode ter um impacto significativo no efeito de bloqueio que você está enfrentando. Eu acredito que o CentOS 5.6 usa CFQ. Você pode ter menos bloqueio com prazo.

    
por 14.07.2012 / 04:09