Ajuste os intervalos de limpeza do disco linux para evitar o bloqueio dos processos do usuário

5

Estou baixando arquivos em um cartão SD montado em um pi de framboesa usando o rtorrent, por volta de 6MB / s (limite de largura de banda). O processo do usuário não libera os dados em si, e o intervalo no qual o cache de disco é liberado depende dos valores do sysctl.

Usando o iostat e o nload, consigo ver a largura de banda da rede e os perfis de gravação em disco:

Disco:

20M/s .....x.....x....xx...
      .....x....xx....xx...
      ....xx....xx....xx...
0M/s  ....xx....xx....xx...

Rede:

5M/s  ..xxx....x.. x.....x.
      .xxxx...xx..xxx...xxx
0M/s  xxxxx...xxx.xxx...xxx

Aparentemente, o gravador de E / S está sempre em pausa durante a limpeza. É uma CPU de 4 núcleos com 3 núcleos permanentemente ociosos e a parte superior diz 100% iowait durante a limpeza.

Se eu fizer while true; do sync; sleep 1; done durante o download, o fluxo do disco será suave em 6MB a cada segundo. E o processo de download não é bloqueado, então a largura de banda é constante.

Eu posso obter o mesmo efeito com:

/proc/sys/vm/dirty_writeback_centisecs: com que frequência a descarga do cache de disco entra em ação - a unidade é de 100 segundos; padrão: 500

e /proc/sys/vm/dirty_expire_centisecs: quantos anos uma página deve ter para ser elegível para flush em centenas de segundos; padrão: 3000

Defini-las para 100 e 200, respectivamente, atinge o mesmo perfil nivelado de disco e a largura de banda de download constante.

Existe uma maneira de automatizar esse ajuste, ou seja, liberar o máximo de vezes possível para evitar a necessidade de bloquear o processo do gravador? Por exemplo, se a velocidade de download for de 1 MB / s, a descarga a cada 5 segundos provavelmente seria suficiente.

    
por patraulea 24.03.2016 / 22:01

1 resposta

4

O kernel do linux verificará ervery dirty_writeback_centisecs se você tiver páginas sujas mais antigas que dirty_expire_centisecs . Com as configurações padrão, ele verifica a cada 5 segundos as páginas sujas com mais de 30 segundos.

O kernel também tem um limite de memória suja. Quando esse limite é atingido, ele bloqueia todos os processos de gravação para evitar ter páginas muito sujas na RAM.

O que você deve ajustar é

  • vm.dirty_background_ratio : a quantidade de memória do sistema que pode ser preenchida com páginas sujas antes que o kernel comece a fluir para o disco em segundo plano.
  • vm.dirty_ratio : a memória máxima do sistema que pode ser preenchida com páginas sujas. Em seguida, o kernel bloqueia todas as solicitações de E / S até que tudo seja liberado para o disco.

Para não conseguir este comportamento, você precisa dizer ao kernel que ele deve conter pelo menos 30s * 6MB / s = 180MB. Você também precisa levar em conta a velocidade de gravação lenta do Raspberry Pi, porque durante o tempo necessário para liberar para o disco, mais páginas sujas serão gravadas na memória RAM.

Isso pode representar muita memória RAM para o Raspberry Pi, então você pode precisar baixar dirty_expire_centisecs . Esteja ciente de que o uso de valores pequenos pode prejudicar a capacidade de resposta do sistema, porque você quase obterá E / S síncrona.

Aqui está uma explicação mais completa de como isso funciona: link

    
por 14.02.2017 / 00:24