在 Linux 上用 zram 替代傳統交換空間
zram 是一個用於創建內存壓縮緩存的工具,特別是可以用作交換空間。
我在我的電腦上花了很多時間(我是說工作),我發現了很多有趣的東西。其中最近引起我注意的是 zram0
設備。我是在幾個月前寫一篇文章時第一次注意到它,它顯示在 lsblk
命令的輸出中:
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 931.5G 0 disk
├─sda1 8:1 0 600M 0 part
[...]
zram0 252:0 0 8G 0 disk [SWAP]
它被識別為交換空間,這就是首先引起我的好奇心的原因,所以我做了一些研究。zram 最初被稱為 「 壓縮緩存 」,即 「壓縮的高速緩存」。事實證明,zram 是一個用於創建內存內壓縮緩存的工具,特別是作為交換空間使用。
但為什麼呢?
當我開始研究 zram 時,我只發現了幾篇關於將 zram 用於交換空間的基礎文章。起初,這對我來說似乎有點違反直覺。畢竟,如果你的內存快用完了,你把頁面交換到內存中的虛擬驅動器中,有什麼好處呢?
然後我找到了 Fedora 項目的維基頁面,它提議使用 zram 交換空間 。該建議說:「交換是有用的,除了它的速度很慢。zram 是一個使用了壓縮的內存驅動器。在啟動時創建一個 zram 交換空間,並且不再使用默認的交換分區。」
該頁面的其餘部分是關於它的細節、好處、副作用和反饋。
Linux 上用於交換空間的 zram
使用 zram 作為交換空間,與常規的基於分區或基於文件的交換空間做的事情相同。當內存壓力過大時,一些最近使用最少的數據會被移到交換空間。平均來說,它會被壓縮到其原始大小的 50% 左右,並被放置在內存的 zram 空間中。這比將這些內存頁存儲在硬碟上要快得多,並可以釋放出它所使用的內存用於其他用途。
節省交換空間
我試圖找到關於配置多少交換空間或 zram 交換空間的總結建議。這使我重新回顧了交換空間的設置,以及我之前的文章《現代 Linux 系統的正確交換空間是多少?》。就我所知,從 RHEL 和 Fedora 的最新文檔來看,推薦的交換空間數量並沒有改變。不過,該文檔忽略了 zram 的使用。
然而,在不使用 zram 的舊版 Linux 或 zram 被禁用的情況下,之前文章中的表格仍然為交換空間的分配提供了一個好的起點。
我找到的關於 zram 功能的文檔在 zram 如何根據內存大小分配空間,以及分配給 zram 交換空間的數量方面是不一致的。
由於缺乏權威性的文檔,我進行了一些實驗來憑經驗確定用於分配 zram 交換空間的演算法。我為此使用了我自己的物理和虛擬系統。結果很有趣,與我迄今為止發現的任何文檔都不一致。
在所有足夠大的系統上,zram 的默認大小是 8GB,但在內存較小的主機上通常會大大減少。在我用於測試的一台虛擬機(VM)上,可以訪問 4GB 的內存,zram 的虛擬交換空間被分配為 3.8GB。我的一台舊戴爾電腦擁有 8GB 的內存,zram 被設置為 7.6GB。當內存減少到 2GB 時,zram 就減少到 1.9GB。
我擁有的所有內存超過 8GB 的物理和虛擬主機都顯示正好是 8GB 的 zram。這包括我擁有 64GB 內存的主工作站和其他擁有 16GB 或 32GB 內存的主機。
基於這幾個數據點,我可以得出這樣的結論:目前的默認設置是最多 8GB 的 zram,而在 8GB 或以下的主機上,zram 占內存的 95%。
我讀過一些文章,其中提到了 zram 交換空間的其他大小,甚至高達 100% 的內存,但這些似乎都是理論上的,而不是現實。
你的發行版可能不同,但這裡是 Fedora 和類似發行版的實際 zram 交換空間的分配情況:
- 內存 ⇐ 8 GB:0.95 × 內存
- 內存 > 8 GB:8 GB
請注意,zram 交換空間大小的演算法並沒有基於對任何給定的現實世界的系統或應用程序的 「最佳」 交換大小的建議。這種 zram 交換空間的分配是一種相當概率性的方法,它應該在廣泛的 Linux 主機上運行良好。然而,最大的 zram 交換空間大小被配置為 8GB,而且我一直推薦 8GB 作為傳統交換空間的最大容量,我想我可以說它反映了 zram 交換空間的最佳大小。
管理 zram 交換空間
zram 的默認值保存在 /usr/lib/systemd/zram-generator.conf
配置文件中。以下是我的一個測試虛擬機,分配了 5097GB 的內存。
# cat /usr/lib/systemd/zram-generator.conf
# This config file enables a /dev/zram0 device with the default settings:
# - size - same as available RAM or 8GB, whichever is less
# - compression - most likely lzo-rle
#
# To disable, uninstall zram-generator-defaults or create empty
# /etc/systemd/zram-generator.conf file.
[zram0]zram-size= min(ram, 8192)
你可以在 zram-generator.conf
配置文件的最後一行改變默認的 zram 交換空間大小。但我建議不要這樣做,除非你能明確說明這樣做的原因,並在你做任何改變後測試你的結果。像 Linux 中的許多其他配置默認值一樣,zram 的默認值已經被很好地測試過了,適合大多數使用情況。
監控 zram
可以使用 zramctl
工具來查看 zram 的當前狀態。
# zramctl
NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 lzo-rle 4.8G 4K 80B 12K 4[SWAP]
傳統的 swapon
命令也可以用來查看交換,包括作為交換使用的 zram:
# swapon --show
NAME TYPE SIZE USED PRIO
/dev/zram0 partition 4.8G 0B 100
需要注意的是,zramctl
在不包含數據時不報告 zram,所以結果會包含空輸出。而像 lsblk
、swapon
、 top
、free
、htop
等工具,即使不包含數據,也會顯示 zram。
停用 zram
swapoff -a
命令會關閉 zram 交換空間以及用作交換的傳統 HDD 或 SSD 存儲。swapon -a
命令在 zram 為空時不顯示它,可以使用 zramctl /dev/zram0
代替。
# swapon --show# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:00 120G 0 disk
├─sda1 8:10 1G 0 part /boot/efi
├─sda2 8:20 1G 0 part /boot
└─sda3 8:30 118G 0 part
├─vg01-root 253:00 10G 0 lvm /
├─vg01-swap 253:10 3G 0 lvm [SWAP]
├─vg01-usr 253:10 30G 0 lvm /usr
├─vg01-home 253:20 10G 0 lvm /home
├─vg01-var 253:30 30G 0 lvm /var
└─vg01-tmp 253:40 10G 0 lvm /tmp
sr0 11:01 1024M 0 rom
zram0 252:00 0B 0 disk
# zramctl## zramctl /dev/zram0
NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 lzo-rle 0B 0B 0B 0B 4
注意,/dev/zram0
在這些命令中並沒有顯示為交換空間,直到它被用於該目的。這給我造成了一些困惑,直到我的實驗表明這是事實。
創建 zram 交換空間
zram 本身已經存在了大約 20 年,但只是在過去的一兩年里才在一些發行版上作為交換空間使用。你的一些或所有主機上當前的 Linux 環境可能沒有用 zram 創建交換空間。如果是這種情況,它可以很容易地被補救。
對於 Fedora 32,它是默認使用 zram 交換空間之前的最後一個版本,它只需要三個簡單的命令。
首先,驗證是否存在 zram-swap.service
文件,它作為 zram
RPM 包的一部分安裝:
# systemctl status zram-swap
● zram-swap.service - Enable compressed swap in memory using zram
Loaded: loaded (/usr/lib/systemd/system/zram-swap.service; disabled; vendor preset: disabled)
Active: inactive (dead)
接下來,安裝 zram-generator-defaults
和 zram-generator
軟體包:
# dnf install zram-generator-defaults zram-generator
啟用並啟動 zram-swap
服務:
# systemctl enable zram-swap.service# systemctl start zram-swap.service
然後驗證 zram0
是否存在並被用作交換空間:
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:00 120G 0 disk
├─sda1 8:10 2G 0 part /boot
└─sda2 8:20 118G 0 part
├─vg01-root 253:00 10G 0 lvm /
├─vg01-swap 253:10 3G 0 lvm [SWAP]
├─vg01-usr 253:20 35G 0 lvm /usr
├─vg01-tmp 253:30 15G 0 lvm /tmp
├─vg01-var 253:40 35G 0 lvm /var
└─vg01-home 253:50 20G 0 lvm /home
sr0 11:01 1024M 0 rom
zram0 252:00 7.5G 0 disk [SWAP]
用 zram 改進交換空間
這就是全部內容了。在 Fedora 上這很容易。不同的發行版可能也一樣簡單,只是軟體包名稱和命令的細節可能不同。在你的電腦上試試 zram 交換空間吧。在我的下一篇文章中,我將進一步演示一些 zram 選項。
via: https://opensource.com/article/22/11/zram-swap-linux
作者:David Both 選題:lkxed 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive