Linux trava ao transferir arquivos via USB? Saiba como corrigir
Transferências para dispositivos externos lentos podem causar lentidão e travamentos. Entenda o motivo e como corrigir.
Atualizado em
Nos últimos dois anos, experimentei um problema muito estranho ao tentar transferir arquivos grandes — acima de 2 Gb — para dispositivos USB usando o Ubuntu Linux. No meio da transferência, o sistema começava a dar sinais de lentidão e, ao poucos, ficar impossível de utilizar até que o arquivo fosse completamente movido.
Dando uma rápida olhada no Monitor do Sistema do Gnome, era possível notar que a memória RAM nunca passava dos 30% e o uso do CPU, 30-40%. Não poderia ser um problema de hardware, já que nunca experimentei esse problema durante nenhuma outra atividade no PC. Então, depois de muita dor de cabeça, resolvi pesquisar se mais alguém estava passando pelo mesmo.
De acordo com este bug report no Launchpad, o problema seria — e eu vou fazer um resumo bem porco aqui, ok? — o excesso de cache na memória RAM em blocos (“dirty pages”) criados para evitar que grandes arquivos sejam corrompidos durante o processo de transferência no Linux. Esse processo, que roda em background, copia pequenas partes do arquivo para a memória RAM antes de realmente transferi-los para o pendrive ou disco rígido externo. É por isso que você não pode simplesmente remover o pendrive da entrada USB logo após uma transferência ser completada: o cache ainda está sendo escrito no dispositivo.
Resolver este problema é bem simples. Diminuir a taxa de dirty pages ajuda a memória a trabalhar melhor com a transferência de arquivos para dispositivos com velocidade de gravação muito lenta, mas você pode experimentar uma perda relativa de velocidade — nos meus testes, a diferença foi de ~12%, o que considero uma oscilação irrelevante, principalmente se a sua máquina tem um SSD.
O procedimento é o seguinte:
Passo 1: Abra o Terminal e cole o código a seguir.
sudo nano /etc/sysctl.conf
Se você não encontrar esse arquivo ou diretório, procure por um arquivo .conf
dentro de /etc/sysctl
. Dependendo da distribuição que você esteja usando, ele pode estar nomeado como 99-swap.conf
.
Passo 2: Uma janela do editor Nano irá abrir com o arquivo sysctl.conf
. Depois da última linha, acrescente o seguinte:
# Diminuir taxa de dirty pages
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
vm.dirty_expire_centisecs = 2000
Passo 3: Salve o arquivo com Ctrl+O, feche com Ctrl+X, e, ainda no terminal, cole o código abaixo para recarregar as configurações do sysctl
.
sudo sysctl -p
Você pode experimentar e modificar estes valores para números mais altos e analisar a diferença da performance no seu sistema, mas não recomendo diminuí-los ou deixá-los em zero — o que pode ocasionar travamentos em alguns aplicativos e até perda de dados.
Se tiver alguma dúvida ou sugestão sobre este bug ou algo que possa melhorar este texto, deixe um comentário abaixo e ajude outros usuários enfrentando o mesmo problema.