问题描述
我们可以通过cat /sys/block/zram0/mm_stat
来查看某个ZRAM区块的使用情况
这条命令运行后会得到这样一组数据
1007837184 266412961 281042944 0 392597504 28298 1341647 16923 0 0
按照Linux内核官方文档,这组数据的含义是
The stat file represents device's mm statistics. It consists of a single
line of text and contains the following stats separated by whitespace:
orig_data_size uncompressed size of data stored in this disk.
This excludes same-element-filled pages (same_pages) since
no memory is allocated for them.
Unit: bytes
compr_data_size compressed size of data stored in this disk
mem_used_total the amount of memory allocated for this disk. This
includes allocator fragmentation and metadata overhead,
allocated for this disk. So, allocator space efficiency
can be calculated using compr_data_size and this statistic.
Unit: bytes
mem_limit the maximum amount of memory ZRAM can use to store
the compressed data
mem_used_max the maximum amount of memory zram have consumed to
store the data
same_pages the number of same element filled pages written to this disk.
No memory is allocated for such pages.
pages_compacted the number of pages freed during compaction
huge_pages the number of incompressible pages
dup_data_size deduplicated data size
meta_data_size the amount of metadata allocated for deduplication feature
也就是说
第一个数据是ZRAM中存储的数据在压缩前的大小
第二个数据是这些数据在压缩后的大小
第三个数据是这些数据实际占用的大小(包括一些页面头部之类的)
我们也可以找到别人利用这组数据计算内存压缩率的方式,可以证明我们上方对这些数据含义的推测并没有错误
但是有一个非常严肃的问题。。。
# cat /sys/block/zram0/mm_stat
300363776 90120915 98947072 0 125665280 3713 49318 2138 0 0
# cat /proc/swaps
Filename Type Size Used Priority
/dev/block/zram0 partition 2150396 302608 32758
也就是说。我们从/proc/swaps
读出来的zram占用更接近页面压缩前的大小而不是压缩后的??
所以zram的实际使用量应该是86MB而非/proc/swaps
中回报的295MB?
那么
这是在拿压缩前空间/总空间么😂
??????????????????????
问题解决
wloot:zram分区大小其实是按压缩前来算的,所以实际上可以把zram大小设置为大于物理内存容量也不会有问题
补充:arter97似乎也注意到了这一点。。所以我们一直在使用的检查ZRAM占用率的方式实际上是错误的。。。(这种方式只适用于不带压缩的swap,而非带压缩的ZRAM)