本文介紹了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-0933C84B4F4F
(gdisk 的 8200
類型,fdisk 的 swap
類型),在 MBR 上的類型 ID 為 82
。
要將分區設置為 Linux 交換分區,請使用 mkswap(8) 命令。例如:
# mkswap /dev/sdxy
想要啟用一個設備作為交換分區:
# swapon /dev/sdxy
參見 swapon(8) 了解選項語法。
啟動時啟用
要在啟動時啟用交換分區,可以:
- 使用 systemd#GPT分區自動掛載
- 或者添加一個條目到
/etc/fstab
。例如:UUID=device_UUID none swap defaults 0 0
- 其中
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 | 否 |
建立交換文件
使用 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.
刪除交換文件
如果要刪除一個交換文件,必須先停用它。
作為root運行:
# swapoff /swapfile
然後即可刪除它:
# rm -f /swapfile
最後從 /etc/fstab
中刪除相關條目
交換加密
性能優化
交換操作通常比直接訪問RAM中的數據慢得多。然而,完全禁用交換以提高性能有時會導致性能下降。如果沒有足夠的物理內存來容納所有內容,完全不進行交換會減少文件系統緩存的可用內存,從而導致更頻繁且代價高昂的磁碟使用。
可以調整交換值以提高性能:
交換值(Swappiness)
當內存使用達到某個閾值時,內核會開始查看活動內存並嘗試釋放一些內容。文件數據可以寫入文件系統(如果已更改),卸載並在稍後重新加載;其他數據必須先寫入交換空間才能卸載。
swappiness sysctl 參數代表了內核對於寫入交換空間而不是文件的偏好。它的值可以是 0 到 200 之間(在Linux內核版本低於5.8時最大值為100),默認值為60。較低的值會導致內核更傾向於釋放打開的文件,較高的值會導致內核嘗試使用交換空間,而值100意味著IO成本被假定為相等。
要查看當前交換值(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)
在RAM中使用壓縮塊設備
參見 Improving performance#zram or zswap。
僅將交換空間用於休眠
如果你只需要交換空間作為休眠映像存儲空間,那麼你可以使用 zswap 並禁用其回寫,以便在常規交換使用中沒有磁碟寫入。參見 Power management/Suspend and hibernate#Disable zswap writeback to use the swap space only for hibernation。