0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

zRAM内存压缩机制详解

Linux爱好者 来源:Linux内核那些事 2023-11-13 14:59 次阅读

内存是计算机系统最重要的资源之一,当操作系统内存不足时,进程申请内存将会失败,从而导致其运行异常或者崩溃。

Linux 内核提供swap机制来解决内存不足的情况,其原理是:

当系统内存不足时,内核会将进程不常用的内存交换(写入)到磁盘中,然后将这些内存归还给系统,系统可以将这些内存继续分配给其他需要使用内存的进程。

通过 swap 机制,系统可以将内存分配给需求更迫切的进程。但由于 swap 机制需要进行 I/O 操作,所以一定程度上会影响系统性能。那么是否存在一种能够节省内存,而且对性能影响较少的机制呢?

在 Linux-3.14 引入了一种名为zRAM的技术,zRAM 的原理是:将进程不常用的内存压缩存储,从而达到节省内存的使用。如下图所示:

16aca5c2-81ef-11ee-939d-92fbcf53809c.png

zRAM 机制建立在 swap 机制之上,swap 机制是将进程不常用的内存交换到磁盘中,而 zRAM 机制是将进程不常用的内存压缩存储在内存某个区域。所以 zRAM 机制并不会发生 I/O 操作,从而避免因 I/O 操作导致的性能下降。

zRAM原理

由于 zRAM 机制是建立在 swap 机制之上,而 swap 机制需要配置文件系统或块设备来完成的。所以 zRAM 虚拟一个块设备,当系统内存不足时,swap 机制将内存写入到这个虚拟的块设备中。也就是说,zRAM 机制本质上只是一个虚拟块设备。

zRAM 的原理如下图所示:

16cd491c-81ef-11ee-939d-92fbcf53809c.png

从上图可以看出,在开启了 zRAM 机制的情况下,当系统内存不足时,内核会进行如下操作:

通过 swap 机制从系统中查找一些进程不常用的内存。

将这些不常用的内存交换到 zRAM 块设备中,而 zRAM 块设备首先会对这些不常用的内存进行压缩,然后存储起来。

把不常用的内存压缩存储到 zRAM 块设备后,swap 机制会把这些不常用的内存归还给内核。

当进程访问到这些被交换到 zRAM 块设备的内存时,swap 机制将会通过 zRAM 块设备解压这些内存,并且重新建立与进程的地址映射关系。

启用zRAM

1. 创建 zRAM 块设备

要启用 zRAM,首先需要创建 zRAM 块设备。要创建 zRAM 块设备,可以使用以下命令:

modprobezramnum_devices=1

num_devices参数可以指定创建 zRAM 块设备的个数,上面命令创建了一个 zRAM 块设备,可以通过路径/dev/zram0来访问这个块设备。

2. 设置 zRAM 块设备的大小

创建完 zRAM 块设备后,可以通过以下命令来设置其空间大小:

echo512M>/sys/block/zram0/disksize

上面命令设置了zram0的大小为 512MB,也就是说,zram0能够存储 512MB 压缩后的数据。

3. 压缩算法选择

zRAM 机制支持多种压缩算法,不同的压缩算法有不同的压缩比率和压缩速度,用户可以按照自身的需求来选择不同的压缩算法。

要更改 zRAM 的压缩算法,可以使用下面命令:

echolzo>/sys/block/zram0/comp_algorithm

上面命令将 zRAM 的压缩算法更改为lzo,我们也可以通过下面命令来查看内核支持哪些压缩算法:

cat/sys/block/zram0/comp_algorithm
lzo[lz4]

从上面命令的输出可知,内核支持lzo和lz4两种压缩算法。

4. 将 swap 交换设备设置为 zRAM

要将 swap 的交换设备设置为 zRAM 块设备,可以使用以下命令:

mkswap/dev/zram0

当执行完上面这条命令后,内核将会使用zram0作为 swap 的交换设备。

zRAM实现

zRAM 块设备驱动的实现代码主要在drivers/block/zram/zram_drv.c文件中,下面我们主要围绕此文件进行分析。

本文并不会介绍块设备驱动的编写流程,只会分析 swap 机制在进行内存交换时,与 zRAM 块设备驱动的交互。

压缩内存

当系统内存不足时,内核将会触发swap机制。swap 机制首先会从系统中选择一些进程不常用内存,然后将这些不常用的内存交换到zRAM块设备中(使用 zRAM 块设备作为交换设备的情况下)。

当 swap 机制将不常用的内存交换到 zRAM 块设备时,会调用zram_make_request()函数处理请求。而zram_make_request()最终会通过调用zram_bvec_write()函数来压缩内存,调用链如下:

zram_make_request()
->__zram_make_request()
->zram_bvec_rw()
->zram_bvec_write()

我们来分析一下zram_bvec_write()函数的实现,其代码如下:

staticint
zram_bvec_write(structzram*zram,structbio_vec*bvec,u32index,intoffset)
{
...
//1.获取需要进行压缩的内存
page=bvec->bv_page;
...
user_mem=kmap_atomic(page);
uncmem=user_mem;

...
//2.对内存进行压缩
ret=zcomp_compress(zram->comp,zstrm,uncmem,&clen);
...

//3.获取压缩后的数据
src=zstrm->buffer;
...

//4.申请一个内存块保存压缩后的数据
handle=zs_malloc(meta->mem_pool,clen);
...
cmem=zs_map_object(meta->mem_pool,handle,ZS_MM_WO);

//5.将压缩后的数据保存到新申请的内存块中
memcpy(cmem,src,clen);
...

//6.将压缩后的数据登记到zRAM块设备的表格中
meta->table[index].handle=handle;
...
returnret;
}

为了简化分析过程,我们对代码进行精简。从上面的代码可以看出,zRAM 机制对内存进行压缩的步骤如下:

获取需要进行压缩的内存,需要进行压缩的内存由 swap 机制提供。

通过zcomp_compress()函数对内存进行压缩,src指针指向压缩后的内存地址。

通过zs_malloc()和zs_map_object()函数申请一块新的内存块,大小为压缩后数据的大小。

将压缩后的数据复制到新申请的内存块中。

将压缩后的数据记录到zRAM块设备的表格中。

由于 zRAM 块设备是建立在内存中的虚拟块设备,所以其并没有真实块设备的特性。真实块设备会将存储空间划分成一个个块,而zram_bvec_write()函数的index参数就是数据块的编号。此参数有 swap 机制提供,所以 zRAM 块设备驱动通过 index 参数作为原始内存数据的编号。

一图胜千言:

16ebdbfc-81ef-11ee-939d-92fbcf53809c.png

zRAM驱动有个数据块表,用来记录原始内存数据对应的压缩数据,此表的索引就是数据块的编号。swap 机制会维护此表格的使用情况,如哪个块是空闲的,哪个块被占用等。

当内存页被压缩后,swap 机制将会把原来的内存页释放掉,并且把所有映射到此内存页的进程解除映射,细节可以参考 swap 机制相关的资料







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux系统
    +关注

    关注

    4

    文章

    593

    浏览量

    27393
  • SWAP
    +关注

    关注

    0

    文章

    51

    浏览量

    12821
  • zram
    +关注

    关注

    0

    文章

    3

    浏览量

    75

原文标题:一文读懂|zRAM 内存压缩机制

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    OpenHarmony3.1 Release关键特性解析——Enhanced SWAP内存管理

    关键技术就介绍完了,我们来总结一下:● 定制的 ZRAM 和交换分区:将数据通过关联性、冷热顺序进行存放,保证了数据的存取速度,提升了 IO 性能。● 动态的内存回收机制:从回收优先级、可用
    发表于 05-17 17:24

    压缩机油的特征及应用

    压缩机油主要用于润滑压缩机的汽缸、活塞环、轴承、增速齿轮、曲柄连杆及曲轴箱润滑系统。
    发表于 12-11 14:04 9次下载

    嵌入式系统中的内存压缩技术

    摘要:介绍内存压缩技术和一个基于硬件的内存压缩系统模型,探讨内存压缩技术在嵌入式系统中的应用
    发表于 03-11 12:43 1140次阅读
    嵌入式系统中的<b class='flag-5'>内存</b><b class='flag-5'>压缩</b>技术

    什么是制冷压缩机,制冷压缩机的工作原理

    什么是制冷压缩机,制冷压缩机的工作原理 制冷压缩机是制冷装置中最主要的设备,通常称为制冷装置中的主机。制冷剂蒸气从低压提高
    发表于 04-08 17:09 1.7w次阅读

    肖特推出了电动压缩机标准的压缩机端子系列产品

    在电动汽车、混合动力汽车和燃料电池汽车中,电动空调压缩机的性能和可靠性很大程度上取决于一个部件——压缩机端子。压缩机端子必须保持密封,以防止制冷剂泄漏,同时支持大量电能从电池转移到压缩机
    的头像 发表于 11-12 08:51 3321次阅读

    半导体制冷和压缩机制冷哪个好

    电子半导体制冷电路简单,整体结构体积小,制冷效率高,速度快,无噪音,无污染,寿命长,但成本高。压缩机制冷与其相反。 半导体制冷可以做到茶杯里,但压缩机制冷做不到。压缩机制冷可以大到冷库、中央空调
    的头像 发表于 11-13 11:05 6.9w次阅读

    离心压缩机和往复压缩机的区别

    本文主要阐述了离心压缩机和往复压缩机的区别。
    发表于 12-04 10:53 9161次阅读

    滚动转子式压缩机优点_滚动转子式压缩机的缺点

    滚动转子式压缩机又称滚动活塞压缩机或固定滑片压缩机,是回转式压缩机的一种。
    的头像 发表于 12-06 09:37 1.3w次阅读
    滚动转子式<b class='flag-5'>压缩机</b>优点_滚动转子式<b class='flag-5'>压缩机</b>的缺点

    多滑片式压缩机结构图_多滑片式压缩机的特点

    滑片式制冷压缩机是一种容积型回转式压缩机。它可分为单滑片式与多滑片式两种。多滑片式压缩机目前主要用作配组双级压缩机的低压级压缩机
    的头像 发表于 12-06 09:54 6455次阅读

    容积型压缩机分类_容积型压缩机的特点

    容积式压缩机主要分为下面四种:螺杆式压缩机、活塞式压缩机、滚动转子式压缩机、涡旋式压缩机
    的头像 发表于 12-06 10:58 1.6w次阅读

    冰箱压缩机的作用_冰箱压缩机修理价格是多少

    本文首先阐述了冰箱压缩机的作用,其次介绍了冰箱压缩机的种类,最后介绍了冰箱压缩机修理价格。
    发表于 04-01 10:30 3766次阅读

    虚拟机:linux Kernel 添加 ZRAM 支持

    ZRAM, 简单的说,就是拿一部分内存当做交换分区使用,暂时不用的内存页面压缩后保存在 zram交换分区面。因为是
    的头像 发表于 06-22 17:09 2682次阅读
    虚拟机:linux Kernel 添加 <b class='flag-5'>ZRAM</b> 支持

    制冷压缩机的种类_制冷压缩机的结构

    制冷压缩机是制冷系统的核心和心脏。压缩机引的能力和特征决定了制冷系统的能力和特征。某种意义上,制冷系统的设计与匹配就是将压缩机的能力体现出来。因此,世界各国制冷行业无不在制冷压缩机的研
    的头像 发表于 08-24 10:52 8637次阅读
    制冷<b class='flag-5'>压缩机</b>的种类_制冷<b class='flag-5'>压缩机</b>的结构

    如何选择压缩机

    如何选择压缩机? 选择压缩机是一个相当复杂的过程,需要综合考虑多个因素。本文将详细介绍如何选择压缩机,包括了所需的基本知识、市场上常见的压缩机类型、关键的选择因素和技术参数等。 一、基
    的头像 发表于 12-11 11:26 1171次阅读

    压缩机的类型和区别

    压缩机的类型和区别  压缩机是一种用于提高气体压缩和输送能力的机械设备。根据不同的工作原理和应用需求,压缩机可分为多种类型,包括离心压缩机
    的头像 发表于 02-01 14:36 3259次阅读