在 Linux 上用 zram 替代傳統(tǒng)交換空間
我在我的電腦上花了很多時(shí)間(我是說工作),我發(fā)現(xiàn)了很多有趣的東西。其中最近引起我注意的是 ??zram0?
?? 設(shè)備。我是在幾個(gè)月前寫一篇文章時(shí)第一次注意到它,它顯示在 ??lsblk?
? 命令的輸出中:
它被識(shí)別為交換空間,這就是首先引起我的好奇心的原因,所以我做了一些研究。zram 最初被稱為 “壓縮緩存compcache”,即 “壓縮的高速緩存”。事實(shí)證明,zram 是一個(gè)用于創(chuàng)建內(nèi)存內(nèi)壓縮緩存的工具,特別是作為交換空間使用。
但為什么呢?
當(dāng)我開始研究 zram 時(shí),我只發(fā)現(xiàn)了幾篇關(guān)于將 zram 用于交換空間的基礎(chǔ)文章。起初,這對(duì)我來說似乎有點(diǎn)違反直覺。畢竟,如果你的內(nèi)存快用完了,你把頁面交換到內(nèi)存中的虛擬驅(qū)動(dòng)器中,有什么好處呢?
然后我找到了 Fedora 項(xiàng)目的維基頁面,它提議使用 ??zram 交換空間??swap-on-zram。該建議說:“交換是有用的,除了它的速度很慢。zram 是一個(gè)使用了壓縮的內(nèi)存驅(qū)動(dòng)器。在啟動(dòng)時(shí)創(chuàng)建一個(gè) zram 交換空間,并且不再使用默認(rèn)的交換分區(qū)?!?/p>
該頁面的其余部分是關(guān)于它的細(xì)節(jié)、好處、副作用和反饋。
Linux 上用于交換空間的 zram
使用 zram 作為交換空間,與常規(guī)的基于分區(qū)或基于文件的交換空間做的事情相同。當(dāng)內(nèi)存壓力過大時(shí),一些最近使用最少的數(shù)據(jù)會(huì)被移到交換空間。平均來說,它會(huì)被壓縮到其原始大小的 50% 左右,并被放置在內(nèi)存的 zram 空間中。這比將這些內(nèi)存頁存儲(chǔ)在硬盤上要快得多,并可以釋放出它所使用的內(nèi)存用于其他用途。
節(jié)省交換空間
我試圖找到關(guān)于配置多少交換空間或 zram 交換空間的總結(jié)建議。這使我重新回顧了交換空間的設(shè)置,以及我之前的文章《??現(xiàn)代 Linux 系統(tǒng)的正確交換空間是多少???》。就我所知,從 RHEL 和 Fedora 的最新文檔來看,推薦的交換空間數(shù)量并沒有改變。不過,該文檔忽略了 zram 的使用。
然而,在不使用 zram 的舊版 Linux 或 zram 被禁用的情況下,之前文章中的表格仍然為交換空間的分配提供了一個(gè)好的起點(diǎn)。
我找到的關(guān)于 zram 功能的文檔在 zram 如何根據(jù)內(nèi)存大小分配空間,以及分配給 zram 交換空間的數(shù)量方面是不一致的。
由于缺乏權(quán)威性的文檔,我進(jìn)行了一些實(shí)驗(yàn)來憑經(jīng)驗(yàn)確定用于分配 zram 交換空間的算法。我為此使用了我自己的物理和虛擬系統(tǒng)。結(jié)果很有趣,與我迄今為止發(fā)現(xiàn)的任何文檔都不一致。
在所有足夠大的系統(tǒng)上,zram 的默認(rèn)大小是 8GB,但在內(nèi)存較小的主機(jī)上通常會(huì)大大減少。在我用于測(cè)試的一臺(tái)虛擬機(jī)(VM)上,可以訪問 4GB 的內(nèi)存,zram 的虛擬交換空間被分配為 3.8GB。我的一臺(tái)舊戴爾電腦擁有 8GB 的內(nèi)存,zram 被設(shè)置為 7.6GB。當(dāng)內(nèi)存減少到 2GB 時(shí),zram 就減少到 1.9GB。
我擁有的所有內(nèi)存超過 8GB 的物理和虛擬主機(jī)都顯示正好是 8GB 的 zram。這包括我擁有 64GB 內(nèi)存的主工作站和其他擁有 16GB 或 32GB 內(nèi)存的主機(jī)。
基于這幾個(gè)數(shù)據(jù)點(diǎn),我可以得出這樣的結(jié)論:目前的默認(rèn)設(shè)置是最多 8GB 的 zram,而在 8GB 或以下的主機(jī)上,zram 占內(nèi)存的 95%。
我讀過一些文章,其中提到了 zram 交換空間的其他大小,甚至高達(dá) 100% 的內(nèi)存,但這些似乎都是理論上的,而不是現(xiàn)實(shí)。
你的發(fā)行版可能不同,但這里是 Fedora 和類似發(fā)行版的實(shí)際 zram 交換空間的分配情況:
- 內(nèi)存 ? 8 GB:0.95 × 內(nèi)存
- 內(nèi)存 > 8 GB:8 GB
請(qǐng)注意,zram 交換空間大小的算法并沒有基于對(duì)任何給定的現(xiàn)實(shí)世界的系統(tǒng)或應(yīng)用程序的 “最佳” 交換大小的建議。這種 zram 交換空間的分配是一種相當(dāng)概率性的方法,它應(yīng)該在廣泛的 Linux 主機(jī)上運(yùn)行良好。然而,最大的 zram 交換空間大小被配置為 8GB,而且我一直推薦 8GB 作為傳統(tǒng)交換空間的最大容量,我想我可以說它反映了 zram 交換空間的最佳大小。
管理 zram 交換空間
zram 的默認(rèn)值保存在 ??/usr/lib/systemd/zram-generator.conf?
? 配置文件中。以下是我的一個(gè)測(cè)試虛擬機(jī),分配了 5097GB 的內(nèi)存。
你可以在 ??zram-generator.conf?
? 配置文件的最后一行改變默認(rèn)的 zram 交換空間大小。但我建議不要這樣做,除非你能明確說明這樣做的原因,并在你做任何改變后測(cè)試你的結(jié)果。像 Linux 中的許多其他配置默認(rèn)值一樣,zram 的默認(rèn)值已經(jīng)被很好地測(cè)試過了,適合大多數(shù)使用情況。
監(jiān)控 zram
可以使用 ??zramctl?
? 工具來查看 zram 的當(dāng)前狀態(tài)。
傳統(tǒng)的 ??swapon?
? 命令也可以用來查看交換,包括作為交換使用的 zram:
需要注意的是,??zramctl?
? 在不包含數(shù)據(jù)時(shí)不報(bào)告 zram,所以結(jié)果會(huì)包含空輸出。而像 ??lsblk?
?、??swapon?
?、 ??top?
?、??free?
?、??htop?
? 等工具,即使不包含數(shù)據(jù),也會(huì)顯示 zram。
停用 zram
??swapoff -a?
? 命令會(huì)關(guān)閉 zram 交換空間以及用作交換的傳統(tǒng) HDD 或 SSD 存儲(chǔ)。??swapon -a?
? 命令在 zram 為空時(shí)不顯示它,可以使用 ??zramctl /dev/zram0?
? 代替。
注意,??/dev/zram0?
? 在這些命令中并沒有顯示為交換空間,直到它被用于該目的。這給我造成了一些困惑,直到我的實(shí)驗(yàn)表明這是事實(shí)。
創(chuàng)建 zram 交換空間
zram 本身已經(jīng)存在了大約 20 年,但只是在過去的一兩年里才在一些發(fā)行版上作為交換空間使用。你的一些或所有主機(jī)上當(dāng)前的 Linux 環(huán)境可能沒有用 zram 創(chuàng)建交換空間。如果是這種情況,它可以很容易地被補(bǔ)救。
對(duì)于 Fedora 32,它是默認(rèn)使用 zram 交換空間之前的最后一個(gè)版本,它只需要三個(gè)簡單的命令。
首先,驗(yàn)證是否存在 ??zram-swap.service?
? 文件,它作為 ??zram?
? RPM 包的一部分安裝:
接下來,安裝 ??zram-generator-defaults?
? 和 ??zram-generator?
? 軟件包:
啟用并啟動(dòng) ??zram-swap?
? 服務(wù):
然后驗(yàn)證 ??zram0?
? 是否存在并被用作交換空間:
用 zram 改進(jìn)交換空間
這就是全部內(nèi)容了。在 Fedora 上這很容易。不同的發(fā)行版可能也一樣簡單,只是軟件包名稱和命令的細(xì)節(jié)可能不同。在你的電腦上試試 zram 交換空間吧。在我的下一篇文章中,我將進(jìn)一步演示一些 zram 選項(xiàng)。