Pular para o conteúdo

Solucionando o problema de cache em dispositivos de armazenamento USB

O problema de cache em dispositivos de armazenamento USB é algo bastante comum e que pode ser frustrante para os usuários. Quando copiamos arquivos grandes para um pendrive ou HD plugado na USB, a cópia é feita rapidamente, mas ao tentarmos remover com segurança o dispositivo, é preciso esperar por um longo período.
Bruno Gonçalves Araujo bigbruno
Hits: 3.205 Categoria: Linux Subcategoria: Configuração
  • Indicar
  • Impressora
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Introdução

O problema de cache em dispositivos de armazenamento USB é algo bastante comum e pode ser frustrante para os usuários. Quando copiamos arquivos grandes para um pendrive ou HD plugado na USB, a cópia é feita rapidamente, mas ao tentarmos remover com segurança o dispositivo, é preciso esperar por um longo período.

Isso ocorre porque a cópia dos arquivos não diferencia a cópia em cache da cópia real para o outro dispositivo. O tamanho da cache varia conforme a quantidade de memória RAM livre, o que é bom para acelerar o sistema, mas pode ser inconveniente para dispositivos USB.

Ao longo dos anos, houve muitos relatos de usuários de várias distribuições Linux que não gostam desse comportamento. No entanto, reduzir a configuração de "dirty pages" para diminuir a cache pode também reduzir a velocidade do sistema como um todo, inclusive do armazenamento interno.

Fiz uma solução que está sendo utilizada no BigLinux, mas deve funcionar em todas as outras distribuições, chamei de usb-dirty-pages-udev, que detecta automaticamente dispositivos de armazenamento plugados na USB e estabelece a cache especificamente para eles em 16 MB, enquanto o restante do sistema continua com o sistema de cache padrão. Isso resolve o problema de espera prolongada para remover com segurança os dispositivos USB, sem afetar o desempenho geral do sistema.

Se a distribuição for instalada em um dispositivo USB, esse dispositivo não terá a redução de cache para 16 MB, mantendo o desempenho do sistema e o código completo pode ser visto aqui: https://github.com/biglinux/usb-dirty-pages-udev

Se você não está utilizando uma distribuição instalada em um dispositivo USB, que deve ser a situação de quase todos os usuários, é mais simples ainda, basta criar um arquivo de configuração do udev com esse conteúdo:

ACTION=="add", KERNEL=="sd[a-z]", SUBSYSTEM=="block", ENV{ID_USB_TYPE}=="disk", RUN+="/usr/bin/bash -c 'echo 1 > /sys/block/%k/bdi/strict_limit; echo 16777216 > /sys/block/%k/bdi/max_bytes'"
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Sugestão de pasta e nome para o arquivo: /etc/udev/rules.d/60-usb-dirty-pages-udev.rules

Vamos entender o que essa regra faz, ao plugar um dispositivo (add), é feira a verificação se o kernel vai criar algum dispositivo /dev/sda ou qualquer outro dispositivo em ordem alfabética até o /dev/sdz, verifica é o SUBSYSTEM é block e o ID_USB_TYPE é disk. Se o dispositivo corresponder a essas características, então serão executadas duas mudanças na configuração:

# echo 1 > /sys/block/%k/bdi/strict_limit

Esse comando ativa o limite de cache específico para esse dispositivo, lembre que %k é a identificação do dispositivo fornecida pelo udev, por exemplo, sda.

# echo 16777216 > /sys/block/%k/bdi/max_bytes'

Esse comando estabelece o limite de cache em RAM desse dispositivo em 16 MB, você pode alterar o valor para o que achar melhor.

Após salvar o arquivo pode atualizar as regras do udev sem precisar reiniciar com o comando:

udevadm control --reload-rules && udevadm trigger

Dica complementar 1: para você criar suas próprias regras do udev, utilize esse comando para ter informações do dispositivo, troque o endereço para o do dispositivo que for necessário, no exemplo irá verificar informações sobre o sda:

# udevadm info /sys/class/block/sda

Dica complementar 2: para monitorar o que ocorre com o udev ao conectar ou desconectar um dispositivo, utilize o comando:

# udevadm monitor

Dica complementar 3: venha fazer parte do BigLinux, criando automações e outras facilidades para o sistema.

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
   1. Introdução

Reduzindo problemas de atualizações no Debian, Ubuntu e derivados - Parte 2

BigBashView, interface gráfica para o seu shell script

Reduzindo problemas de atualizações no Debian, Ubuntu e derivados

Configurando o CACIC (parte 5)

Ativando e configurando a compactação de memória com Zram no Slackware

Balanceamento de 3 links com redundância no Linux

Instale uma distro dentro de outra

Bootsplash nos kernels 2.6.17.13 e 2.6.18 no Slackware 11

#1 Comentário enviado por fabio em 22/03/2023 - 17:11h
BigLinux tá bom demais! Parabéns pelo trabalho.
#2 Comentário enviado por bigbruno em 22/03/2023 - 17:15h

[1] Comentário enviado por fabio em 22/03/2023 - 17:11h

BigLinux tá bom demais! Parabéns pelo trabalho.


Obrigado, a tendência é esse ano ter várias melhorias, também estou mais próximo do pessoal do Manjaro, esse é o segundo pacote do Big que entra para o repositório deles.
#3 Comentário enviado por niquelnausea em 25/03/2023 - 10:36h

já vi tanta reclamação e perguntas em fóruns sobre este problema, finalmente conhecemos uma solução. parabéns.
#4 Comentário enviado por maurixnovatrento em 25/03/2023 - 16:09h

Vou ver como isso fica no slackware.

___________________________________________________________
Conhecimento não se Leva para o Túmulo.
https://github.com/mxnt10
#5 Comentário enviado por removido em 23/04/2024 - 16:31h

Sera que resolve o problema no Virtualbox (VM biglinux) com pendrive?

Contribuir com comentário

Entre na sua conta para comentar.