轻松解决内存不足问题:ZRAM技术全面解析

存储 存储架构
在当今的软件环境下,许多应用程序对内存的需求越来越高。一款普通的办公软件在运行时可能就需要占用几百 MB 的内存,而如果再同时打开浏览器、音乐播放器等多个程序,内存很快就会被耗尽,导致电脑运行缓慢,甚至出现死机的情况。

在当今数字化时代,电子设备已成为我们生活中不可或缺的一部分。无论是手机、电脑还是平板,它们为我们的工作、学习和娱乐提供了极大的便利。然而,一个让众多用户头疼不已的问题却如影随形 —— 内存不足。

想象一下这样的场景:你正在手机上一边与同事激烈地讨论工作方案,一边查阅重要资料,还时不时地切换到社交软件回复朋友的消息。突然,手机屏幕一滞,操作变得迟缓起来,每点击一次都要等待许久才有反应,甚至有些应用还会直接闪退。这种情况是不是让你心急如焚,工作效率大打折扣?又或者,当你在电脑上满心欢喜地打开一款期待已久的大型游戏,准备尽情享受沉浸式的娱乐时光时,电脑却像是老牛拉破车一般,运行得极为吃力,画面卡顿,声音也断断续续,原本的快乐瞬间化为乌有。

这些令人沮丧的状况,归根结底都是内存不足在作祟。随着我们对电子设备依赖程度的加深,日常使用中所运行的应用程序数量越来越多,对内存的需求也水涨船高。当内存无法满足这些程序同时运行的需求时,设备就会陷入卡顿甚至死机的困境,严重影响我们的使用体验。为了解决这一难题,技术人员们不断探索创新,而 ZRAM 技术便是其中的一项重要突破 。

一、ZRAM技术简介

1.1概述

内存是计算机系统最重要的资源之一,当操作系统内存不足时,进程申请内存将会失败,从而导致其运行异常或者崩溃。zram swap 主要原理就是从内存分配一块区域出来用作 swap 分区,每次如果内存空间不够了,不是把应用程序杀掉,而是把应用程序所占用的内存数据复制到 swap 分区,等切换回来的时候就可以直接把这部分数据恢复到内存当中,节省重新开启所需的时间。

而被放到 swap 分区的应用程序,所占用的内存都是被压缩过的,比如,微信在普通内存中占用 50 MB 的空间,如果压缩率为 0.4,则放到 swap 分区里面的数据只需要 20 MB 的空间,这样 swap 分区里面就可以存放更多后台临时不用的应用程序,变相扩展了内存的大小。

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

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

图片图片

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

1.2ZRAM 技术是什么

ZRAM,这个听起来有些神秘的技术,实际上是 Linux 内核提供的一项虚拟内存压缩功能。简单来说,它就像是一个聪明的 “内存管家”,能够在内存紧张时大显身手 。在计算机的世界里,当物理内存不足时,系统通常会将一些暂时不用的数据转移到硬盘的交换空间中,这个过程被称为磁盘分页。然而,硬盘的读写速度与内存相比,简直是天壤之别,这就导致一旦频繁进行磁盘分页,设备的运行速度会大幅下降,出现严重的卡顿现象。

ZRAM 的出现,巧妙地解决了这一难题。它通过在 RAM 内创建一个压缩块设备,将那些暂时不用的内存数据进行压缩后存储在这个设备上,也就是我们所说的分页。这样一来,在需要交换或分页时,系统优先使用 ZRAM 这个压缩块设备,而不是直接使用硬盘上的交换空间,从而避免了在磁盘上进行分页,大大提高了性能。形象地讲,ZRAM 就像是给内存增加了一个 “压缩仓库”,当内存里的东西太多放不下时,就把一些不太常用的东西压缩后放进这个 “仓库” 里,等到需要使用的时候,再把它们解压取出来。而且,由于这个 “仓库” 就在内存里面,存取速度比从硬盘中读取要快得多,这就使得设备在内存紧张的情况下依然能够保持较为流畅的运行 。

从技术原理上看,ZRAM 利用了内存的快速读写特性和数据压缩算法。当系统检测到内存压力时,会将一部分内存页面数据传递给 ZRAM 模块。ZRAM 模块会对这些数据进行压缩,然后将压缩后的数据存储在预先分配好的内存区域中,这个区域就形成了一个虚拟的块设备,类似于磁盘分区,但速度却比磁盘快很多。当应用程序需要访问这些被压缩的数据时,ZRAM 会及时将其解压并返回给应用程序,整个过程对于应用程序来说是透明的,就好像这些数据一直都在正常的内存中一样 。

二、ZRAM 技术的工作原理

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

zRAM 的原理如下图所示:

图片图片

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

  • 通过 swap 机制从系统中查找一些进程不常用的内存。
  • 将这些不常用的内存交换到 zRAM 块设备中,而 zRAM 块设备首先会对这些不常用的内存进行压缩,然后存储起来。
  • 把不常用的内存压缩存储到 zRAM 块设备后,swap 机制会把这些不常用的内存归还给内核。
  • 当进程访问到这些被交换到 zRAM 块设备的内存时,swap 机制将会通过 zRAM 块设备解压这些内存,并且重新建立与进程的地址映射关系。

2.1zram配置步骤

(1)内核配置

3.15 之前版本的 kernel

Device Drivers -> Staging drivers (STAGING [=y])
  • 1.

3.15 及之后版本的 kernel

Device Drivers -> [*] Block devices -> Compressed RAM block device support
  • 1.

具体的配置项如下:

CONFIG_RESOURCE_COUNTERS=y
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
CONFIG_MEMCG_SWAP_ENABLED=y
CONFIG_MEMCG_KMEM=y
CONFIG_ZRAM=y
CONFIG_TOI_ZRAM_SUPPORT=y
CONFIG_ZRAM_DEBUG=y
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

(2)zram 块设备个数设定

如果是将 zram 编译成模块,则可以使用下面命令动态加载,这个命令会创建 4 个设备 /dev/zram{0,1,2,3}

modprobe zram num_devices=4
  • 1.

如果是直接将 zram 编译到内核,那只能在代码里面直接修改 num_devices,3.15 之前的版本代码路径是 drivers/staging/zram/zram_drv.c,3.15 及之后的版本代码路径是 ./drivers/block/zram/zram_drv.c ,默认 zram 设备个数是一个。

(3)压缩流的最大个数设定

这个是 3.15 版本及以后的 kernel 新加入的功能,3.15 版本之前的 zram 压缩都是使用一个压缩流(缓存 buffer 和算法私有部分)实现,每个写(压缩)操作都会独享压缩流,但是单压缩流如果出现数据奔溃或者卡住的现象,所有的写(压缩)操作将一直处于等待状态,这样效率非常低;而多压缩流的架构会让写(压缩)操作可以并行去执行,大大提高了压缩的效率和稳定性。

查看压缩流的最大个数,默认是1

cat /sys/block/zram0/max_comp_streams
  • 1.

设定压缩流的最大个数

echo 3 > /sys/block/zram0/max_comp_streams
  • 1.

(4)压缩算法选择

查看目前支持的压缩算法

cat /sys/block/zram0/comp_algorithm
lzo [lz4]
  • 1.
  • 2.

修改压缩算法

echo lzo > /sys/block/zram0/comp_algorithm
  • 1.

(5)zram 内存大小设定

分配部分内存作为 zram ,大小建议为总内存的 10%-25% 。

可以使用数值直接设置内存大小,单位是 bytes

echo $((512*1024*1024)) > /sys/block/zram0/disksize
  • 1.

也可以使用带内存单位作为后缀的方式设置内存大小

(6)启用 zram 设备为 swap

mkswap /dev/zram0
swapon /dev/zram0
  • 1.
  • 2.

(7)具体的 zram 相关对外接口说明

图片图片

(8)系统运行之后的内存统计情况

cat /proc/meminfo
1  MemTotal:        1958596 kB
2  MemFree:           40364 kB
3  Buffers:            3472 kB
4  Cached:           328080 kB
5  SwapCached:         1908 kB
6  Active:           906752 kB
7  Inactive:         426648 kB
8  Active(anon):     752824 kB
9  Inactive(anon):   252756 kB
10 Active(file):     153928 kB
11 Inactive(file):   173892 kB
12 Unevictable:        2516 kB
13 Mlocked:               0 kB
14 SwapTotal:        524284 kB
15 SwapFree:         378320 kB
16 Dirty:               480 kB
17 Writeback:             0 kB
18 AnonPages:       1003452 kB
19 Mapped:           167052 kB
20 Shmem:              1184 kB
21 Slab:              83104 kB
22 SReclaimable:      24368 kB
23 SUnreclaim:        58736 kB
24 KernelStack:       48736 kB
25 PageTables:        41908 kB
26 NFS_Unstable:          0 kB
27 Bounce:                0 kB
28 WritebackTmp:          0 kB
29 CommitLimit:     1503580 kB
30 Committed_AS:   94718220 kB
31 VmallocTotal:  251658176 kB
32 VmallocUsed:      181352 kB
33 VmallocChunk:  251373156 kB
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.

从 Line 14,15 可以看到 swap 相关的统计信息,SwapTotal 的大小就是 zram 设备的大小,当系统开启了一段时间之后,就会将后台的一些优先级低的应用数据(匿名页面)压缩存放到 swap 区,然后再重新打开这些应用的时候,再从 swap 区将它们的数据解压出来。在 Android KitKat 版本之前,Android 设备因为没有 zram,所以查看 /proc/meinfo 看到的 swap 分区的大小和统计数据都会是零。

1 Total RAM: 1958596 kB (status normal)
2  Free RAM: 724527 kB (504283 cached pss + 183244 cached kernel + 37000 free)
3  Used RAM: 1014008 kB (656204 used pss + 357804 kernel)
4  Lost RAM: 220061 kB
5      ZRAM: 27296 kB physical used for 145952 kB in swap (524284 kB total swap)
6    Tuning: 256 (large 512), oom 286720 kB, restore limit 95573 kB (high-end-gfx)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

Line 5 也可以看到 swap 相关的统计信息,如果需要查看具体某个进程使用了多少 swap 空间,可以通过dumpsys meminfo pid(该进程的 id 号)查看。

2.2启用zRAM

(1)创建 zRAM 块设备

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

modprobe zram num_devices=1
  • 1.

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

(2)设置 zRAM 块设备的大小

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

echo 512M > /sys/block/zram0/disksize
  • 1.

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

(3)压缩算法选择

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

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

echo lzo > /sys/block/zram0/comp_algorithm
  • 1.

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

cat /sys/block/zram0/comp_algorithm
lzo [lz4]
  • 1.
  • 2.

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

(4)将 swap 交换设备设置为 zRAM

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

mkswap /dev/zram0
  • 1.

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

三、zRAM技术的实现

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

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

3.1压缩内存

当系统内存不足时,内核将会触发 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()
  • 1.
  • 2.
  • 3.
  • 4.

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

static int
zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, int offset)
{
    ...
    // 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;
    ...
    return ret;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.

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

  • 获取需要进行压缩的内存,需要进行压缩的内存由 swap 机制提供。
  • 通过 zcomp_compress() 函数对内存进行压缩,src 指针指向压缩后的内存地址。
  • 通过 zs_malloc() 和 zs_map_object() 函数申请一块新的内存块,大小为压缩后数据的大小。
  • 将压缩后的数据复制到新申请的内存块中。
  • 将压缩后的数据记录到 zRAM 块设备的表格中。

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

一图胜千言:

图片图片

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

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

3.2ZRAM性能优化方式

(1)模拟块设备

从技术实现的角度来看,ZRAM 本质上是一个非常独特的块设备驱动 。它采用了一种巧妙的方式,使用内存来模拟 block device,也就是块设备。在整个系统的内存管理体系中,ZRAM 将内存回收的重要策略放心地交给内存管理模块,因为内存管理模块在长期的发展和优化中,已经具备了非常成熟和高效的内存回收算法,能够根据系统的实际运行情况,合理地回收不再使用的内存资源,确保系统内存的高效利用。

对于压缩和解压缩这一关键的操作环节,ZRAM 则依赖于专业的压缩库。这些压缩库经过精心设计和优化,拥有多种高效的压缩算法,能够根据不同的数据类型和特点,选择最合适的压缩方式,在保证数据完整性的前提下,尽可能地提高压缩率,减少数据占用的内存空间。同时,在需要使用数据时,压缩库也能够快速地将压缩数据解压缩,恢复成原始数据,满足应用程序的使用需求。

而 ZRAM 自身的内存分配工作,则由 zsmalloc 负责。zsmalloc 是专门为 ZRAM 设计的内存分配器,它充分考虑了 ZRAM 在内存紧张环境下的工作需求。在内存紧张时,传统的内存分配器可能会因为高阶内存分配不到而失败,导致 ZRAM 无法正常工作。但 zsmalloc 通过独特的设计,能够在这种情况下更好地工作,它尝试将多个相同大小的对象存放在组合页(称为 zspage)中,并且这个组合页不要求物理连续,从而大大提高了内存的使用率,确保 ZRAM 在内存紧张的情况下也能稳定运行 。

(2)数据压缩存储

当应用程序在运行过程中产生内存页时,这些内存页首先会被传递到 ZRAM 模块。ZRAM 模块会对这些内存页进行仔细的分析和处理,然后运用高效的压缩算法对其进行压缩。以 Android 手机为例,当你连续打开多个应用时,系统的空闲内存会持续下降。此时,ZRAM 就会发挥它的强大作用,它会把最近最少使用的页面识别出来,比如淘宝应用的页面,如果它是最近最少使用的,原本占用 100M 的匿名页,经过 ZRAM 的压缩算法处理后,可能只需要占用 40M 的空间,通过这样的压缩操作,一下子就节省了 60M 的内存空间 。

压缩后的内存页会被存储到 zram 块设备中,这个过程就像是把整理好的物品存放到一个专门的仓库里。当应用程序后续需要访问这些内存页时,ZRAM 会快速响应。它首先会检查所需的数据是否已经在 zram 块设备中,如果存在,就直接从 zram 块设备中读取压缩数据,然后迅速进行解压缩操作,将解压缩后的数据返回给应用程序使用。整个过程非常高效,对于应用程序来说,几乎感觉不到数据是从经过压缩存储的 zram 块设备中获取的,就好像这些数据一直都在正常的内存中随时可供使用一样 。

(3)多数据流并发优化

在早期的内核版本中,对压缩流的设置相对较为单一。例如在 3.15 老版本内核中,虽然提供了接口给上层设置最大压缩流,但这种设置方式在实际应用中存在一定的局限性,无法充分满足系统对于并发性能的需求。随着技术的不断发展和对系统性能要求的不断提高,从 4.19 内核开始,底层内核做出了重大改进,针对各个 CPU 都配置了一个压缩数据流 。

这样做的主要目的是为了极大地优化系统中并发的情况。当系统中有多个写压缩操作同时发生时,每个操作都能够独享一个压缩数据流。通过这种多数据流的设计方式,系统能够同时处理多个并发的压缩操作,大大提高了系统在高并发场景下的处理能力和效率。

举例来说,当你的电脑在同时运行多个大型软件,每个软件都有大量的数据需要进行内存压缩处理时,多数据流并发优化机制就能够让这些软件的压缩操作同时高效进行,避免了因为压缩流不足而导致的操作等待和系统卡顿,确保系统在复杂的多任务环境下依然能够保持流畅运行 。

四、ZRAM技术的优势及应用场景

4.1ZRAM 技术的优势

(1)提升系统性能

在内存不足的设备上,ZRAM 技术就像是一位救星,能够显著提升系统的性能 。与传统的磁盘 swap 相比,ZRAM 具有无可比拟的速度优势。传统磁盘 swap 在内存不足时,会将内存数据转移到硬盘的交换空间中,而硬盘的读写速度远远低于内存。在这种情况下,系统的响应速度会变得极为迟缓,就像一辆原本高速行驶的汽车突然陷入了泥潭,每一个操作都变得艰难无比。

而 ZRAM 技术则另辟蹊径,它将压缩后的数据存储在内存中,这就避免了磁盘 I/O 操作带来的巨大延迟 。当系统需要调用被交换出去的数据时,ZRAM 能够在极短的时间内将压缩数据解压并返回给应用程序,使得系统的响应速度大幅提升。以一款老旧的 PC 电脑为例,它的内存较小,在同时运行多个程序时,传统磁盘 swap 会让系统卡顿得几乎无法操作。

但在启用 ZRAM 技术后,即使打开多个大型文档、运行音乐播放器和浏览器等多个程序,系统依然能够保持相对流畅的运行,程序之间的切换也变得迅速,大大提高了用户的工作和娱乐效率 。

(2)提高内存利用率

ZRAM 技术通过其独特的压缩技术,能够在有限的内存空间中存储更多的数据,从而有效地 “扩大” 了可用内存容量 。这一优势在实际应用中表现得非常明显。比如,在一台配备 4GB 内存的电脑上,同时运行多个应用程序时,内存很快就会被占满。假设一个应用程序占用 500MB 的内存空间,在没有 ZRAM 技术的情况下,这 4GB 内存可能只能容纳 8 个这样的应用程序。

但当启用 ZRAM 技术后,通过压缩算法,原本占用 500MB 内存的应用程序,经过压缩后可能只需要占用 200MB 的内存空间 。这样一来,同样是 4GB 的内存,就可以容纳 20 个这样经过压缩存储的应用程序,大大提高了内存的利用率,使得系统可以在内存压力下运行更多的进程,用户也能够更加自由地进行多任务操作,无需频繁关闭应用程序来释放内存 。

(3)延长存储设备寿命

对于使用 SSD 或嵌入式存储设备的用户来说,ZRAM 技术还有一个重要的优势,那就是能够延长存储设备的使用寿命 。在传统的内存管理方式中,当内存不足时,系统会频繁地将内存数据写入硬盘的交换空间,也就是我们常说的 Swap 分区。这种频繁的读写操作会对硬盘造成较大的损耗,尤其是对于 SSD 这种有写入寿命限制的存储设备来说,频繁的写入操作会加速其老化,缩短其使用寿命 。

而 ZRAM 技术的出现,改变了这一局面。它将数据压缩后存储在内存中,减少了对硬盘的读写次数 。以一款使用 SSD 的笔记本电脑为例,在日常使用中,如果频繁进行大文件的读写、多任务处理等操作,没有 ZRAM 技术时,硬盘的读写次数会非常频繁,可能在几年后就会出现性能下降甚至损坏的情况。但当启用 ZRAM 技术后,大部分的内存交换操作都在内存中完成,大大减少了对硬盘的依赖,从而有效地延长了硬盘的使用寿命,让用户能够更长时间地享受稳定的存储服务 。

4.2ZRAM 技术的应用场景

(1)嵌入式设备

在嵌入式设备的领域中,内存和存储资源常常面临着极为紧张的局面。以常见的智能摄像头为例,这类设备通常被设计得小巧轻便,以便于安装和使用,这就导致其内部空间有限,无法容纳大容量的内存和存储设备。然而,智能摄像头需要实时处理大量的图像数据,包括图像采集、编码、传输以及存储等多个环节,这些操作都对内存和存储有着较高的需求 。

在这种内存和存储受限的情况下,ZRAM 技术就成为了提升设备性能的关键。当智能摄像头的内存空间不足时,ZRAM 能够迅速介入,将暂时不用的内存数据进行高效压缩,然后存储在 ZRAM 设备中。这样一来,不仅避免了频繁的磁盘 I/O 操作,因为磁盘的读写速度相对较慢,频繁操作会严重影响设备的响应速度,而且还能减少对存储设备的磨损。对于嵌入式设备中常用的闪存等存储介质来说,其写入寿命是有限的,频繁的写入操作会加速其老化,而 ZRAM 技术通过减少磁盘 I/O,有效地延长了存储设备的使用寿命,使得智能摄像头能够更加稳定、持久地运行 。

(2)Android 系统

Android 系统作为全球使用最为广泛的移动操作系统之一,其用户数量庞大,应用场景也极为丰富。在日常使用中,用户常常会同时打开多个应用程序,例如在浏览新闻资讯的同时,还会接收社交软件的消息通知,并且可能后台运行着音乐播放、地图导航等应用。这种多任务的使用场景对手机的内存管理提出了极高的要求,如果内存管理不善,就容易出现应用卡顿、闪退等问题,严重影响用户体验 。

为了解决这一难题,Android 系统从 4.4 版本开始默认采用了 ZRAM 技术。当用户在手机上开启多个应用导致内存紧张时,ZRAM 技术就会发挥作用。它会自动识别出那些最近最少使用的应用程序所占用的内存页面,然后对这些页面进行压缩处理。例如,当你打开了微信、淘宝、抖音等多个应用后,系统内存逐渐减少,ZRAM 会将微信中暂时不用的聊天记录页面、淘宝的商品缓存页面等进行压缩,原本占用较大内存空间的这些页面,经过压缩后占用的内存大幅减少。这样,就为其他正在运行的应用程序释放出了更多的内存空间,使得手机在多任务场景下依然能够保持较为流畅的运行,应用之间的切换也更加迅速,大大提升了用户的使用体验 。

(3)内存受限的老旧 PC

随着科技的飞速发展,计算机硬件的更新换代速度越来越快。然而,对于许多用户来说,手中的老旧 PC 由于各种原因,如预算有限、对电脑性能要求不高等,仍然在继续使用。这些老旧 PC 往往存在内存容量较小的问题,例如早期的电脑可能只有 1GB 或 2GB 的内存 。

在当今的软件环境下,许多应用程序对内存的需求越来越高。一款普通的办公软件在运行时可能就需要占用几百 MB 的内存,而如果再同时打开浏览器、音乐播放器等多个程序,内存很快就会被耗尽,导致电脑运行缓慢,甚至出现死机的情况。此时,ZRAM 技术就为这些老旧 PC 提供了一种经济实惠且有效的性能改善方案。通过启用 ZRAM 技术,老旧 PC 可以在不增加硬件成本的前提下,将一部分内存空间划分出来作为 ZRAM 设备。当内存不足时,系统将暂时不用的数据压缩后存储到 ZRAM 设备中,从而在一定程度上缓解内存压力,使得电脑能够更加流畅地运行多个应用程序,满足用户日常办公、娱乐等基本需求 。

责任编辑:武晓燕 来源: 深度Linux
相关推荐

2011-03-23 13:00:22

SQL Server虚拟内存

2010-07-05 08:57:48

SQL Server虚

2009-07-14 18:26:49

MyEclipse内存

2020-03-18 19:00:29

电脑内存不足系统

2014-02-27 13:30:26

CacheLinux系统内存不足

2021-04-26 13:52:36

索尼Linux内存

2010-09-27 11:12:46

MyEclipseJVM内存

2018-12-18 14:53:04

内存进程子进程

2010-06-30 16:09:06

2010-06-30 08:46:40

Visual Stud

2011-08-03 16:36:07

Win7磁盘配额

2019-02-20 13:13:31

Windows 10内存不足错误

2010-09-25 14:12:50

Java内存分配

2011-08-04 18:17:44

Oracle数据库共享内存

2010-09-17 10:04:36

2021-11-15 23:47:19

手机内存技术

2022-02-09 21:27:15

KubernetesDocker容器

2019-09-27 08:25:48

Android Go智能手机谷歌

2010-06-17 18:17:36

UML面向对象技术
点赞
收藏

51CTO技术栈公众号