Temos um dispositivo zram de 80 GB definido em nosso host e dentro dele um sistema de arquivos ext4 de 170 GB:
echo 170G > /sys/block/zram0/disksize
echo 80G > /sys/block/zram0/mem_limit
/usr/sbin/mkfs.ext4 -q -m 0 /dev/zram0
/usr/bin/mount /dev/zram0 /var/zram
Este sistema de arquivos é usado por nosso aplicativo para acessar rapidamente grandes quantidades de dados efêmeros.
O tamanho do sistema de arquivos exibido df
corresponde ao tamanho do zram conforme relatado em/sys/block/zram0/disksize
Copiando os dados de teste para um sistema de arquivos vazio, verificamos que uma taxa de compactação de 2,2: 1 foi alcançada e, portanto, o sistema de arquivos é preenchido antes de atingirmos o limite de memória do zramfs. O /sys/block/zram0/orig_data_size
valor corresponde ao uso relatado pelo sistema de arquivos:
# expr `cat orig_data_size` / 1024 ; df -k /dev/zram0
112779188
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/zram0 175329308 112956600 62356324 65% /var/zram
No entanto, quando o aplicativo está sendo executado com dados ativos por um período mais longo, descobrimos que isso não corresponde mais.
# expr `cat orig_data_size` / 1024 ; df -k /dev/zram0
173130200
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/zram0 175329308 112999496 62313428 65% /var/zram
Agora, o sistema de arquivos relata um uso de aproximadamente 110 GB, mas o dispositivo zramfs relata 165 GB. Ao mesmo tempo, a memória do zramfs se esgota e o sistema de arquivos torna-se somente leitura.
Os números do zram confirmam que estamos obtendo uma taxa de compactação de 2,2: 1 entre orig_data_size e compr_data_size; no entanto,por que o sistema de arquivos mostra muito mais espaço livre que o dispositivo zram? Mesmo que este seja um espaço já alocado para reutilização pelo sistema de arquivos, não deveria ser reutilizado em vez de alocar novo espaço?
Os dados consistem em um grande número de pequenos arquivos que são adicionados e removidos em intervalos irregulares.
Responder1
A causa disso é que quando os arquivos são excluídos do sistema de arquivos ext4 que reside no dispositivo zram0, a memória não é liberada de volta para o sistema. Isso significa que, embora o espaço esteja disponível para uso do sistema de arquivos (a saída de df
), ainda há memória alocada (as estatísticas em /sys/block/zram0
). Como resultado, o uso de memória chega a 100% da alocação, embora o sistema de arquivos ainda esteja meio cheio devido a exclusões.
Isso significa que você ainda pode preencher o sistema de arquivos e novos arquivos não usarão tanto espaço de memória novo; no entanto, afeta negativamente a taxa de compressão.
A solução é montar o sistema de arquivos com as opções discard
e noatime
. As discard
liberações liberaram espaço no arquivo de volta para o dispositivo de memória e, como resultado, o uso nos dois corresponde novamente.