内存管理-45-zram-3-writeback
一、简介
zram 是一个基于内存的块设备, 通常用作压缩swap分区。页面被换出时不写到磁盘, 而是压缩后存在内存中,节省1/O并加速swap。
进程页面换出 --> zram压缩存储(在RAM中) --> 进程缺页时解压换回。
但是 zram 在内存压力下是有困境的,zram 本质还是占内存。当系统内存极度紧张时,越来越多的页被换到 zram,zram本身占用的内存也越来越大,系统没有多余内存, 但 zram 压缩后的内容占用着内存又无处可去。CONFIG_ZRAM_WRITEBACK 就是为了解决这个问题。
内核代码位置:
drivers/block/zram/ zram_drv.c //主逻辑, writeback_store()是写出入口 zram_drv.h zcomp.c //压缩引擎(1z4/zstd/lzo)
只要使能 CONFIG_ZRAM 就会编译住这些文件,使能 CONFIG_ZRAM_WRITEBACK 才具有完整功能。writeback 核心函数: zram_writeback_page() --> submit_bio()写到后备存储。
1. zram writeback 的功能
允许 zram 把冷页(long-lived/idlepages)从 zram 内存空间二次写出到一个真实的后备块设备(backing device), 通常是eMMC、UFS、SSD。
进程页面换出 --> zram压缩存储(RAM) --> 如果该页长期不被访问(冷页) --> zram writeback 写到 backing_dev(真实磁盘/flash) --> 释放zram槽位内存.
本质是: zram自己也有了一层 swap-out 能力。
2.关键接口(sysfs)
激活 zram writeback 需要手动配置:
echo /dev/sdX > /sys/block/zram0/backing_dev //1.指定后备设备(如 /dev/sda1 或 loop 设备) echo all > /sys/block/zram0/idle //2.触发idle页标记(标记一段时间没被访问的页) echo idle > /sys/block/zram0/writeback //3.触发writeback(把idle页写到 backing_dev) echo huge > /sys/block/zram0/writeback //4.也可以writeback被huge压缩的页(压缩没有收益的页直接写(出) cat /sys/block/zram0/bd_stat //查看writeback统计
3. writeback的对象
----------------------------------------------------------------------- 类型 触发条件 说明 ----------------------------------------------------------------------- idle 页 标记为idle后writeback 长期未访问的冷页,节省内存更有价值 huge 页 压缩后体积反而更大的页 不压缩直接写出到磁盘更合算 -----------------------------------------------------------------------
4. 读回路径
当进程再次访问已 writeback 的页时: 缺页异常 --> zram发现该槽位已writeback -->从backing dev读回 --> 重新压缩存入zram(或直接加载到内存) --> 进程恢复访问
5. 与传统swap区别
--------------------------------------------------------------- 维度 传统swap zram zram + writeback --------------------------------------------------------------- 存储介质 磁盘/flash RAM(压缩) RAM压缩+磁盘溢出 速度 慢(磁盘I/O) 快(内存访问) 热页快,冷页慢 内存占用 不占RAM 占RAM 冷页卸载到磁盘后释放RAM 适合场景 通用 内存受限设备 极度内存受限+有磁盘 ---------------------------------------------------------------
posted on 2026-04-22 09:50 Hello-World3 阅读(4) 评论(0) 收藏 举报
浙公网安备 33010602011771号