我在我的電腦上花了很多時間(我是說工作),我發現了很多有趣的東西。其中最近引起我注意的是?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,所以結果會包含空輸出。而像?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 zramLoaded: 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
本文由?LCTT?原創編譯,Linux中國?榮譽推出
編輯于 2023-01-28 11:44?IP 屬地海南
Linux
Swap 分區
zram
?贊同 13??4 條評論
?分享
?喜歡?收藏?申請轉載
?
歡迎參與討論
4 條評論
默認
最新
銀河-蝸牛
正如標題所說,zram 是*替代*傳統 swap 的,不是一起用的。如果你用了傳統 swap 同時又想要壓縮內存,那可以用 zswap
2023-01-28?·?IP 屬地陜西
?回復?3
觀觀
現在內存越來越大,swap基本都關了,而且很多軟件部署安裝時都要求關掉swap,比如ES
2023-01-30?·?IP 屬地上海
?回復?喜歡
胡蘿卜
銀河-蝸牛
現在的企業部署應用都是用虛擬機,就虛擬機那磁盤io性能你覺得開swap體驗怎么樣。所以正常部署服務端應用就應該關掉swap。把Linux當桌面用在內存不是特別大的情況下可以開swap。
2023-12-08?·?IP 屬地湖北
?回復?喜歡
銀河-蝸牛
其實也不至于,對一些運行時不希望被swap的程序,可以放在cgroup里單獨設置讓它不使用swap
2023-01-30?·?IP 屬地陜西
?回復?喜歡