跳至內容
出自 Arch Linux 中文维基

本文介紹了GNU/Linux上的交換空間和分頁。它將教您如何創建或啟用交換分區或交換文件。

以下引用來自於關於 Linux Swap 空間:

Linux 將物理內存分為內存段,叫做頁面。交換是指內存頁面被複製到預先設定好的硬碟空間(叫做交換空間)的過程,目的是釋放這份內存頁面。物理內存和交換空間的總大小是可用的虛擬內存的總量。

swap 支持由 Linux 內核和來自 util-linux 軟體包的用戶空間實用程序提供。

交換空間

交換空間可以是磁碟的一個分區,也可以是一個文件。用戶可以在安裝時或安裝後的任何時候創建交換空間。交換空間有兩種用途:第一,是將虛擬內存擴大到超過已安裝的物理內存(RAM)的容量;第二,是用於 suspend-to-disk 支持。

使用swap擴展您的虛擬內存是否有好處取決於您的物理內存。如果物理內存不足以支撐您日常使用全部的程序的話(體現在日常使用時內存滿了導致的卡頓,死機),使用swap也許會對您有些幫助。這樣可以避免 out of memory conditions,Linux內核OOM Killer機制將嘗試通過殺進程的方式來自動釋放內存。如果您想讓虛擬內存足夠使用,請添加相應的差值(或更多)作為交換空間。

啟用交換的最大缺點是性能較低,請參閱:#性能優化。因此,啟用swap是個人喜好問題:當物理內存用完時,有些人更喜歡殺死程序而不是啟用交換,而另一些人更喜歡啟用交換和較慢的系統。

注意:連續的交換文件和交換分區之間沒有性能之別,兩者的處理方式是一樣的。

要檢查交換空間的狀態,使用:

$ swapon --show

或者顯示物理內存以及交換使用情況:

$ free -h

交換分區

交換分區可以用大多數 GNU/Linux 分區工具創建。交換分區在 GPT 上的分區類型 GUID 為 0657FD6D-A4AB-43C4-84E5-0933C84B4F4Fgdisk8200 類型,fdiskswap 類型),在 MBR 上的類型 ID 為 82

要將分區設置為 Linux 交換分區,請使用 mkswap(8) 命令。例如:

# mkswap /dev/sdxy
警告:指定分區上的所有數據會丟失。

想要啟用一個設備作為交換分區:

# swapon /dev/sdxy

參見 swapon(8) 了解選項語法。

啟動時啟用

要在啟動時啟用交換分區,可以:

其中 device_UUID 是交換分區的 UUID

參見 fstab 了解文件語法,以及 systemd#systemd.mount - mounting

關閉交換分區

使用下面的命令關閉交換分區:

# swapoff /dev/sdxy

也可以使用 -a 參數來關閉所有的交換分區。

因為 swap 通過 systemd 管理,因此會在下一次系統啟動時再次激活。要永久禁用該特性,運行 systemctl --type swap 來查找 .swap 單元,然後 mask 它。

交換文件

相比於使用一個磁碟分區作為交換空間,使用交換文件可以更方便地隨時調整大小或者移除。當磁碟空間有限(例如常規大小的SSD)時,使用交換文件更加理想。

文件系統 是否支持交換文件
Bcachefs
Btrfs
F2FS
ext4
JFS
NILFS2
NTFS3
ReiserFS
XFS
ZFS

建立交換文件

注意:如果您使用Btrfs,請按照 Btrfs#交換文件 初始化交換文件,不要使用下面的方式。

使用 mkswap(8) 創建一個由你自己指定大小的交換文件(參見 Partitioning#Swap 獲取建議)。例如,創建一個 4 GiB 的交換文件:

# mkswap -U clear --size 4G --file /swapfile

啟用交換文件:

# swapon /swapfile

最後,編輯 /etc/fstab,在為交換文件添加一個條目:

/etc/fstab
/swapfile none swap defaults 0 0

有關更多信息,請參見 fstab#Usage.

注意:交換文件必須由文件系統上的位置指定,而不是由UUID或標籤指定。

刪除交換文件

如果要刪除一個交換文件,必須先停用它。

作為root運行:

# swapoff /swapfile

然後即可刪除它:

# rm -f /swapfile

最後從 /etc/fstab 中刪除相關條目

交換加密

查看 dm-crypt/Swap encryption

性能優化

交換操作通常比直接訪問RAM中的數據慢得多。然而,完全禁用交換以提高性能有時會導致性能下降。如果沒有足夠的物理內存來容納所有內容,完全不進行交換會減少文件系統緩存的可用內存,從而導致更頻繁且代價高昂的磁碟使用。

可以調整交換值以提高性能:

交換值(Swappiness)

當內存使用達到某個閾值時,內核會開始查看活動內存並嘗試釋放一些內容。文件數據可以寫入文件系統(如果已更改),卸載並在稍後重新加載;其他數據必須先寫入交換空間才能卸載。

swappiness sysctl 參數代表了內核對於寫入交換空間而不是文件的偏好。它的值可以是 0 到 200 之間(在Linux內核版本低於5.8時最大值為100),默認值為60。較低的值會導致內核更傾向於釋放打開的文件,較高的值會導致內核嘗試使用交換空間,而值100意味著IO成本被假定為相等。

注意:有一個常見的誤解是swappiness會影響內存閾值或阻止使用交換空間,但它只影響釋放文件頁面而不是交換的偏好。有關更詳細的解釋,請參閱:這篇文章內核原始碼 中它的使用。

要查看當前交換值(Swappiness),請執行以下操作:

$ sysctl vm.swappiness

此外,可以讀取文件 /proc/sys/vm/swappiness 以獲得原始整數值。

要臨時設置交換值(Swappiness),請執行以下操作:

# sysctl -w vm.swappiness=35

要永久設置交換值,請創建sysctl.d(5)配置文件。例如:

/etc/sysctl.d/99-swappiness.conf
vm.swappiness=35

為了讓 boot loader 在加載內核時設置交換值,添加一個 kernel parameter,例如 sysctl.vm.swappiness=35.

要測試和了解這可能起作用的原因,請查看此文章。有關最近的反對意見,請參閱 這篇文章

VFS 緩存壓力

vm.vfs_cache_pressure 是另外一個影響交換性能的 sysctl 參數,這個參數控制內核回收 VFS 緩存的程度,增大數值會增加回收 VFS 緩存的頻率[1]。更多信息請閱讀 Linux kernel documentation

優先級

如果你有多個交換文件或交換分區,你應該考慮給它們各自分配一個優先級值(0 到 32767)。系統會優先使用較高優先級的交換區域,然後再使用較低優先級的交換區域。例如,如果你有一個較快的磁碟和一個較慢的磁碟,給較快的設備分配一個更高的優先級。優先級可以在 fstab 中通過 pri 參數指定:

UUID=f9fe0b69-a280-415d-a03a-a32752370dee none swap defaults,pri=100 0 0
UUID=d7eb6062-01c8-4367-ac1d-3bf1167de8bb none swap defaults,pri=10  0 0

或者通過 swapon 的 --priority 參數:

# swapon --priority 100 /dev/sda1

如果兩個或更多的區域有同樣的優先級,並且它們都是可用的最高優先級,頁面會按照循環的方式在它們之間分配。

分片

不需要使用 RAID 提高交換的性能,只要在 /etc/fstab 中給交換設備設置相同的優先級,內核會將交換分片到多個設備。詳情請參考 Software-RAID 指南

丟棄(即 trim)

參見 Solid state drive#swap

在RAM中使用壓縮塊設備

參見 Improving performance#zram or zswap

僅將交換空間用於休眠

如果你只需要交換空間作為休眠映像存儲空間,那麼你可以使用 zswap 並禁用其回寫,以便在常規交換使用中沒有磁碟寫入。參見 Power management/Suspend and hibernate#Disable zswap writeback to use the swap space only for hibernation

參見