A liberação em segundo plano no Linux ocorre quando há excesso de dados gravados pendentes (ajustável via / proc / sys / vm / dirty_background_ratio) ou é atingido um tempo limite para gravações pendentes (/ proc / sys / vm / dirty_expire_centisecs). A menos que outro limite seja atingido (/ proc / sys / vm / dirty_ratio), mais dados gravados podem ser armazenados em cache. Gravações adicionais serão bloqueadas.
Em teoria, isso deve criar um processo em segundo plano, escrevendo páginas sujas sem perturbar outros processos. Na prática, isso perturba qualquer processo que faça leitura não armazenada em cache ou gravação síncrona. Seriamente. Isso ocorre porque a liberação em segundo plano na verdade grava na velocidade de 100% do dispositivo e qualquer outra solicitação de dispositivo nesse momento será atrasada (porque todas as filas e caches de gravação na estrada são preenchidos).
Existe uma maneira de limitar a quantidade de solicitações por segundo que o processo de liberação executa, ou priorizar efetivamente outras E / S de outros dispositivos?
fonte
Respostas:
Após muitos testes comparativos com o sysbench, chego a esta conclusão:
Para sobreviver (em termos de desempenho) a uma situação em que
basta despejar todos os elevadores, filas e caches de páginas sujos. O local correto para páginas sujas está na RAM desse cache de gravação de hardware.
Ajuste dirty_ratio (ou novos dirty_bytes) o mais baixo possível, mas fique de olho na taxa de transferência seqüencial. No meu caso particular, 15 MB foram ótimos (
echo 15000000 > dirty_bytes
).Isso é mais um hack do que uma solução, porque agora gigabytes de RAM são usados apenas para cache de leitura, em vez de cache sujo. Para que o cache sujo funcione bem nessa situação, o descarregador em segundo plano do kernel do Linux precisará calcular a velocidade com que o dispositivo subjacente aceita solicitações e ajustar a descarga em segundo plano de acordo. Díficil.
Especificações e referências para comparação:
Testado ao
dd
inserir zeros no disco, o sysbench mostrou enorme sucesso , aumentando 10 threads de gravações fsync em 16 kB de 33 a 700 IOPS (limite de inatividade: 1500 IOPS) e um thread único de 8 a 400 IOPS.Sem carga, os IOPS não foram afetados (~ 1500) e a taxa de transferência foi ligeiramente reduzida (de 251 MB / s para 216 MB / s).
dd
ligar:para sysbench, o test_file.0 foi preparado para não ser comparado com:
chamada sysbench para 10 threads:
chamada sysbench para um thread:
Blocos menores mostraram números ainda mais drásticos.
--file-block-size = 4096 com 1 GB dirty_bytes:
--file-block-size = 4096 com 15 MB dirty_bytes:
--file-block-size = 4096 com 15 MB dirty_bytes no sistema ocioso:
sysbench 0.4.12: benchmark de avaliação de sistema multiencadeado
Sistema de teste:
Em resumo, agora tenho certeza de que essa configuração terá um bom desempenho em situações ociosas, com carga alta e até com carga total para o tráfego do banco de dados que, de outra forma, teria passado fome pelo tráfego seqüencial. A taxa de transferência seqüencial é superior a dois links de gigabit, de qualquer maneira, portanto, não há problema em reduzi-la um pouco.
fonte
dirty_bytes
, mal deve ser alto o suficiente para não travar as CPUs enquanto os processos estão gravando, se o processo estiver gravando em média com a taxa de transferência do dispositivo. Se o código do seu aplicativo estiver realizando ciclos de computação enorme seguidos da gravação de uma quantidade enorme de dados, será muito difícil otimizar porque as médias de tempo curto diferem muito das médias de tempo longo. A solução correta seria ajustar asdirty_bytes
configurações específicas do processo , mas o Linux não suporta essas coisas, tanto quanto eu sei.Embora o ajuste dos parâmetros do kernel tenha parado o problema, é possível que seus problemas de desempenho tenham resultado de um bug no controlador Adaptec 5405Z que foi corrigido em uma atualização de firmware de 1 de fevereiro de 2012. As notas de versão dizem "Corrigido um problema em que o firmware podia travar durante um alto estresse de E / S". Talvez espalhar a E / S como você fez foi suficiente para impedir que esse bug fosse acionado, mas isso é apenas um palpite.
Aqui estão as notas de versão: http://download.adaptec.com/pdfs/readme/relnotes_arc_fw-b18937_asm-18837.pdf
Mesmo que esse não seja o caso da sua situação específica, achei que isso poderia beneficiar os usuários que se depararem com esta postagem no futuro. Vimos algumas mensagens como as seguintes em nossa saída dmesg, que finalmente nos levaram à atualização do firmware:
Aqui estão os números de modelo dos controladores Adaptec RAID listados nas notas de versão do firmware que possui a correção de interrupção de E / S alta: 2045, 2405, 2405Q, 2805, 5085, 5405, 5405Z, 5445, 5445Z, 5805, 5805Q, 5805Z, 5805ZQ, 51245, 51645, 52445.
fonte
Um kernel que inclui "WBT":
O WBT não requer mudança para a nova camada de blocos blk-mq. Dito isto, ele não funciona com os planejadores de E / S CFQ ou BFQ. Você pode usar o WBT com os planejadores deadline / mq-deadline / noop / none. Acredito que ele também funcione com o novo agendador de E / S "kyber".
Além de dimensionar o tamanho da fila para controlar a latência, o código WBT limita o número de solicitações de write-back em segundo plano como uma proporção do limite da fila calculado.
A configuração de tempo de execução é na
/sys/class/block/*/queue/wbt_lat_usec
.As opções de configuração de compilação a serem procuradas são
Sua declaração do problema é confirmada 100% pelo autor do WBT - muito bem :-).
fonte
Qual é a sua média para Dirty em / proc / meminfo? Normalmente, isso não deve exceder o seu / proc / sys / vm / dirty_ratio. Em um servidor de arquivos dedicado, o dirty_ratio está definido como uma porcentagem muito alta de memória (90), pois nunca a excederá. Sua sujeira_ração é muito baixa, quando você a atinge, tudo estraga, aumente.
fonte