zram是一个ram based block device,可以创建出/dev/zram<id>设备。写入这个内存磁盘设备的数据,会被自动压缩。可以使用这个设备作为swap backend或者/var中其他缓存文件的后备储存。
整个zram的包括三部分,一个是ram block device,一个是compressor负责压缩,最后是提供给用户空间的操作节点,如控制device的大小、压缩方法等。
zram block device
…
zram compressor
zram的compressor在每个cpu有独立stream object,每个核可以独立并行处理压缩过程。
zram的压缩算法定义在zcomp的显式list中,除了这个静态压缩算法列表,仍然可以设置crypto中存在的其他算法。
write back
CONFIG_ZRAM_WRITEBACK
目前zram已经支持增加后备磁盘设备,类似zswap,zram可以将idle或者不能压缩的page写入后备磁盘,以节省内存空间。
memory tracking
CONFIG_ZRAM_MEMORY_TRACKING
这个feature会增加block_state节点,可以dump出zram block device中,每个block的状态。
- /drivers/block/zram/zram_drv.c # zram block device
- /drivers/block/zram/zcomp.c # zram compress function
使能zram需要开启以下依赖:
CONFIG_ZRAM
depends on BLOCK && SYSFS && MMU
depends on CRYPTO_LZO || CRYPTO_ZSTD || CRYPTO_LZ4 || CRYPTO_LZ4HC || CRYPTO_842
通过num_devices来传入要创建的zram device数量
modprobe zram num_devices=4
动态添加、删除zram磁盘
cat /sys/class/zram-control/hot_add # 添加一块新盘
echo X > /sys/class/zram-control/hot_remove # 删除zramX
查看compressor stream数量(实际返回的是CPU数)
cat /sys/block/zram0/max_comp_streams
查看、设置压缩算法
cat /sys/block/zram0/comp_algorithm
echo lzo > /sys/block/zram0/comp_algorithm
设置zram磁盘大小
echo 1G > /sys/block/zram0/disksize
使用zram磁盘作为swap分区
mkswap /dev/zram0
swapon /dev/zram0
swapoff /dev/zram0
使用zram磁盘作为普通磁盘
mkfs.ext4 /dev/zram1
mke2fs -b 4096 -T ext4 /dev/zram1 (busybox)
mount /dev/zram1 /tmp
umount /dev/zram1
查看zram磁盘统计数据
cat /sys/block/zram<id>/stat
cat /sys/block/zram<id>/mm_stat
cat /sys/block/zram<id>/io_stat
cat /sys/block/zram<id>/bd_stat
重置zram磁盘
echo 1 > /sys/block/zram0/reset
Write back(CONFIG_ZRAM_WRITEBACK)
echo /dev/sda5 > /sys/block/zramX/backing_dev # 设置后备磁盘
...待完成
Dump zram磁盘中每个block的信息(CONFIG_ZRAM_MEMORY_TRACKING)
cat /sys/block/zram<id>/block_state
zram提供了一个前端操作工具:zramctl
zramctl -h
zram.rst