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

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


Introdução



Se você usa Linux, alguma vez já notou uma lentidão extrema - a ponto de algumas vezes deixar o sistema irresponsivo - ao copiar arquivos grandes, de alguns gigabytes, para mídias lentas, como pendrives USB (especialmente aqueles "genéricos", que oferecem baixa performance)? Se o seu computador é 64 bits e tem bastante memória RAM (8 GB ou mais), muito provavelmente já notou isso. Tanto é que até o Linus Torvalds já abordou esse problema [1], há alguns anos atrás; 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.

Antes de continuar, é preciso entender um pouco sobre alguns conceitos do gerenciamento de memória do Linux. Não vou entrar em muitos detalhes, pois este não é um artigo acadêmico, mas no final colocarei algumas referências para quem quiser se aprofundar mais.

Um primeiro conceito que deve ficar claro é: o Linux trabalha por padrão com buffered I/O. De forma simplificada, isso significa que as operações de escrita simplesmente copiam os dados para a memória RAM [2], e depois, em background, o kernel vai fazendo a escrita em si (flush) no dispositivo destino. Dado isto, entra o segundo conceito: dirty memory, que é justamente essa informação que está temporariamente na memória RAM, esperando ser escrita em um dispositivo de armazenamento.

Acontece que, quando copiamos muitos dados para uma mídia lenta, há um problema de bufferbloat, em que a fila de I/O requests fica gigantesca. Isso acarreta toda a lentidão, já que outras operações de I/O são também afetadas, além de outros efeitos colaterais.

Dentre as alternativas propostas para minimizar este problema, as mais simples envolvem ajustar os parâmetros relacionados à dirty memory do subsistema de Virtual Memory do kernel [3][4]. O objetivo é deixar a fila menor, definindo um threshold mais agressivo para o flush da dirty memory para o dispositivo (o daemon que controla isso é o "pdflush", para quem quiser se aprofundar).

    Próxima página

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

Compilação de Kernel baseado na versão 2.6 para o LTSP 4.2

Layer7 e compilação do kernel mole-mole com Conectiva 10

Gerência e criação de módulos do kernel

Como compilar o kernel Linux 2.6.31.1

Instalando Slackware 10.2 em HDs SATA

  
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