Resolução de problemas do desempenho de IO do disco fraco

1

Note que, embora essa questão seja um pouco específica do Redis, o principal problema é genérico: um processo leva tanto HDD IO para gravar largura de banda que outros processos não podem escrever nada . / em>

Nós temos uma VM Ubuntu dentro do host Xen XCP baseado em Ubuntu (instalado em dois HDDs no software RAID1). Essa VM está executando o servidor Redis sob um carregamento de aproximadamente 2K de comandos / s.

Problema: quando o servidor Redis diz BGREWRITEAOF , ele bloqueia seus clientes por cerca de 10 segundos.

Detalhes:

Somente a persistência do AOF é usada, nenhum RDB. O Redis é configurado para o arquivo AOF fsync uma vez por segundo.

Em BGREWRITEAOF Redis forks e faz todo o trabalho intensivo de disco no processo filho. Enquanto isso, o processo principal continua anexando dados ao seu arquivo AOF.

BGREWRITEAOF demora cerca de 10 segundos (1,5 GB de dados, velocidade de gravação em disco de 150 MB / s). O processo filho que está sendo reescrito consome toda a taxa de transferência de gravação do HDD IO.

O processo pai tenta fsync , leva mais de dois segundos, a proteção de dados entra em ação e o bloqueio de write é chamado, bloqueando o processo pai até que BGREWRITEAOF termine com o disco.

Aqui estão algumas informações e discussões detalhadas que me levam à interpretação acima de eventos.

Pergunta: Parece-me duvidoso que um processo possa receber tanto IO em disco que todo o resto esteja bloqueado. Existe algo que eu possa fazer no nível do sistema para consertar isso? Estou OK se BGREWRITEAOF demorar um pouco mais, desde que o processo pai tenha permissão para salvar seus dados enquanto a reescrita estiver ativa.

Por favor, note que estou ciente de soluções alternativas, como mover persistência AOF para escravo, usando no-appendfsync-on-rewrite redis config opção etc .; Esta questão é especificamente sobre como resolver o problema, não trabalhando em torno dele.

    
por Alexander Gladysh 30.10.2012 / 08:10

2 respostas

1

AFAICS você pode tentar alterar o agendador de I / O. Tente usar este comando:

echo cfq > /sys/block/$DEVICE/queue/scheduler

Onde $ DEVICE é o seu disco RAID1. Este comando instala o agendador 'Completely Fair Queuing' para o seu dispositivo.

    
por 30.10.2012 / 10:10
0

Sugiro alterar seu agendador de E / S e aplicar algumas técnicas de ajuste de luz. Embora eu não tenha um guia de ajuste abrangente, algumas das respostas e sugestões detalhadas nesta pergunta pode ajudá-lo também.

Considere alterar o elevador de E / S para prazo final ou o noop , e teste novamente. Você pode fazer essa alteração na hora usando a técnica detalhada em outra resposta. Adicione uma entrada ao comando do kernel do GRUB para tornar essa persistência entre as reinicializações (add: elevator=deadline )

Talvez alguns detalhes sobre o hardware subjacente ou a configuração do sistema host ajudem. Existe algum cache de gravação suportado por bateria ou por backup flash no subsistema de armazenamento? Isso pode fazer a diferença .

Finalmente, você pode experimentar algumas ferramentas de benchmarking / monitoramento de luz para ver o que está acontecendo. Se você tiver acesso a iostat , por exemplo, poderá executá-lo em outra janela de terminal enquanto testa seu aplicativo.

Por exemplo iostat -x 1 será executado com amostras de 1 segundo e fornecerá algumas indicações sobre velocidade de leitura / gravação, tempo de serviço de E / S e tempo de espera. Eu também gosto de collectl para este propósito.

    
por 30.10.2012 / 10:33