zram的writeback机制

前言

Patch

https://lore.kernel.org/all/1498459987-24562-1-git-send-email-minchan@kernel.org/

zRAM通过压缩pages来节省内存是非常有用的,但是有时候工作负载会变化并且系统可能有大量的不可压缩的pages,那么这些pages对于zRAM会非常的不友好。本patch支持zRAM的writeback机制只需要用户设置一个块设备并且进行一些设置,zRAM一旦发现pages是不可压缩(1/4 comp ratio压缩率)的那么就将其则写入到backing device,而不是保留该压缩内存在zRAM内存中。zRAM的writeback机制须要用户触发writeback_store才能进行回收。

writeback_store

writeback_limit_enable_store:
用于设置是否开启writeback limit功能,通过命令行echo 0 > /sys/block/zramX/writeback_limit_enable

writeback_limit_store:
用于设置writeback 到backing device的最大容量。

backing_dev_store:echo idle > /sys/block/zramX/writeback
用户可以在适当的时候触发writeback请求,执行该命令行后zram会将idle pages写入backing device。

writeback_store:
	首先做一些参数校验
		a)支持idle和huge两种writeback back的page,其他类型返回参数无效。
		b)判断是否存在backing_dev,是否初始化了zram。
	申请一个page用于后续writeback的操作。
	for循环遍历zram所有的page,对每一个index进行如下处理
		a)获取zram->wb_limit_lock锁,判断是否开启writeback limit enable
		b)申请bio操作,过滤掉一些已经在baking device的页,内容相同的页,正在回写的页。
		c)初始化bio结构体,设置同步写属性,setcor为512B,提交IO请求并同步等待。
		d)成功后zram_free_page释放掉从zsmalloc申请用于存储压缩page的内存。
		e)zram->bd_wb_limit减去1,该值表示剩余可写入backing device的page数量。

zram.rst

以下是整理的Document文档说明:
kernel-5.10/Documentation/admin-guide/blockdev/zram.rst:

需要开启配置项CONFIG_ZRAM_WRITEBACK,zram会将idle/huge page从内存中写回到backing device,以此来扩大可用内存。
设置backing device:
echo /dev/sda5 > /sys/block/zramX/backing_dev
开启huge page writeback特性(不可压缩):
echo huge > /sys/block/zramX/writeback
开启idle page(长时间未访问)writeback 特性:
echo all > /sys/block/zramX/idle ——对应idle_store
执行该命令行后,所有zram的page都被标记为idle了,该标记只有通过block.IOW请求访问时才会移除,否则会被一直标记为idle pages。
echo idle > /sys/block/zramX/writeback
用户可以在适当的时候触发writeback请求,执行该命令行后zram会将idle pages写入backing device。

对于如上两种writeback操作,如果flash有大量的写IO请求可能会出现写满的现象,故而需要用户去限制写入量。目前zram是支持“writeback_limit”功能的,“writeback_limit_enable”默认值是0表示关闭writeback limit功能。若值为1开启回写限制,此时不允许任何的writeback操作,用户可以通过写入/sys/block/zramX/writeback_limit来设置阈值。

举例:
如果用户想限制writeback每天写入400M,则需要如下步骤

    $ MB_SHIFT=20
    $ 4K_SHIFT=12
    $ echo $((400<<MB_SHIFT>>4K_SHIFT)) > \
            /sys/block/zram0/writeback_limit.
    $ echo 1 > /sys/block/zram0/writeback_limit_enable

若已经达到设置的阈值,想要扩大,在需要
$ echo $((400<<MB_SHIFT>>4K_SHIFT)) >
/sys/block/zram0/writeback_limit

若用户想查看剩余可writeback容量:
$ cat /sys/block/zramX/writeback_limit

若用户想关闭writeback limit功能
$ echo 0 > /sys/block/zramX/writeback_limit_enable
当echo 1 > /sys/block/zramX/reset或者是系统重启时writeback_limit计数会被重置。writeback发生多少次后需要扩大writeback的容量是用户需要关注的。

若用户想观察某段时间writeback计数,则可以通过/sys/block/zram0/bd_stat’s的第三列。

Memory tracking:
配置CONFIG_ZRAM_MEMORY_TRACKING选项则用户可以获取一些zram的信息。协同pagemap将有助于抓取zram的冷页或不可压缩页。通过/sys/kernel/debug/zram/zram0/block_state可以看到:
300 75.033841 .wh.
301 63.806904 s…
302 63.806919 …hi
第一列:zram的block index
第二列:访问时间,从设备启动后。
第三列:block的状态,
s:page数据为同一个值
w:已经写回backing device
h:不可压缩page
i:长时间不访问的page,冷页
300 75.033841 .wh.表示有第300个block在75.033841时间被访问,该次访问w和h类型page被写回到backing device了。

为什么会实现两种从backing device读取page的方式?
答:因为对于partial io,只能用同步IO,对于其他情况则可以异步读取以避免阻塞。

引用:
1,kerel-5.10源码
2,kernel-5.10/Documentation/admin-guide/blockdev/zram.rst

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值