Swap - Arch Linux 中文维基

跳至內容

# Swap

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Swap，最近一次同步於 2025-04-10，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- fstab
- Hibernation
- Zswap
- zram
- Swap on video ram
- ZFS#Swap volume
- dm-crypt/交換分區加密

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

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

## swap

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-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 它。

## 交換文件

相比於使用一個磁碟分區作為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。

## 參見

- 替swap辯護：常見的誤解
- 關於swap的一些補充

分類：​

- 文件系統

Swap
新增話題