Linux Virtual Memory Management e lentidão ao copiar arquivos grandes para mídia lenta

Se você usa Linux 64 bits e tem bastante memória RAM, alguma vez já notou uma lentidão extrema - a ponto de algumas vezes deixar o sistema irresponsivo - ao copiar arquivos grandes para mídias lentas, como pendrives USB? Até o Linus Torvalds já abordou esse problema, mesmo assim, ainda não há uma solução definitiva, mas existem tunings do subsistema de Virtual Memory do kernel do Linux que minimizam esse problema.

[ Hits: 10.486 ]

Por: Dorian Bolivar em 15/10/2016 | Blog: http://www.dorianbolivar.com


Procedimentos



Antes de experimentar os ajustes em questão, convém monitorar o seu sistema durante uma simulação, a fim de confirmar o problema. O sintoma mais óbvio é a lentidão, mas se você quiser ir mais a fundo, pode monitorar a quantidade de dirty memory com o seguinte comando:

# watch -n1 grep -e Dirty: /proc/meminfo

Enquanto monitora, copie um arquivo grande, de alguns gigabytes, para um pendrive (não vale aquele pendrive USB 3.0 de última geração, hein?). Observe a dirty memory aumentar assustadoramente, para alguns GBs, até que o pdflush entra em ação e começa a escrever os dados no dispositivo.

Percebeu que, aparentemente, a cópia rapidamente deu-se como concluída, mas na prática ela estava longe de terminar? Daí a importância de não remover o pendrive sem ejetar antes: podem haver muitos dados pendentes de escrita em background, e a operação de ejeção só vai concluir após eles estarem devidamente gravados.

Agora, vamos ao tuning: os parâmetros importantes aqui são "vm.dirty_background_bytes", "vm.dirty_background_ratio", "vm.dirty_bytes" e "vm.dirty_ratio". Na documentação do kernel você encontra uma explicação detalhada do que cada parâmetro faz [5], mas pelos nomes já dá para ter uma ideia. Só há um detalhe: os parâmetros com "bytes" e "ratio" são mutuamente exclusivos, ou seja, ajustando um, o outro automaticamente é desabilitado (ficando com valor 0). No meu sistema, os valores default são:
  • vm.dirty_background_bytes = 0
  • vm.dirty_background_ratio = 20
  • vm.dirty_bytes = 0
  • vm.dirty_ratio = 50

Perceba que até 50% da memória RAM total pode ser dirty! Vamos então ajustar os parâmetros para uma das recomendações, e ver o que acontece, repetindo a simulação:

# sysctl -w vm.dirty_background_bytes=16777216
# sysctl -w vm.dirty_bytes=50331648
# watch -n1 grep -e Dirty: /proc/meminfo

(repetir cópia do arquivo)

Bem diferente, não é? Sem contar que agora o indicador de progresso da cópia é mais confiável.

Outra opção, que dá resultados similares mas trabalha com percentuais da memória RAM, ao invés de valores absolutos em bytes, é:

# sysctl -w vm.dirty_background_ratio=5
# sysctl -w vm.dirty_ratio=10


Conclusão

Tal situação de "bufferbloat" é mais usual em desktops, onde é comum realizar a cópia de arquivos grandes para pendrives lentos, mas é também possível de acontecer, com cenários alternativos, em servidores, sendo importante conhecer o problema, a solução, e o que está por trás dela. Claro que os valores sugeridos no tuning são, como disse, recomendações; o ideal para o seu caso pode variar.

O que acho mais interessante em solucionar esses problemas é que, quando queremos ir além do básico, além da receita de bolo, aprendemos muito. Espero que também tenha sido sua percepção, e se quiser ir ainda além, é só explorar as referências.

Referências

[1] http://yarchive.net/comp/linux/dirty_limits.html
[2] http://lwn.net/Articles/682582/
[3] http://unix.stackexchange.com/questions/107703/why-is-my-pc-freezing-while-im-copying-a-file-to-a-pendrive/107722#107722
[4] http://askubuntu.com/questions/397249/system-freezes-unresponsive-unusable-when-copying-large-file-to-usb
[5] https://www.kernel.org/doc/Documentation/sysctl/vm.txt

Página anterior    

Páginas do artigo
   1. Introdução
   2. Procedimentos
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

A tecla mágica SysRQ

Compilando Kernel do Linux no Debian

Compilação do kernel v3.x no CentOS e Debian

Implementando um kernel GNU/Linux mais seguro

Compilando Kernel 2.6.34 usando Debian Lenny

  
Comentários
[1] Comentário enviado por JJSantos em 16/10/2016 - 20:49h

Favoritado.

[2] Comentário enviado por fernando-sales em 16/10/2016 - 22:04h

Favoritando...

---------------------------------------------
Blog: www.fernandosales.com.br

[3] Comentário enviado por morvan em 25/10/2016 - 16:37h

Boa tarde.
Excelente artigo, daqueles que costumam fazer valer sempre a pena visitar o VOL, à cata de informações valiosas.
Lembro também, Dorian Bolivar e demais articulistas, postantes e leitores em geral, que o Swapness também é responsável pelo gargalo no desempenho da máquina, uma vez que se trata de valor default, pensado também em uma máquina desktop padrão, default.
Seguindo os exemplos por você suscitados, lembro que o swapness pode ser controlado no próprio sysctl (comando e arquivo de configuração) e também, comandando:
echo n > /proc/sys/vm/swappiness
Sendo N valor abaixo de 60 (Sessenta). Isso mesmo. Valor bastante elevado, mas, como falei antes, default, para uma máquina padrão! Eu costumo utilizar 20 (vinte) e deixo-o já assinalado no
sysctl.conf
.

Morvan, Usuário GNU-Linux #433640. Seja Legal; seja Livre. Use GNU-Linux.

[4] Comentário enviado por removido em 18/01/2017 - 20:39h

Favoritado!

Estes dias estava pensando justo nestas lentidões, justo ao mover grandes arquivos ou muitos deles entre unidades (Imagens de instalação e backups).


Estava indo por outro caminho (Mudar o IO Scheduler¹ padrão, ou ajustar alguma configuração deste). Seu artigo me trouxe deu mais opções, além de informações uteis. Obrigado por enviá-lo.



¹
http://bit.ly/2iCQHbl
http://algo.ing.unimo.it/people/paolo/disk_sched/
https://wiki.archlinux.org/index.php/linux-ck#How_to_enable_the_BFQ_I.2FO_Scheduler


------------------------------------------------------
KISS principle, RTFM and STFW = 42


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts