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.
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.
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.
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.