深入谈谈内存压缩那些事!

news2025/1/18 13:50:47

1. 技术背景

说到压缩这个词,我们并不陌生,应该都能想到是降低占用空间,使同样的空间可以存放更多的东西,类似于我们平时常用的文件压缩,内存压缩同样也是为了节省内存。

尽管当前android手机6GB,8GB甚至12GB的机器都较为常见了,但内存无论多大,总是会有不够用的时候。当系统内存紧张的时候,会将文件页丢弃或回写回磁盘(如果是脏页),还可能会触发LMK杀进程进行内存回收。这些被回收的内存如果再次使用都需要重新从磁盘读取,而这个过程涉及到较多的IO操作。就目前的技术而言,IO的速度远远慢于这RAM操作速度。因此,如果频繁地做IO操作,不仅影响flash使用寿命,还严重影响系统性能。内存压缩是一种让IO过程平滑过渡的做法, 即尽量减少由于内存紧张导致的IO,提升性能。

2. 主流内存压缩技术

目前linux内核主流的内存压缩技术主要有3种:zSwap, zRAM, zCache。

2.1 zSwap

zSwap是在memory与flash之间的一层“cache”,当内存需要swap出去磁盘的时候,先通过压缩放到zSwap中去,zSwap空间按需增长。达到一定程度后则会按照LRU的顺序(前提是使用的内存分配方法需要支持LRU)将就最旧的page解压写入磁盘swap device,之后将当前的page压缩写入zSwap。

zswap本身存在一些缺陷或问题:

1) 如果开启当zswap满交换出backing store的功能, 由于需要将zswap里的内存按LRU顺序解压再swap out, 这就要求内存分配器支持LRU功能。

2) 如果不开启当zswap满交换出backing store的功能, 和zRam是类似的。

2.2 zRram

zRram即压缩的内存, 使用内存模拟block device的做法。实际不会写到块设备中去,只会压缩后写到模拟的块设备中,其实也就是还是在RAM中,只是通过压缩了。由于压缩和解压缩的速度远比读写IO好,因此在移动终端设备广泛被应用。zRam是基于RAM的block device, 一般swap priority会比较高。只有当其满,系统才会考虑其他的swap devices。当然这个优先级用户可以配置。

zRram本身存在一些缺陷或问题:

1) zRam大小是可灵活配置的, 那是不是配置越大越好呢? 如果不是,配置多大是最合适的呢?

2) 使用zRam可能会在低内存场景由于频繁的内存压缩导致kswapd进程占CPU高, 怎样改善?

3) 增大了zRam配置,对系统内存碎片是否有影响?

要利用好zRam功能, 并不是简单地配置了就OK了, 还需要对各种场景和问题都做好处理, 才能发挥最优的效果。

2.3 zCache

zCache是oracle提出的一种实现文件页压缩技术,也是memory与block dev之间的一层“cache”,与zswap比较接近,但zcache目前压缩的是文件页,而zSwap和zRAM压缩是匿名页。

zcache本身存在一些缺陷或问题:

1) 有些文件页可能本身是压缩的内容, 这时可能无法再进行压缩了

2) zCache目前无法使用zsmalloc, 如果使用zbud,压缩率较低

3) 使用的zbud/z3fold分配的内存是不可移动的, 需要关注内存碎片问题

3.内存压缩主流的内存分配器

3.1 Zsmalloc

zsmalloc是为ZRAM设计的一种内存分配器。内核已经有slub了, 为什么还需要zsmalloc内存分配器?这是由内存压缩的场景和特点决定的。zsmalloc内存分配器期望在低内存的场景也能很好地工作,事实上,当需要压缩内存进行zsmalloc内存分配时,内存一般都比较紧张且内存碎片都比较严重了。如果使用slub分配, 很可能由于高阶内存分配不到而失败。另外,slub也可能导致内存碎片浪费比较严重,最坏情况下,当对象大小略大于PAGE_SIZE/2时,每个内存页接近一般的内存将被浪费。

Android手机实测发现,anon pages的平均压缩比大约在1:3左右,所以compressed anon page size很多在1.2K左右。如果是Slub,为了分配大量1.2K的内存,可能内存浪费严重。zsmalloc分配器尝试将多个相同大小的对象存放在组合页(称为zspage)中,这个组合页不要求物理连续,从而提高内存的使用率。

需要注意的是, 当前zsmalloc不支持LRU功能, 旧版本内核分配的不可移动的页, 对内存碎片影响严重, 但最新版本内核已经是支持分配可移动类型内存了。

3.2 Zbud

zbud是一个专门为存储压缩page而设计的内存分配器。用于将2个objects存到1个单独的page中。zbud是可以支持LRU的, 但分配的内存是不可移动的。

3.3 Z3fold

z3fold是一个较新的内存分配器, 与zbud不同的是, 将3个objects存到1个单独的page中,也就是zbud内存利用率极限是1:2, z3fold极限是1:3。同样z3fold是可以支持LRU的, 但分配的内存是不可移动的。

 资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

4.内存压缩技术与内存分配器组合对比分析

结合上面zSwap / zRam /zCache的介绍, 与zsmalloc/zbud/z3fold分别怎样组合最合适呢?

下面总结了一下, 具体原因可以看上面介绍的时候各类型的特点。

5.zRAM技术原理

本文重点介绍zRam内存压缩技术,它是目前移动终端广泛使用的内存压缩技术。

5.1 软件框架

下图展示了内存管理大体的框架, 内存压缩技术处于内存回收memory reclaim部分中。

再具体到zRam, 它的软件架构可以分为3部分, 分别是数据流操作,内存压缩算法 ,zram驱动。

数据流操作:提供串行或者并行的压缩和解压操作。

内存压缩算法:每种压缩算法提供压缩和解压缩的具体实现回调接口供数据操作调用。

Zram驱动:创建一个基于ram的块设备, 并提供IO请求处理接口。

5.2 实现原理

Zram内存压缩技术本质上就是以时间换空间。通过CPU压缩、解压缩的开销换取更大的可用内存空间。

我们主要描述清楚下面这2个问题:

1) 什么时候会进行内存压缩?

2) 进行内存压缩/解压缩的流程是怎样的?

进行内存压缩的时机:

1) Kswapd场景:kswapd是内核内存回收线程, 当内存watermark低于low水线时会被唤醒工作, 其到内存watermark不小于high水线。

2) Direct reclaim场景:内存分配过程进入slowpath, 进行直接行内存回收。

下面是基于4.4内核理出的内存压缩、解压缩流程。

内存回收过程路径进行内存压缩。会将非活跃链表的页进行shrink, 如果是匿名页会进行pageout, 由此进行内存压缩存放到ZRAM中, 调用路径如下:

在匿名页换出到swap设备后, 访问页时, 产生页访问错误, 当发现“页表项不为空, 但页不在内存中”, 该页就是已换到swap区中,由此会开始将该页从swap区中重新读取, 如果是ZRAM, 则是解压缩的过程。调用路径如下:

5.3 内存压缩算法

目前比较主流的内存算法主要为LZ0, LZ4, ZSTD等。下面截取了几种算法在x86机器上的表现。各算法有各自特点, 有以压缩率高的, 有压缩/解压快的等, 具体要结合需求场景选择使用。

6.zRAM技术应用

本节描述一下在使用ZRAM常遇到的一些使用或配置,调试的方法。

6.1 如何配置开启zRAM

1) 配置内存压缩算法

下面例子配置压缩算法为lz4

echo lz4 > /sys/block/zram0/comp_algorithm

2) 配置ZRAM大小

下面例子配置zram大小为2GB

echo 2147483648 > /sys/block/zram0/disksize

3) 使能zram

mkswap /dev/zram0

swapon /dev/zram0

6.2 swappiness含义简述

swappiness参数是内核倾向于回收匿名页到swap(使用的ZRAM就是swap设备)的积极程度, 原生内核范围是0~100, 参数值越大, 表示回收匿名页到swap的比例就越大。如果配置为0, 表示仅回收文件页,不回收匿名页。默认值为60。可以通过节点“/proc/sys/vm/swappiness”配置。

6.3 zRam相关的技术指标

1) ZRAM大小及剩余空间

Proc/meminfo中可以查看相关信息

SwapTotal:swap总大小, 如果配置为ZRAM, 这里就是ZRAM总大小

SwapFree:swap剩余大小, 如果配置为ZRAM, 这里就是ZRAM剩余大小

当然, 节点 /sys/block/zram0/disksize是最直接的。

2) ZRAM压缩率

/sys/block/zram<id>/mm_stat中有压缩前后的大小数据, 由此可以计算出实际的压缩率

orig_data_size:压缩前数据大小, 单位为bytes

compr_data_size :压缩后数据大小, 单位为bytes

3) 换出/换入swap区的总量, proc/vmstat中中有相关信息

pswpin:换入总量, 单位为page

pswout:换出总量, 单位为page

6.4 zRam相关优化

上面提到zRam的一些缺陷, 怎么去改善呢?

1) zRam大小是可灵活配置的, 那是不是配置越大越好呢? 如果不是配置多大是最合适的呢?

zRam大小的配置比较灵活, 如果zRam配置过大, 后台缓存了应用过多, 这也是有可能会影响前台应用使用的流畅度。另外, zRam配置越大, 也需要关注系统的内存碎片化情。因此zRam并不是配置越大越好,具体的大小需要根据内存总大小及系统负载情况考虑及实测而定。

2) 使用zRam,可能会存在低内存场景由于频繁的内存压缩导致kswapd进程占CPU高, 怎样改善?

zRam本质就是以时间换空间, 在低内存的情况下, 肯定会比较频繁地回收内存, 这时kswapd进程是比较活跃的, 再加上通过压缩内存, 会更加消耗CPU资源。改善这种情况方法也比较多, 比如, 可以使用更优的压缩算法, 区别使用场景, 后台不影响用户使用的场景异步进行深度内存压缩, 与用户体验相关的场景同步适当减少内存压缩, 通过增加文件页的回收比例加快内存回收等等。

3) 增大了zRam配置,对系统内存碎片是否有影响?

使用zRam是有可能导致系统内存碎片变得更严重的, 特别是zsmalloc分配不支持可移动内存类型的时候。新版的内核zsmalloc已经支持可移动类型分配的, 但由于增大了zRam,结合android手机的使用特点, 仍然会有可能导致系统内存碎片较严重的情况,因些内存碎片问题也是需要重点关注的。解决系统内存碎片的方法也比较多, 可以结合具体的原因及场景进行优化。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/435085.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

两个月15斤以上的健康减脂减重法,与饥饿、运动等无关的自我实验的验证方法(第六篇完结,无收费内容)...

阅读本文前请先看前五篇内容&#xff0c;本文有部分修改&#xff0c;但是涉及前五篇的内容会大量隐藏&#xff0c;只保留关联修改部分&#xff0c;链接如下&#xff1a; 两个月15斤以上的健康减脂减重法&#xff0c;与饥饿、运动等无关的自我实验的验证方法&#xff08;第五篇&…

OpenCascade安装编译

重新编译OpenCascade&#xff0c;在漫长的等待过程中&#xff0c;记录一下编译的流程 下载安装 OpenCascade官网中提供了直接安装的二进制版本&#xff0c;如果只是简单的使用需求可以直接下载安装&#xff0c;二进制版本使用VC 2017 64 bit编译 官网地址 源码编译 源码编…

Docker容器:docker基础

目录 一、docker容器简介 1、什么是容器 2、容器的优点 3、什么是docker容器 4、docker的logo及设计宗旨 5、docker与虚拟机对比 6、docker容器2个重要技术 7、docker三大核心概念 二、docker的安装及管理 1、安装docker 2、配置docker加速器 3、docker镜像相关基础…

你为什么从上一家公司离职?程序员这样回答最机智

想必每一位跳槽的程序员伙伴&#xff0c;在面试时都会被问到这个问题吧&#xff1a; “为什么从上一家公司离职&#xff1f;” 可能不少人跳槽的原因都是钱少事多离家远&#xff0c;加班干到十二点&#xff0c;同事之间还内卷&#xff0c;但是这些原因在面试的时候都能说吗&a…

软件测试培训

软件测试培训 软件测试培训是一门针对软件测试人才培养的技术&#xff0c;培训内容涉及到&#xff1a;软件测试基础、自动化测试、性能测试、安全测试、接口测试、云计算测试等。就业方向&#xff1a;软件开发工程师&#xff0c;软件测试工程师&#xff0c; web前端工程师&…

Docker概念|容器|镜像|命令详细(创建,删除,修改,添加)

Docker概念|容器|镜像|命令详细&#xff08;创建&#xff0c;删除&#xff0c;修改&#xff0c;添加&#xff09; 一&#xff0c;Docker简介二&#xff0c;Docker与虚拟机的区别三&#xff0c;容器核心技术四&#xff0c;Docker核心概念五 docker的安装5.1关闭防火墙,关闭文件防…

2022年 团体程序设计天梯赛——题解集

Hello各位童学大家好&#xff01;&#x1f60a;&#x1f60a;&#xff0c;茫茫题海你我相遇即是缘分呐&#xff0c;或许日复一日的刷题已经让你感到疲惫甚至厌倦了&#xff0c;但是我们真的真的已经达到了我们自身极限了吗&#xff1f;少一点自我感动&#xff0c;没有结果前别太…

大悦城中粮物业:用二维码搭建物业系统,“多快好省”提高管理效率

中粮物业&#xff08;大悦服务&#xff09;隶属于大悦城控股集团股份有限公司&#xff0c;成立于1993年6月&#xff0c;是中国物业管理协会会员单位、广东省物业管理行业协会常务理事单位。 作为连续多年蝉联“中国物业服务百强企业”的头部物业公司&#xff0c;中粮物业自主研…

OMRON Sysmac Studio如何将PDO参数复制到其他轴

Sysmac Studio如何将PDO参数复制到其他轴 实验时间&#xff1a;2023/4/19 实验设备&#xff1a;Sysmac Studio(ver 1.53)、EveryThing搜索工具 实验目的&#xff1a;将轴分配的PDO参数复制到其他轴 一. 实验概述 ​ 当PLC当很多相同的伺服轴时&#xff0c;轴的PDO映射是完全…

ESP32在ESP-IDF框架下使用LVGL(v8.3)

开发环境 VSCodeESP-IDF插件 说明&#xff1a;IDF版本为4.4.4&#xff0c;最新版的5.0.1弃用了些东西&#xff0c;而lvgl_esp32_drivers对5以上的版本未适配&#xff0c;所以不建议使用5以上的版本。 安装&#xff1a;安装教程&#xff0c;建议整体看完在进行安装&#xff0c;以…

解决vue-print-nb打印时多出一页空白,vue-print-nb打印有空白页

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 打印table表格&#xff0c;需要用到vue-print-nb插件&#xff0c;使用该插件可以一键弹窗打印页面 效果如图 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 查了一下&#xff…

斩获“双金”!玻色量子在中国移动第七届创客马拉松大赛脱颖而出

​4月7日&#xff0c;中国移动第七届创客马拉松大赛总决赛在厦门圆满落幕。此次大赛以“能力无界 智算同行”为主题&#xff0c;经过近4000个创新项目的层层选拔&#xff0c;玻色量子凭借“相干量子计算设备”项目脱颖而出&#xff0c;成功摘取“双金”&#xff1a;总决赛全球通…

Qt5.12实战之菜单栏工具栏与状态栏使用

演示效果: 1.widget工程创建 2.ui设计 双击打开下图所示的.ui文件 菜单设计: 添加子菜单 修改QMenu及QAction对象名称为可识别名 具体修改操作如下: QMenu和QAction类似 在QAction列表中修改QAction对象 具体修改方法如下: 为QAction也就是菜单项目添加点击事件处理: 选择信号…

公网远程访问连接Minecraft我的世界服务器 - MCSM控制面板

文章目录 概述1.MCSManager 安装2.内网穿透2.1 安装cpolar内网穿透 3. 访问公网地址4.固定公网地址4.1 保留一个二级子域名4.2 配置固定二级域名4.3 访问固定公网地址 5. 设置节点公网地址6. 固定节点公网地址6.1 保留一个固定tcp地址6.2 配置固定TCP地址 概述 MCSManager 是一…

After Effects 2022(AE 2022)forMac/win图文安装教程

After Effects简称“AE”是Adobe公司推出的一款图形视频处理软件&#xff0c;适用于从事设计和视频特技的机构&#xff0c;包括电视台、动画制作公司、个人后期制作工作室以及多媒体工作室。属于层类型后期软件。可以帮助您高效且精确地创建无数种引人注目的动态图形和震撼人心…

NPDP认证|B端产品经理是如何做竞品调研的?

做竞品的目的主要是为了对比和测试。 对方比我好的地方我规避&#xff0c;发挥我自己的产品优势&#xff0c;对方差的地方我要切入&#xff0c;把他打败。 通过竞品分析后&#xff0c;企业可以确定我们进入市场的机会&#xff0c;也为后期进行产品测试提供有效的分析依据。 那么…

9.4 数组的指针和指向数组的指针变量-1

9.4 数组的指针和指向数组的指针变量-1 一.指向数组元素的指针变量的定义和赋值二.通过指针引用数组元素1.情况12.情况23.情况34.情况45.情况5注意事项&#xff1a; 情况6&#xff1a;*p 优先级相同&#xff0c;并且都是从右到左的结合性&#xff0c;所以 *(p)情况7&#xff1a…

Maven(四):Maven的使用——java工程与Web工程

Maven&#xff08;四&#xff09;&#xff1a;Maven的使用&#xff08;中&#xff09; 前言一、实验四&#xff1a;创建 Maven 版的 Web 工程1、说明2、操作3、生成的pom.xml4、生成的Web工程的目录结构5、创建 Servlet5.1 在 main 目录下创建 java 目录5.2 在 java 目录下创建…

备受瞩目的南卡OE Pro上线!稳坐国内开放式蓝牙耳机TOP1,舒适音质双在线!

4月10号&#xff0c;国内专业资深声学品牌Nank南卡&#xff0c;将推出2023年度旗舰机——南卡OE Pro不入耳开放式蓝牙耳机&#xff0c;致力打造全新不入耳、不伤耳、安全健康佩戴体验&#xff0c;无论是音质体验还是佩戴舒适度&#xff0c;都完胜同行业不入耳开放式耳机&#x…

Ubuntu系统设置中文

在工作中有时候需要&#xff0c;设置系统编码为中文编码&#xff0c;记录一下配置中文编码的流程 ubuntu所需的安装包&#xff1a;(3条消息) linux中文编码locale资源-CSDN文库 date可以查看是否设置了中文编码 date 没有设置中文编码时是这样的显示格式 将包解压了&#xf…