Linux中國

在 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 最初被稱為 「 壓縮緩存 compcache 」,即 「壓縮的高速緩存」。事實證明,zram 是一個用於創建內存內壓縮緩存的工具,特別是作為交換空間使用。

但為什麼呢?

當我開始研究 zram 時,我只發現了幾篇關於將 zram 用於交換空間的基礎文章。起初,這對我來說似乎有點違反直覺。畢竟,如果你的內存快用完了,你把頁面交換到內存中的虛擬驅動器中,有什麼好處呢?

然後我找到了 Fedora 項目的維基頁面,它提議使用 zram 交換空間 swap-on-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,所以結果會包含空輸出。而像 lsblkswapontopfreehtop 等工具,即使不包含數據,也會顯示 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-defaultszram-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

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國