问题描述

我们可以通过
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中存储的数据在压缩前的大小
第二个数据是这些数据在压缩后的大小
第三个数据是这些数据实际占用的大小(包括一些页面头部之类的)

0PUlh8.png
我们也可以找到别人利用这组数据计算内存压缩率的方式,可以证明我们上方对这些数据含义的推测并没有错误

但是有一个非常严肃的问题。。。

# 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)