今天在折腾我的 NVIDIA Xavier NX 的边缘计算盒子的时候,发现在我执行 lsblk 命令的时候,在块设备列表下面,挂载有 zram 的设备,所以就花点时间去研究了下 zram 相关的技术,在学习的过程中,不断的对未知的知识进行探索,各个击破,融会贯通,这就是学习的过程,写教程分享,也是为了记录自己学习的过程,跟大家一起探讨;
带着学习的好奇心,我开始了我的 Zram 研究之旅;
在这之前,我们可能会对 swap 分区(交换分区)比较熟悉,类似 Windows 的虚拟内存,在我们的物理运行内存不足时,可以将磁盘中的一部分空间当成内存使用,将内存中暂时不用的数据存放到交换分区中;这个 swap 分区在 Jetson 刷机教程中磁盘格式化中已经设置过;
首先,Zram 是 linux 内存子系统(mm)中,内存支持的压缩三个组件之一;其他的两个分别是 zcache 和 zswap;这里就先不发散了,只介绍 Zram 相关的技术,其他的两个感兴趣的也可以自己去研究下;
Zram 是在 2014年 Linux 3.14 内核版本开始支持的,可以将 Zram 理解为内存的缓冲池,就是把物理内存的一部分空间划出来当成 Zram 块设备,然后把不常用的内存数据,通过压缩后再存放到 Zram 里,用到的时候,再把数据解压出来,通过损失一部分 CPU 的性能,换取一部分的内存空间。这里可以看到,Zram 是可以不依赖具体真实的 swap 设备,这里就是跟 swap 分区的区别,并且 Zram 是要比 swap 快,所以 Zram 更适合在嵌入式设备中使用。比如像 jetson 系列的边缘计算盒子中,当我们的内存不足时,就可以通过时间换空间的方式,不至于由于内存不足(OOM)导致程序执行崩溃;
由于 Zram 并没有改变内存运行模型的基本结构,还是只能利用 Linux 中的 Swap 的优先级能力,将 Zram 作为更高优先级 Swap 看待,由于这一运行机制,实际上 Zram 的设计可以比较灵活和简单,内存交换策略交给内存子系统处理,压缩算法交给压缩库,Zram 本身只需要实现块设备驱动的部分。【Jetson 中的 Zram 源码详解(2)中会讲解源码部分】
1)查看 Jetson 设备是否支持 zram,需要我们的盒子上的运行的 内核版本大于 3.14;
uname -a
2)查看当前内核版本是否支持 Zram,这里显示系统是支持 Zram 模块;
modinfo zram
3)查看内核模块是否启动,当前 Zram 模块已经启动;
lsmod | grep zram
如果 Zram 模块没有启动,那应该怎么启动呢?
1)新增 Zram 模块的配置文件;
/etc/modules-load.d/zram.conf
在配置文件中,增加 zram 即可,重启设备,这个只是将 zram 加载到内核模块,通过 lsblk 还是不能查看到 zram 的块设备信息;
2)新增 Zram 的块设备文件;
第一种:临时生效方法:
modprobe zram num_devices=1
这种开启设备的方式在重启之后就失效了;
第二种:重启后生效方法:
在 /etc/modprobe.d 目录下新增 zram.conf;
touch /etc/modprobe.d/zram.conf
在配置文件中,增加以下配置信息:
options zram num_devices=1
这种配置方式,在重启后生效;此时通过 lsblk 依然不能查看到 Zram 的块设备信息;
3)配置 Zram 文件系统;
在 /etc/udev/rules.d/ 目录下,新增 99-zram.rules;
touch /etc/udev/rules.d/99-zram.rules
在配置文件中,新增以下配置信息:
KERNEL=="zram0",ATTR{disksize}="7G",TAG+="systemd"
KERNEL
属性用于指明具体设备
ATTR
属性用于给设备传递参数
TAG
属性用于标记设备类型(设备由谁管理)
配置结束后,再次重启 Jetson 设备后,就可以通过 lsblk 查看到 zram0 的块设备信息了;到此时,只是配置了 zram 的块设备,还需要将 zram 配置成 swap;
4)配置 Zram 为 swap;
mkswap /dev/zram0
swapon /dev/zram0
设置成功之后,这里还需要设置成开启自启动,和 zram 块设备一样,这里还是通过 systemd 来进行管理;
在 /etc/systemd/system/ 目录下,新增 zram.service;
touch /etc/systemd/system/zram.service
在文件中新增:
[Unit]
Description=ZRAM
BindsTo=dev-zram0.device
After=dev-zram0.device
[Service]
Type=oneshot
RemainAfterExit=true
ExecStartPre=/sbin/mkswap /dev/zram0
ExecStart=/sbin/swapon -p 2 /dev/zram0
ExecStop=/sbin/swapoff /dev/zram0
[Install]
WantedBy=multi-user.target
重载配置文件;
systemctl daemon-reload
systemctl enable zram --now
查看 swap 状态;
swapon -s
1)启用 Zram 之后,查看 Zram 实际运行效果;
cat /sys/block/zram0/mm_stat
orig_data_size:压缩前大小 4096 Byte
compr_data_size:压缩后大小 74 Byte
mem_used_total:总内存消耗 12288 Byte
mem_limit:最大内存消耗限制 0 页
mem_used_max:历史最高内存用量 0 页
same_pages:相同可被压缩内存页 0 页
pages_compacted:历史从 Ram 压缩到 Zram 的页 0 页
huge_pages:无法被压缩的页 0 页
2)zramctl 工具查看
zramctl | grap zram0
zramctl --output-all | grep zram0
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。