前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Jetson 中的 Zram 技术详解(1)

Jetson 中的 Zram 技术详解(1)

原创
作者头像
Librant
修改2024-07-07 20:03:30
1160
修改2024-07-07 20:03:30
举报
文章被收录于专栏:带你玩转Jetson系列教程

今天在折腾我的 NVIDIA Xavier NX 的边缘计算盒子的时候,发现在我执行 lsblk 命令的时候,在块设备列表下面,挂载有 zram 的设备,所以就花点时间去研究了下 zram 相关的技术,在学习的过程中,不断的对未知的知识进行探索,各个击破,融会贯通,这就是学习的过程,写教程分享,也是为了记录自己学习的过程,跟大家一起探讨;

Zram 设备
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)中会讲解源码部分】

二、Zram 使用

2.1 Zram 环境信息

1)查看 Jetson 设备是否支持 zram,需要我们的盒子上的运行的 内核版本大于 3.14;

代码语言:bash
复制
   uname -a

2)查看当前内核版本是否支持 Zram,这里显示系统是支持 Zram 模块;

代码语言:bash
复制
modinfo zram

3)查看内核模块是否启动,当前 Zram 模块已经启动;

代码语言:txt
复制
lsmod | grep zram

如果 Zram 模块没有启动,那应该怎么启动呢?

1)新增 Zram 模块的配置文件;

代码语言:txt
复制
/etc/modules-load.d/zram.conf

在配置文件中,增加 zram 即可,重启设备,这个只是将 zram 加载到内核模块,通过 lsblk 还是不能查看到 zram 的块设备信息;

2)新增 Zram 的块设备文件;

第一种:临时生效方法:

代码语言:bash
复制
modprobe zram num_devices=1

这种开启设备的方式在重启之后就失效了;

第二种:重启后生效方法:

在 /etc/modprobe.d 目录下新增 zram.conf;

代码语言:bash
复制
touch /etc/modprobe.d/zram.conf

在配置文件中,增加以下配置信息:

代码语言:txt
复制
options zram num_devices=1

这种配置方式,在重启后生效;此时通过 lsblk 依然不能查看到 Zram 的块设备信息;

3)配置 Zram 文件系统;

在 /etc/udev/rules.d/ 目录下,新增 99-zram.rules;

代码语言:bash
复制
touch /etc/udev/rules.d/99-zram.rules

在配置文件中,新增以下配置信息:

代码语言:txt
复制
KERNEL=="zram0",ATTR{disksize}="7G",TAG+="systemd"

KERNEL属性用于指明具体设备

ATTR属性用于给设备传递参数

TAG属性用于标记设备类型(设备由谁管理)

配置结束后,再次重启 Jetson 设备后,就可以通过 lsblk 查看到 zram0 的块设备信息了;到此时,只是配置了 zram 的块设备,还需要将 zram 配置成 swap;

4)配置 Zram 为 swap;

代码语言:bash
复制
mkswap /dev/zram0
swapon /dev/zram0

设置成功之后,这里还需要设置成开启自启动,和 zram 块设备一样,这里还是通过 systemd 来进行管理;

在 /etc/systemd/system/ 目录下,新增 zram.service;

代码语言:bash
复制
touch /etc/systemd/system/zram.service

在文件中新增:

代码语言:txt
复制
[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

重载配置文件;

代码语言:bash
复制
systemctl daemon-reload
systemctl enable zram --now

查看 swap 状态;

代码语言:bash
复制
swapon -s

2.2 Zram 监控

1)启用 Zram 之后,查看 Zram 实际运行效果;

代码语言:bash
复制
cat /sys/block/zram0/mm_stat
代码语言:txt
复制
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 工具查看

代码语言:bash
复制
zramctl | grap zram0
代码语言:bash
复制
zramctl --output-all | grep zram0

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、什么是 Zram?
  • 二、Zram 使用
    • 2.1 Zram 环境信息
      • 2.2 Zram 监控
      相关产品与服务
      边缘可用区
      腾讯云边缘可用区(TencentCloud Edge Zone,TEZ)是腾讯云的本地扩展,适用于解决计算、存储和服务可用性问题。腾讯云边缘可用区可为您带来云的诸多优势,例如弹性、可扩展性和安全性。借助腾讯云边缘可用区,您可以在靠近最终用户的地理位置运行对延迟敏感的应用程序,基本消除延迟问题。腾讯云边缘可用区提供与中心节点一致的体验,助力业务下沉,具备更低延时、更广覆盖、更少成本等特点。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档