跳至內容

为避免本站因各种原因无法访问,建议用户安装 arch-wiki-docs-zh-cnCNRepo 或者 arch-wiki-docs-zh-twCNRepo 离线文档包备用,也可尝试使用经由Cloudflare CDN的替代版本aw.lilydjwg.me

Swap

出自 Arch Linux 中文维基

swap也叫交換空間,是用於暫存暫時用不到內存頁面的地方,以為更加常用的數據騰出更多空間。本文介紹了GNU/Linux上的swap和分頁,教您如何創建和啟用交換分區或交換文件。

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

swap可以是磁盤的一個分區,也可以是一個文件。用戶可以在安裝時或安裝後的任何時候創建swap。swap有兩種用途:第一,是暫存暫時用不到內存頁面,將內存空間騰出給更常用的數據;第二,是用於 suspend-to-disk 支持。

使用swap來暫時內存數據是否有好處取決於您的物理內存大小。如果物理內存非常充裕,通常有大量未使用空間的話,則根本用不到swap。如果物理內存非常不足,無法存下您當前正在使用的軟件的活躍數據(「工作集」)的話,使用swap將導致頻繁交換以至於系統運行緩存。而在以上兩種極端情況之間,使用swap通常能夠交換出不活躍的內存數據、將釋放出來的空間用於I/O緩存或者活躍數據,將提升使用體驗,或者讓更多的軟件可以放在後台駐留而不是為了騰出內存空間給當前程序使用而關閉。這對於某些佔用內存很多、但又經常有大量不活躍數據的軟件很有效,比如網頁瀏覽器Telegram

參見《替swap辯護:常見的誤解》《關於swap的一些補充》

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

要檢查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 它。

交換文件

[編輯 | 編輯原始碼]

相比於使用一個磁盤分區作為swap,使用交換文件可以更方便地隨時調整大小或者移除。當磁盤空間有限(例如常規大小的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/交換分區加密

性能優化

[編輯 | 編輯原始碼]

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

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

swappiness

[編輯 | 編輯原始碼]

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

swappiness sysctl 參數代表了內核對於寫入swap而不是文件的偏好。它的值可以是0到200之間(在Linux內核版本低於5.8時最大值為100),默認值為60。較低的值會導致內核更傾向於釋放打開的文件,較高的值會導致內核嘗試使用swap,而值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

僅將swap用於休眠

[編輯 | 編輯原始碼]

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