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

    文章

    570

    浏览量

    26938
  • SWAP
    +关注

    关注

    0

    文章

    47

    浏览量

    12641
  • zram
    +关注

    关注

    0

    文章

    3

    浏览量

    64

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

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

收藏 人收藏

    评论

    相关推荐

    空气的压缩与传送压缩机

    压缩机能将电机或内燃机的机械能转化为压缩空气的压力。空气压缩机分为两大类:往复式与旋转式。下图表示了压缩机的基本类型
    发表于 12-11 14:26 8次下载

    空气的压缩与传送压缩机

    压缩机能将电机或内燃机的机械能转化为压缩空气的压力。空气压缩机分为两大类:往复式与旋转式。下图表示了压缩机的基本类型
    发表于 12-15 11:54 20次下载

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

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

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

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

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

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

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

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

    涡旋压缩机工作原理_涡旋压缩机特点

    涡旋压缩机是一种容积式压缩压缩机压缩部件由动涡旋盘和静涡旋组成。包括使通过压缩机壳体的气体的分路流动方式以减少夹带的油的许多结构特征。
    发表于 01-30 22:35 4444次阅读

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

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

    离心压缩机结构原理_离心压缩机有什么用途

    本文首先阐述了离心压缩机结构原理,其次介绍了离心压缩机用途。最后解析了离心压缩机的应用发展。
    发表于 12-04 11:38 6339次阅读

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

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

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

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

    冰箱压缩机什么牌子最好_八大冰箱压缩机品牌排名

    大家知道冰箱最重要的部件是什么吗?当然是压缩机,冰箱能够正常工作全靠它,可以说压缩机是冰箱的核心部件。如果你想要购买一台 高质量的冰箱 ,那么你就首先得拥有一个好的压缩机,那么冰箱压缩机
    发表于 04-01 10:17 6.6w次阅读

    虚拟机:linux Kernel 添加 ZRAM 支持

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

    冰箱压缩机不转的原因

    冰箱压缩机不转可能有以下原因:   1.电源问题:首先检查冰箱的电源插头是否插紧,是否有电,电源线是否破损等,这些也可能导致冰箱压缩机不转。   2.压缩机损坏:如果冰箱压缩机
    的头像 发表于 06-03 10:30 3089次阅读

    压缩机的类型和区别

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