我们的主机上定义了一个 80GB 的 zram 设备,其中有一个 170GB 的 ext4 文件系统:
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
我们的应用程序使用该文件系统来快速访问大量的临时数据。
显示的文件系统大小df
与报告的 zram 大小相匹配/sys/block/zram0/disksize
将测试数据复制到空文件系统中,我们验证了压缩率达到了 2.2:1,因此在达到 zramfs 内存限制之前文件系统已填满。该/sys/block/zram0/orig_data_size
值与文件系统报告的使用情况相匹配:
# 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
然而,当应用程序长期使用实时数据运行时,我们发现这不再匹配。
# 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
现在,文件系统报告使用量约为 110GB,但 zramfs 设备报告使用量为 165GB。同时,zramfs 内存已耗尽,文件系统变为只读。
zram 数据证实,orig_data_size 和 compr_data_size 之间的压缩比为 2.2:1;然而,为什么文件系统显示的可用空间比 zram 设备多得多? 即使这是文件系统已分配给重复使用的空间,难道不应该重复使用它而不是分配新的空间吗?
数据由大量不定期添加和删除的小文件组成。
答案1
造成这种情况的原因是,当文件从位于 zram0 设备中的 ext4 文件系统中删除时,内存不会释放回系统。这意味着,尽管空间可供文件系统使用(输出df
),但仍然分配有内存(统计信息/sys/block/zram0
)。因此,内存使用率上升到分配的 100%,尽管由于删除,文件系统仍然处于半满状态。
这确实意味着您仍然可以填充文件系统,并且新文件将不会使用太多的新内存空间;但是它确实会对压缩率产生负面影响。
解决方案是使用discard
和noatime
选项安装文件系统。discard
释放释放的文件空间并将其放回内存设备,结果两者的使用率再次匹配。