1.技术背景说到压缩这个词,我们并不陌生。我们都应该想到减少空 room的占用,让同样的空 room可以存放更多的东西。类似于我们平时的文件压缩,内存压缩也是用来节省内存的。

虽然目前6GB、8GB甚至12GB的安卓手机很常见,但是内存再大,总会有不够用的时候。当系统内存紧张时,文件页会被丢弃或写回磁盘(如果是脏页),可能会触发LMK查杀进程进行内存回收。如果回收的内存被重用,就需要从磁盘中重新读取,这个过程涉及到更多的IO操作。就目前的技术来看,IO的速度比RAM慢很多。所以频繁的IO操作不仅会影响flash的使用寿命,还会严重影响系统性能。内存压缩是平滑IO过程的一种方式,即尽量减少内存不足导致的IO,提高性能。

2.主流内存压缩技术目前,linux内核中主要有三种内存压缩技术:zSwap、zRAM、zCache。

2.1 zSwapzSwap是内存和flash之间的一层“缓存”。当内存需要换出磁盘时,先通过压缩放入zwap,zwap空按需递增。达到一定级别后,最老的页面会被解压缩,按照LRU的顺序写入磁盘交换设备(前提是使用的内存分配方式需要支持LRU),然后当前页面会被压缩写入zSwap。

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

如果开启了ZWAP满的时候换出后备存储的功能,那么ZWAP中的内存需要按照LRU顺序解压后再换出,这就需要内存分配器支持LRU功能。如果在zswap满了的时候不开启换出后备库的功能,和zRam差不多。2.2 zRramzRram是压缩内存,内存用于模拟块设备。实际上不会写入块设备,只会被压缩写入模拟块设备,模拟块设备实际上还在RAM中,只是通过压缩。由于压缩和解压缩的速度远优于读写IO的速度,所以在移动终端设备中被广泛使用。ZRam是基于Ram的块设备,一般交换优先级会高一些。只有当它已满时,系统才会考虑其他交换设备。当然,这个优先级可以由用户配置。

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

ZRam大小可以灵活配置,所以配置越大越好?如果不是,什么尺寸的配置最合适?由于频繁的内存压缩,使用zRam可能会导致kswapd进程在低内存情况下占用高CPU。如何改善?增加zRam配置,对系统内存碎片有影响吗?要用好zRam功能,不仅仅是简单配置就可以了,还需要应对各种场景和问题,才能获得最佳效果。

2.3 zCachezCache是oracle提出的一种文件页面压缩技术。也是内存和block dev之间的一层“缓存”,接近ZWAP。不过目前zcache压缩的是文件页面,而ZWAP和zRAM压缩的是匿名页面。

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

一些文件页面本身可能是压缩的内容,然后它们可能不再被压缩。zCache目前无法使用zsmalloc。如果使用zbud,压缩率低的zbud/z3fold分配的内存是不能移动的,需要注意内存碎片的问题。3.内存压缩主流内存分配器3.2.1 Zsmalloczsmalloc是一个为ZRAM设计的内存分配器。内核已经有slub了,为什么还需要zsmalloc内存分配器?这是由内存压缩的场景和特性决定的。zsmalloc内存分配器有望在内存不足的情况下工作良好。事实上,当需要压缩内存进行zsmalloc内存分配时,内存一般比较紧张,内存碎片严重。如果使用slub分配,很可能会因为高阶内存分配不可用而失败。此外,slub还可能导致内存碎片的严重浪费。最坏的情况下,当对象大小略大于PAGE_SIZE/2时,每个接近一般内存的内存页都会被浪费掉。

安卓手机测量发现,anon页面的平均压缩比在1:3左右,所以压缩后的anon页面大小如果是Slub的话在1.2K左右,为了分配大量的1.2K内存,内存浪费可能比较严重。zsmalloc分配器尝试在一个组合页面(称为zspage)中存储多个相同大小的对象,这不需要物理连续性,从而提高了内存利用率。

需要注意的是,目前的zsmalloc不支持LRU函数。旧内核分配的不可移动页面对内存碎片有严重影响,但最新内核已经支持可移动内存的分配。

3.2.2 Zbudzbud是专门为存储压缩页面而设计的内存分配器。用于将两个对象保存到一个页面中。Zbud可以支持LRU,但是分配的内存是不可移动的。

3.2.3 Z3foldz3fold是一个较新的内存分配器。与zbud不同的是,单个页面中存储三个对象,即zbud的内存利用极限为1: 2,Z3fold极限为1:3。类似地,z3fold可以支持LRU,但是分配的内存是不可移动的。

4.内存压缩技术与内存分配器组合的比较分析。结合上面zSwap/zRam /zCache的介绍,与ZMalloc/ZBUD/Z3Fold的组合最合适?

以下是总结。具体原因可以在上面介绍的每种类型的特点中找到。

–Zsmalloczbudz3foldzSwap(带实际zSwap设备)×(不可用)√(可用)√(最佳)√(可用)√(可用)zRam√(可用)√(可用)zCache×(不可用)√。

5.1软件框架下图是内存管理的一般框架,内存压缩技术在内存回收部分。

具体到zram,其软件架构可以分为三个部分,分别是数据流操作、内存压缩算法和zRam驱动。

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

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

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

5.2实现原理Zram内存压缩技术本质上是用时间换取空 room。CPU压缩和解压缩的代价换来了更多的可用内存空 room。

我们主要描述以下两个问题:

1)何时进行内存压缩?

2)内存压缩/解压缩的过程是怎样的?

内存压缩的时序:

1) Kswapd场景:Kswapd是一个内核内存回收线程,在内存水印低于低水位线时会唤醒工作,其内存水印不小于高水位线。

2)直接回收场景:内存分配过程进入直接行内存回收的慢速路径。

以下是基于4.4内核的内存压缩和解压缩过程。

内存压缩的内存恢复过程路径。收缩带有非活动链表的页面,如果是匿名的就分页输出,这样内存就被压缩存储在ZRAM。调用路径如下:

5.3内存压缩算法目前主流的内存算法有LZ0、LZ4、ZSTD等。下面显示了几种算法在x86机器上的性能。每种算法都有自己的特点,如压缩率高、压缩/解压缩速度快等。,应根据需求场景选择。

6.ZRAM技术的应用本节介绍了使用ZRAM时经常遇到的一些使用、配置和调试方法。

6.1如何配置和打开zRAM1)配置内存压缩算法

以下示例将压缩算法配置为lz4

echo lz4 & gt/sys/block/zram 0/comp _ algorithm

2)配置ZRAM大小

以下示例将zram大小配置为2GB。

echo 2147483648 & gt/sys/block/zram0/disksize

3)启用zram

mkswap /dev/zram0

swapon /dev/zram0

6.2 swappiness的简要描述含义Swappiness参数是内核倾向于回收匿名页面进行交换的积极程度(ZRAM使用的是交换设备)。原生内核范围是0~100。参数值越大,回收匿名页面交换的比例越大。如果配置为0,则表示只回收文件页,不回收匿名页。默认值为60。可以通过“/proc/sys/vm/swappiness”节点进行配置。

6.3相关技术指标1) ZRAM大小和剩余空间

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

互换总额:互换的总规模。如果配置为ZRAM,这是ZRAM的总面积。

SwapFree:交换剩余大小,如果配置为ZRAM,这是ZRAM的剩余大小。

当然,node/sys/block/zram0/disrupt是最直接的。

2) ZRAM压缩率

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

Orig_data_size:压缩前的数据大小,以字节为单位。

Comp _ data _ size:压缩数据的大小,以字节为单位。

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

Pswpin:交换的总量,以页为单位。

Pswout:总换出量,以页为单位

6.4 zRam相关优化上面提到的zRam的一些缺陷,如何改进?

ZRam大小可以灵活配置,所以配置越大越好?如果不是配置有多大呢?zRam尺寸的配置是灵活的。如果zRam的配置过大,后台缓存的应用太多,也可能会影响前台应用的流畅度。另外,zRam配置越大,越要注意系统的内存碎片。所以zRam的配置越大越好。具体大小需要根据总内存大小和系统负载来考虑和衡量。

使用zRam,可能会出现内存不足的情况。由于频繁的内存压缩,kswapd进程占用了很高的CPU。如何改善?zRam的本质是以时变空。在内存低的情况下,内存回收肯定会更频繁。此时kswapd进程处于活动状态,通过压缩内存,CPU资源会消耗更多。改善这种情况的方法有很多,比如可以使用更好的压缩算法,可以使用不同的使用场景,可以在后台不影响用户使用的场景中异步进行深度内存压缩,可以通过同步与用户体验相关的场景来适当降低内存压缩,可以通过提高文件页面的恢复率来加速内存回收。

增加zRam配置,对系统内存碎片有影响吗?使用zRam可能会导致更严重的系统内存碎片,尤其是当zsmalloc分配不支持可移动内存类型时。新版内核zsmalloc已经支持移动类型分配,但由于zRam的增加,结合android手机的使用特点,仍可能导致系统内存碎片严重,一些内存碎片问题也需要重点关注。解决系统内存碎片的方法有很多,可以结合具体原因和场景进行优化。

暴力破解压缩文件app(可以暴力破解的解压软件)

忘记密码如何在手机上解压压缩文件(手机zip暴力破解)

压缩文件解压密码(手机解压zip暴力破解)

压缩文件密码破解(暴力破解压缩文件密码)