輕松解決內(nèi)存不足問題:ZRAM技術全面解析
在當今數(shù)字化時代,電子設備已成為我們生活中不可或缺的一部分。無論是手機、電腦還是平板,它們?yōu)槲覀兊墓ぷ?、學習和娛樂提供了極大的便利。然而,一個讓眾多用戶頭疼不已的問題卻如影隨形 —— 內(nèi)存不足。
想象一下這樣的場景:你正在手機上一邊與同事激烈地討論工作方案,一邊查閱重要資料,還時不時地切換到社交軟件回復朋友的消息。突然,手機屏幕一滯,操作變得遲緩起來,每點擊一次都要等待許久才有反應,甚至有些應用還會直接閃退。這種情況是不是讓你心急如焚,工作效率大打折扣?又或者,當你在電腦上滿心歡喜地打開一款期待已久的大型游戲,準備盡情享受沉浸式的娛樂時光時,電腦卻像是老牛拉破車一般,運行得極為吃力,畫面卡頓,聲音也斷斷續(xù)續(xù),原本的快樂瞬間化為烏有。
這些令人沮喪的狀況,歸根結(jié)底都是內(nèi)存不足在作祟。隨著我們對電子設備依賴程度的加深,日常使用中所運行的應用程序數(shù)量越來越多,對內(nèi)存的需求也水漲船高。當內(nèi)存無法滿足這些程序同時運行的需求時,設備就會陷入卡頓甚至死機的困境,嚴重影響我們的使用體驗。為了解決這一難題,技術人員們不斷探索創(chuàng)新,而 ZRAM 技術便是其中的一項重要突破 。
一、ZRAM技術簡介
1.1概述
內(nèi)存是計算機系統(tǒng)最重要的資源之一,當操作系統(tǒng)內(nèi)存不足時,進程申請內(nèi)存將會失敗,從而導致其運行異?;蛘弑罎?。zram swap 主要原理就是從內(nèi)存分配一塊區(qū)域出來用作 swap 分區(qū),每次如果內(nèi)存空間不夠了,不是把應用程序殺掉,而是把應用程序所占用的內(nèi)存數(shù)據(jù)復制到 swap 分區(qū),等切換回來的時候就可以直接把這部分數(shù)據(jù)恢復到內(nèi)存當中,節(jié)省重新開啟所需的時間。
而被放到 swap 分區(qū)的應用程序,所占用的內(nèi)存都是被壓縮過的,比如,微信在普通內(nèi)存中占用 50 MB 的空間,如果壓縮率為 0.4,則放到 swap 分區(qū)里面的數(shù)據(jù)只需要 20 MB 的空間,這樣 swap 分區(qū)里面就可以存放更多后臺臨時不用的應用程序,變相擴展了內(nèi)存的大小。
通過 swap 機制,系統(tǒng)可以將內(nèi)存分配給需求更迫切的進程。但由于 swap 機制需要進行 I/O 操作,所以一定程度上會影響系統(tǒng)性能。那么是否存在一種能夠節(jié)省內(nèi)存,而且對性能影響較少的機制呢?
在 Linux-3.14 引入了一種名為 zRAM 的技術,zRAM 的原理是:將進程不常用的內(nèi)存壓縮存儲,從而達到節(jié)省內(nèi)存的使用。如下圖所示:
圖片
zRAM 機制建立在 swap 機制之上,swap 機制是將進程不常用的內(nèi)存交換到磁盤中,而 zRAM 機制是將進程不常用的內(nèi)存壓縮存儲在內(nèi)存某個區(qū)域。所以 zRAM 機制并不會發(fā)生 I/O 操作,從而避免因 I/O 操作導致的性能下降。
1.2ZRAM 技術是什么
ZRAM,這個聽起來有些神秘的技術,實際上是 Linux 內(nèi)核提供的一項虛擬內(nèi)存壓縮功能。簡單來說,它就像是一個聰明的 “內(nèi)存管家”,能夠在內(nèi)存緊張時大顯身手 。在計算機的世界里,當物理內(nèi)存不足時,系統(tǒng)通常會將一些暫時不用的數(shù)據(jù)轉(zhuǎn)移到硬盤的交換空間中,這個過程被稱為磁盤分頁。然而,硬盤的讀寫速度與內(nèi)存相比,簡直是天壤之別,這就導致一旦頻繁進行磁盤分頁,設備的運行速度會大幅下降,出現(xiàn)嚴重的卡頓現(xiàn)象。
ZRAM 的出現(xiàn),巧妙地解決了這一難題。它通過在 RAM 內(nèi)創(chuàng)建一個壓縮塊設備,將那些暫時不用的內(nèi)存數(shù)據(jù)進行壓縮后存儲在這個設備上,也就是我們所說的分頁。這樣一來,在需要交換或分頁時,系統(tǒng)優(yōu)先使用 ZRAM 這個壓縮塊設備,而不是直接使用硬盤上的交換空間,從而避免了在磁盤上進行分頁,大大提高了性能。形象地講,ZRAM 就像是給內(nèi)存增加了一個 “壓縮倉庫”,當內(nèi)存里的東西太多放不下時,就把一些不太常用的東西壓縮后放進這個 “倉庫” 里,等到需要使用的時候,再把它們解壓取出來。而且,由于這個 “倉庫” 就在內(nèi)存里面,存取速度比從硬盤中讀取要快得多,這就使得設備在內(nèi)存緊張的情況下依然能夠保持較為流暢的運行 。
從技術原理上看,ZRAM 利用了內(nèi)存的快速讀寫特性和數(shù)據(jù)壓縮算法。當系統(tǒng)檢測到內(nèi)存壓力時,會將一部分內(nèi)存頁面數(shù)據(jù)傳遞給 ZRAM 模塊。ZRAM 模塊會對這些數(shù)據(jù)進行壓縮,然后將壓縮后的數(shù)據(jù)存儲在預先分配好的內(nèi)存區(qū)域中,這個區(qū)域就形成了一個虛擬的塊設備,類似于磁盤分區(qū),但速度卻比磁盤快很多。當應用程序需要訪問這些被壓縮的數(shù)據(jù)時,ZRAM 會及時將其解壓并返回給應用程序,整個過程對于應用程序來說是透明的,就好像這些數(shù)據(jù)一直都在正常的內(nèi)存中一樣 。
二、ZRAM 技術的工作原理
由于zRAM 機制是建立在swap機制之上,而 swap 機制需要配置 文件系統(tǒng) 或 塊設備 來完成的。所以 zRAM 虛擬一個塊設備,當系統(tǒng)內(nèi)存不足時,swap 機制將內(nèi)存寫入到這個虛擬的塊設備中。也就是說,zRAM 機制本質(zhì)上只是一個虛擬塊設備。
zRAM 的原理如下圖所示:
圖片
從上圖可以看出,在開啟了 zRAM 機制的情況下,當系統(tǒng)內(nèi)存不足時,內(nèi)核會進行如下操作:
- 通過 swap 機制從系統(tǒng)中查找一些進程不常用的內(nèi)存。
- 將這些不常用的內(nèi)存交換到 zRAM 塊設備中,而 zRAM 塊設備首先會對這些不常用的內(nèi)存進行壓縮,然后存儲起來。
- 把不常用的內(nèi)存壓縮存儲到 zRAM 塊設備后,swap 機制會把這些不常用的內(nèi)存歸還給內(nèi)核。
- 當進程訪問到這些被交換到 zRAM 塊設備的內(nèi)存時,swap 機制將會通過 zRAM 塊設備解壓這些內(nèi)存,并且重新建立與進程的地址映射關系。
2.1zram配置步驟
(1)內(nèi)核配置
3.15 之前版本的 kernel
Device Drivers -> Staging drivers (STAGING [=y])
3.15 及之后版本的 kernel
Device Drivers -> [*] Block devices -> Compressed RAM block device support
具體的配置項如下:
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
(2)zram 塊設備個數(shù)設定
如果是將 zram 編譯成模塊,則可以使用下面命令動態(tài)加載,這個命令會創(chuàng)建 4 個設備 /dev/zram{0,1,2,3}
modprobe zram num_devices=4
如果是直接將 zram 編譯到內(nèi)核,那只能在代碼里面直接修改 num_devices,3.15 之前的版本代碼路徑是 drivers/staging/zram/zram_drv.c,3.15 及之后的版本代碼路徑是 ./drivers/block/zram/zram_drv.c ,默認 zram 設備個數(shù)是一個。
(3)壓縮流的最大個數(shù)設定
這個是 3.15 版本及以后的 kernel 新加入的功能,3.15 版本之前的 zram 壓縮都是使用一個壓縮流(緩存 buffer 和算法私有部分)實現(xiàn),每個寫(壓縮)操作都會獨享壓縮流,但是單壓縮流如果出現(xiàn)數(shù)據(jù)奔潰或者卡住的現(xiàn)象,所有的寫(壓縮)操作將一直處于等待狀態(tài),這樣效率非常低;而多壓縮流的架構會讓寫(壓縮)操作可以并行去執(zhí)行,大大提高了壓縮的效率和穩(wěn)定性。
查看壓縮流的最大個數(shù),默認是1
cat /sys/block/zram0/max_comp_streams
設定壓縮流的最大個數(shù)
echo 3 > /sys/block/zram0/max_comp_streams
(4)壓縮算法選擇
查看目前支持的壓縮算法
cat /sys/block/zram0/comp_algorithm
lzo [lz4]
修改壓縮算法
echo lzo > /sys/block/zram0/comp_algorithm
(5)zram 內(nèi)存大小設定
分配部分內(nèi)存作為 zram ,大小建議為總內(nèi)存的 10%-25% 。
可以使用數(shù)值直接設置內(nèi)存大小,單位是 bytes
echo $((512*1024*1024)) > /sys/block/zram0/disksize
也可以使用帶內(nèi)存單位作為后綴的方式設置內(nèi)存大小
(6)啟用 zram 設備為 swap
mkswap /dev/zram0
swapon /dev/zram0
(7)具體的 zram 相關對外接口說明
圖片
(8)系統(tǒng)運行之后的內(nèi)存統(tǒng)計情況
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
從 Line 14,15 可以看到 swap 相關的統(tǒng)計信息,SwapTotal 的大小就是 zram 設備的大小,當系統(tǒng)開啟了一段時間之后,就會將后臺的一些優(yōu)先級低的應用數(shù)據(jù)(匿名頁面)壓縮存放到 swap 區(qū),然后再重新打開這些應用的時候,再從 swap 區(qū)將它們的數(shù)據(jù)解壓出來。在 Android KitKat 版本之前,Android 設備因為沒有 zram,所以查看 /proc/meinfo 看到的 swap 分區(qū)的大小和統(tǒng)計數(shù)據(jù)都會是零。
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)
Line 5 也可以看到 swap 相關的統(tǒng)計信息,如果需要查看具體某個進程使用了多少 swap 空間,可以通過dumpsys meminfo pid(該進程的 id 號)查看。
2.2啟用zRAM
(1)創(chuàng)建 zRAM 塊設備
要啟用 zRAM,首先需要創(chuàng)建 zRAM 塊設備。要創(chuàng)建 zRAM 塊設備,可以使用以下命令:
modprobe zram num_devices=1
num_devices 參數(shù)可以指定創(chuàng)建 zRAM 塊設備的個數(shù),上面命令創(chuàng)建了一個 zRAM 塊設備,可以通過路徑 /dev/zram0 來訪問這個塊設備。
(2)設置 zRAM 塊設備的大小
創(chuàng)建完 zRAM 塊設備后,可以通過以下命令來設置其空間大小:
echo 512M > /sys/block/zram0/disksize
上面命令設置了 zram0 的大小為 512MB,也就是說, zram0 能夠存儲 512MB 壓縮后的數(shù)據(jù)。
(3)壓縮算法選擇
zRAM 機制支持多種壓縮算法,不同的壓縮算法有不同的壓縮比率和壓縮速度,用戶可以按照自身的需求來選擇不同的壓縮算法。
要更改 zRAM 的壓縮算法,可以使用下面命令:
echo lzo > /sys/block/zram0/comp_algorithm
上面命令將 zRAM 的壓縮算法更改為 lzo
,我們也可以通過下面命令來查看內(nèi)核支持哪些壓縮算法:
cat /sys/block/zram0/comp_algorithm
lzo [lz4]
從上面命令的輸出可知,內(nèi)核支持 lzo 和 lz4 兩種壓縮算法。
(4)將 swap 交換設備設置為 zRAM
要將 swap 的交換設備設置為 zRAM 塊設備,可以使用以下命令:
mkswap /dev/zram0
當執(zhí)行完上面這條命令后,內(nèi)核將會使用 zram0
作為 swap 的交換設備。
三、zRAM技術的實現(xiàn)
zRAM 塊設備驅(qū)動的實現(xiàn)代碼主要在 drivers/block/zram/zram_drv.c
文件中,下面我們主要圍繞此文件進行分析。
本文并不會介紹塊設備驅(qū)動的編寫流程,只會分析 swap 機制在進行內(nèi)存交換時,與 zRAM 塊設備驅(qū)動的交互。
3.1壓縮內(nèi)存
當系統(tǒng)內(nèi)存不足時,內(nèi)核將會觸發(fā) swap
機制。swap 機制首先會從系統(tǒng)中選擇一些進程不常用內(nèi)存,然后將這些不常用的內(nèi)存交換到 zRAM
塊設備中(使用 zRAM 塊設備作為交換設備的情況下)。
當 swap 機制將不常用的內(nèi)存交換到 zRAM 塊設備時,會調(diào)用 zram_make_request() 函數(shù)處理請求。而 zram_make_request() 最終會通過調(diào)用 zram_bvec_write() 函數(shù)來壓縮內(nèi)存,調(diào)用鏈如下:
zram_make_request()
-> __zram_make_request()
-> zram_bvec_rw()
-> zram_bvec_write()
我們來分析一下 zram_bvec_write() 函數(shù)的實現(xiàn),其代碼如下:
static int
zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, int offset)
{
...
// 1. 獲取需要進行壓縮的內(nèi)存
page = bvec->bv_page;
...
user_mem = kmap_atomic(page);
uncmem = user_mem;
...
// 2. 對內(nèi)存進行壓縮
ret = zcomp_compress(zram->comp, zstrm, uncmem, &clen);
...
// 3. 獲取壓縮后的數(shù)據(jù)
src = zstrm->buffer;
...
// 4. 申請一個內(nèi)存塊保存壓縮后的數(shù)據(jù)
handle = zs_malloc(meta->mem_pool, clen);
...
cmem = zs_map_object(meta->mem_pool, handle, ZS_MM_WO);
// 5. 將壓縮后的數(shù)據(jù)保存到新申請的內(nèi)存塊中
memcpy(cmem, src, clen);
...
// 6. 將壓縮后的數(shù)據(jù)登記到 zRAM 塊設備的表格中
meta->table[index].handle = handle;
...
return ret;
}
為了簡化分析過程,我們對代碼進行精簡。從上面的代碼可以看出,zRAM 機制對內(nèi)存進行壓縮的步驟如下:
- 獲取需要進行壓縮的內(nèi)存,需要進行壓縮的內(nèi)存由 swap 機制提供。
- 通過 zcomp_compress() 函數(shù)對內(nèi)存進行壓縮,src 指針指向壓縮后的內(nèi)存地址。
- 通過 zs_malloc() 和 zs_map_object() 函數(shù)申請一塊新的內(nèi)存塊,大小為壓縮后數(shù)據(jù)的大小。
- 將壓縮后的數(shù)據(jù)復制到新申請的內(nèi)存塊中。
- 將壓縮后的數(shù)據(jù)記錄到 zRAM 塊設備的表格中。
由于 zRAM 塊設備是建立在內(nèi)存中的虛擬塊設備,所以其并沒有真實塊設備的特性。真實塊設備會將存儲空間劃分成一個個塊,而 zram_bvec_write() 函數(shù)的 index 參數(shù)就是數(shù)據(jù)塊的編號。此參數(shù)有 swap 機制提供,所以 zRAM 塊設備驅(qū)動通過 index 參數(shù)作為原始內(nèi)存數(shù)據(jù)的編號。
一圖勝千言:
圖片
zRAM驅(qū)動有個數(shù)據(jù)塊表,用來記錄原始內(nèi)存數(shù)據(jù)對應的壓縮數(shù)據(jù),此表的索引就是數(shù)據(jù)塊的編號。swap 機制會維護此表格的使用情況,如哪個塊是空閑的,哪個塊被占用等。
當內(nèi)存頁被壓縮后,swap 機制將會把原來的內(nèi)存頁釋放掉,并且把所有映射到此內(nèi)存頁的進程解除映射,細節(jié)可以參考 swap 機制相關的資料。
3.2ZRAM性能優(yōu)化方式
(1)模擬塊設備
從技術實現(xiàn)的角度來看,ZRAM 本質(zhì)上是一個非常獨特的塊設備驅(qū)動 。它采用了一種巧妙的方式,使用內(nèi)存來模擬 block device,也就是塊設備。在整個系統(tǒng)的內(nèi)存管理體系中,ZRAM 將內(nèi)存回收的重要策略放心地交給內(nèi)存管理模塊,因為內(nèi)存管理模塊在長期的發(fā)展和優(yōu)化中,已經(jīng)具備了非常成熟和高效的內(nèi)存回收算法,能夠根據(jù)系統(tǒng)的實際運行情況,合理地回收不再使用的內(nèi)存資源,確保系統(tǒng)內(nèi)存的高效利用。
對于壓縮和解壓縮這一關鍵的操作環(huán)節(jié),ZRAM 則依賴于專業(yè)的壓縮庫。這些壓縮庫經(jīng)過精心設計和優(yōu)化,擁有多種高效的壓縮算法,能夠根據(jù)不同的數(shù)據(jù)類型和特點,選擇最合適的壓縮方式,在保證數(shù)據(jù)完整性的前提下,盡可能地提高壓縮率,減少數(shù)據(jù)占用的內(nèi)存空間。同時,在需要使用數(shù)據(jù)時,壓縮庫也能夠快速地將壓縮數(shù)據(jù)解壓縮,恢復成原始數(shù)據(jù),滿足應用程序的使用需求。
而 ZRAM 自身的內(nèi)存分配工作,則由 zsmalloc 負責。zsmalloc 是專門為 ZRAM 設計的內(nèi)存分配器,它充分考慮了 ZRAM 在內(nèi)存緊張環(huán)境下的工作需求。在內(nèi)存緊張時,傳統(tǒng)的內(nèi)存分配器可能會因為高階內(nèi)存分配不到而失敗,導致 ZRAM 無法正常工作。但 zsmalloc 通過獨特的設計,能夠在這種情況下更好地工作,它嘗試將多個相同大小的對象存放在組合頁(稱為 zspage)中,并且這個組合頁不要求物理連續(xù),從而大大提高了內(nèi)存的使用率,確保 ZRAM 在內(nèi)存緊張的情況下也能穩(wěn)定運行 。
(2)數(shù)據(jù)壓縮存儲
當應用程序在運行過程中產(chǎn)生內(nèi)存頁時,這些內(nèi)存頁首先會被傳遞到 ZRAM 模塊。ZRAM 模塊會對這些內(nèi)存頁進行仔細的分析和處理,然后運用高效的壓縮算法對其進行壓縮。以 Android 手機為例,當你連續(xù)打開多個應用時,系統(tǒng)的空閑內(nèi)存會持續(xù)下降。此時,ZRAM 就會發(fā)揮它的強大作用,它會把最近最少使用的頁面識別出來,比如淘寶應用的頁面,如果它是最近最少使用的,原本占用 100M 的匿名頁,經(jīng)過 ZRAM 的壓縮算法處理后,可能只需要占用 40M 的空間,通過這樣的壓縮操作,一下子就節(jié)省了 60M 的內(nèi)存空間 。
壓縮后的內(nèi)存頁會被存儲到 zram 塊設備中,這個過程就像是把整理好的物品存放到一個專門的倉庫里。當應用程序后續(xù)需要訪問這些內(nèi)存頁時,ZRAM 會快速響應。它首先會檢查所需的數(shù)據(jù)是否已經(jīng)在 zram 塊設備中,如果存在,就直接從 zram 塊設備中讀取壓縮數(shù)據(jù),然后迅速進行解壓縮操作,將解壓縮后的數(shù)據(jù)返回給應用程序使用。整個過程非常高效,對于應用程序來說,幾乎感覺不到數(shù)據(jù)是從經(jīng)過壓縮存儲的 zram 塊設備中獲取的,就好像這些數(shù)據(jù)一直都在正常的內(nèi)存中隨時可供使用一樣 。
(3)多數(shù)據(jù)流并發(fā)優(yōu)化
在早期的內(nèi)核版本中,對壓縮流的設置相對較為單一。例如在 3.15 老版本內(nèi)核中,雖然提供了接口給上層設置最大壓縮流,但這種設置方式在實際應用中存在一定的局限性,無法充分滿足系統(tǒng)對于并發(fā)性能的需求。隨著技術的不斷發(fā)展和對系統(tǒng)性能要求的不斷提高,從 4.19 內(nèi)核開始,底層內(nèi)核做出了重大改進,針對各個 CPU 都配置了一個壓縮數(shù)據(jù)流 。
這樣做的主要目的是為了極大地優(yōu)化系統(tǒng)中并發(fā)的情況。當系統(tǒng)中有多個寫壓縮操作同時發(fā)生時,每個操作都能夠獨享一個壓縮數(shù)據(jù)流。通過這種多數(shù)據(jù)流的設計方式,系統(tǒng)能夠同時處理多個并發(fā)的壓縮操作,大大提高了系統(tǒng)在高并發(fā)場景下的處理能力和效率。
舉例來說,當你的電腦在同時運行多個大型軟件,每個軟件都有大量的數(shù)據(jù)需要進行內(nèi)存壓縮處理時,多數(shù)據(jù)流并發(fā)優(yōu)化機制就能夠讓這些軟件的壓縮操作同時高效進行,避免了因為壓縮流不足而導致的操作等待和系統(tǒng)卡頓,確保系統(tǒng)在復雜的多任務環(huán)境下依然能夠保持流暢運行 。
四、ZRAM技術的優(yōu)勢及應用場景
4.1ZRAM 技術的優(yōu)勢
(1)提升系統(tǒng)性能
在內(nèi)存不足的設備上,ZRAM 技術就像是一位救星,能夠顯著提升系統(tǒng)的性能 。與傳統(tǒng)的磁盤 swap 相比,ZRAM 具有無可比擬的速度優(yōu)勢。傳統(tǒng)磁盤 swap 在內(nèi)存不足時,會將內(nèi)存數(shù)據(jù)轉(zhuǎn)移到硬盤的交換空間中,而硬盤的讀寫速度遠遠低于內(nèi)存。在這種情況下,系統(tǒng)的響應速度會變得極為遲緩,就像一輛原本高速行駛的汽車突然陷入了泥潭,每一個操作都變得艱難無比。
而 ZRAM 技術則另辟蹊徑,它將壓縮后的數(shù)據(jù)存儲在內(nèi)存中,這就避免了磁盤 I/O 操作帶來的巨大延遲 。當系統(tǒng)需要調(diào)用被交換出去的數(shù)據(jù)時,ZRAM 能夠在極短的時間內(nèi)將壓縮數(shù)據(jù)解壓并返回給應用程序,使得系統(tǒng)的響應速度大幅提升。以一款老舊的 PC 電腦為例,它的內(nèi)存較小,在同時運行多個程序時,傳統(tǒng)磁盤 swap 會讓系統(tǒng)卡頓得幾乎無法操作。
但在啟用 ZRAM 技術后,即使打開多個大型文檔、運行音樂播放器和瀏覽器等多個程序,系統(tǒng)依然能夠保持相對流暢的運行,程序之間的切換也變得迅速,大大提高了用戶的工作和娛樂效率 。
(2)提高內(nèi)存利用率
ZRAM 技術通過其獨特的壓縮技術,能夠在有限的內(nèi)存空間中存儲更多的數(shù)據(jù),從而有效地 “擴大” 了可用內(nèi)存容量 。這一優(yōu)勢在實際應用中表現(xiàn)得非常明顯。比如,在一臺配備 4GB 內(nèi)存的電腦上,同時運行多個應用程序時,內(nèi)存很快就會被占滿。假設一個應用程序占用 500MB 的內(nèi)存空間,在沒有 ZRAM 技術的情況下,這 4GB 內(nèi)存可能只能容納 8 個這樣的應用程序。
但當啟用 ZRAM 技術后,通過壓縮算法,原本占用 500MB 內(nèi)存的應用程序,經(jīng)過壓縮后可能只需要占用 200MB 的內(nèi)存空間 。這樣一來,同樣是 4GB 的內(nèi)存,就可以容納 20 個這樣經(jīng)過壓縮存儲的應用程序,大大提高了內(nèi)存的利用率,使得系統(tǒng)可以在內(nèi)存壓力下運行更多的進程,用戶也能夠更加自由地進行多任務操作,無需頻繁關閉應用程序來釋放內(nèi)存 。
(3)延長存儲設備壽命
對于使用 SSD 或嵌入式存儲設備的用戶來說,ZRAM 技術還有一個重要的優(yōu)勢,那就是能夠延長存儲設備的使用壽命 。在傳統(tǒng)的內(nèi)存管理方式中,當內(nèi)存不足時,系統(tǒng)會頻繁地將內(nèi)存數(shù)據(jù)寫入硬盤的交換空間,也就是我們常說的 Swap 分區(qū)。這種頻繁的讀寫操作會對硬盤造成較大的損耗,尤其是對于 SSD 這種有寫入壽命限制的存儲設備來說,頻繁的寫入操作會加速其老化,縮短其使用壽命 。
而 ZRAM 技術的出現(xiàn),改變了這一局面。它將數(shù)據(jù)壓縮后存儲在內(nèi)存中,減少了對硬盤的讀寫次數(shù) 。以一款使用 SSD 的筆記本電腦為例,在日常使用中,如果頻繁進行大文件的讀寫、多任務處理等操作,沒有 ZRAM 技術時,硬盤的讀寫次數(shù)會非常頻繁,可能在幾年后就會出現(xiàn)性能下降甚至損壞的情況。但當啟用 ZRAM 技術后,大部分的內(nèi)存交換操作都在內(nèi)存中完成,大大減少了對硬盤的依賴,從而有效地延長了硬盤的使用壽命,讓用戶能夠更長時間地享受穩(wěn)定的存儲服務 。
4.2ZRAM 技術的應用場景
(1)嵌入式設備
在嵌入式設備的領域中,內(nèi)存和存儲資源常常面臨著極為緊張的局面。以常見的智能攝像頭為例,這類設備通常被設計得小巧輕便,以便于安裝和使用,這就導致其內(nèi)部空間有限,無法容納大容量的內(nèi)存和存儲設備。然而,智能攝像頭需要實時處理大量的圖像數(shù)據(jù),包括圖像采集、編碼、傳輸以及存儲等多個環(huán)節(jié),這些操作都對內(nèi)存和存儲有著較高的需求 。
在這種內(nèi)存和存儲受限的情況下,ZRAM 技術就成為了提升設備性能的關鍵。當智能攝像頭的內(nèi)存空間不足時,ZRAM 能夠迅速介入,將暫時不用的內(nèi)存數(shù)據(jù)進行高效壓縮,然后存儲在 ZRAM 設備中。這樣一來,不僅避免了頻繁的磁盤 I/O 操作,因為磁盤的讀寫速度相對較慢,頻繁操作會嚴重影響設備的響應速度,而且還能減少對存儲設備的磨損。對于嵌入式設備中常用的閃存等存儲介質(zhì)來說,其寫入壽命是有限的,頻繁的寫入操作會加速其老化,而 ZRAM 技術通過減少磁盤 I/O,有效地延長了存儲設備的使用壽命,使得智能攝像頭能夠更加穩(wěn)定、持久地運行 。
(2)Android 系統(tǒng)
Android 系統(tǒng)作為全球使用最為廣泛的移動操作系統(tǒng)之一,其用戶數(shù)量龐大,應用場景也極為豐富。在日常使用中,用戶常常會同時打開多個應用程序,例如在瀏覽新聞資訊的同時,還會接收社交軟件的消息通知,并且可能后臺運行著音樂播放、地圖導航等應用。這種多任務的使用場景對手機的內(nèi)存管理提出了極高的要求,如果內(nèi)存管理不善,就容易出現(xiàn)應用卡頓、閃退等問題,嚴重影響用戶體驗 。
為了解決這一難題,Android 系統(tǒng)從 4.4 版本開始默認采用了 ZRAM 技術。當用戶在手機上開啟多個應用導致內(nèi)存緊張時,ZRAM 技術就會發(fā)揮作用。它會自動識別出那些最近最少使用的應用程序所占用的內(nèi)存頁面,然后對這些頁面進行壓縮處理。例如,當你打開了微信、淘寶、抖音等多個應用后,系統(tǒng)內(nèi)存逐漸減少,ZRAM 會將微信中暫時不用的聊天記錄頁面、淘寶的商品緩存頁面等進行壓縮,原本占用較大內(nèi)存空間的這些頁面,經(jīng)過壓縮后占用的內(nèi)存大幅減少。這樣,就為其他正在運行的應用程序釋放出了更多的內(nèi)存空間,使得手機在多任務場景下依然能夠保持較為流暢的運行,應用之間的切換也更加迅速,大大提升了用戶的使用體驗 。
(3)內(nèi)存受限的老舊 PC
隨著科技的飛速發(fā)展,計算機硬件的更新?lián)Q代速度越來越快。然而,對于許多用戶來說,手中的老舊 PC 由于各種原因,如預算有限、對電腦性能要求不高等,仍然在繼續(xù)使用。這些老舊 PC 往往存在內(nèi)存容量較小的問題,例如早期的電腦可能只有 1GB 或 2GB 的內(nèi)存 。
在當今的軟件環(huán)境下,許多應用程序?qū)?nèi)存的需求越來越高。一款普通的辦公軟件在運行時可能就需要占用幾百 MB 的內(nèi)存,而如果再同時打開瀏覽器、音樂播放器等多個程序,內(nèi)存很快就會被耗盡,導致電腦運行緩慢,甚至出現(xiàn)死機的情況。此時,ZRAM 技術就為這些老舊 PC 提供了一種經(jīng)濟實惠且有效的性能改善方案。通過啟用 ZRAM 技術,老舊 PC 可以在不增加硬件成本的前提下,將一部分內(nèi)存空間劃分出來作為 ZRAM 設備。當內(nèi)存不足時,系統(tǒng)將暫時不用的數(shù)據(jù)壓縮后存儲到 ZRAM 設備中,從而在一定程度上緩解內(nèi)存壓力,使得電腦能夠更加流暢地運行多個應用程序,滿足用戶日常辦公、娛樂等基本需求 。