# Swap (简体中文)

From ArchWiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

相关文章

- Swap on video ram
- fstab
- Improving_performance#Zram_or_zswap

翻译状态：本文是 Swap 的翻译。上次翻译日期：2021-05-31。如果英文版本有所更改，则您可以帮助同步翻译。

本文或本节需要翻译。要贡献翻译，请访问简体中文翻译团队。

附注： 自动化及其后续翻译缺失（在 Talk:Swap (简体中文)# 中讨论）

本文介绍了GNU/Linux上的 交换空间和分页。它将教您如何创建或启用交换分区或交换文件。

以下引用来自于 关于 Linux Swap 空间:

  Linux 将物理内存分为内存段，叫做页面。交换是指内存页面被复制到预先设定好的硬盘空间(叫做交换空间)的过程，目的是释放这份内存页面。物理内存和交换空间的总大小是可用的虚拟内存的总量。

swap是由Linux内核和用户空间实用程序（来自于 util-linux 软件包）提供支持的。

## 交换空间

交换空间通常是一个磁盘分区，但是也可以是一个文件。用户可以在安装 Arch Linux 的时候创建交换空间，或者在安装后的任何时间建立交换空间。交换空间可用于两个目的，将虚拟内存扩大到超过已安装的物理内存的容量，也可用于 suspend-to-disk 支持。

使用swap扩展您的虚拟内存是否有好处取决与您的物理内存。如果物理内存不足以支撑您日常使用全部的程序的话（体现在日常使用时内存满了导致的卡顿，死机），使用swap也许会对您有些帮助。这样可以避免 out of memory conditions，Linux内核OOM Killer机制将尝试通过杀进程的方式来自动释放内存。如果您想让虚拟内存足够使用，请添加相应的差值（或更多）作为交换空间。

启用交换的最大缺点是性能较低，请参阅：#性能优化。因此，启用swap是个人喜好问题：当物理内存用完时，有些人更喜欢杀死程序而不是启用交换，而另一些人更喜欢启用交换和较慢的系统。

注意：

- 连续的交换文件和交换分区之间没有性能之别，两者的处理方式是一样的。
- 相比而言， zram 比交换分区或者交换文件更加方便，而且性能更好
- 系统休眠时需要使用交换分区/文件

要检查交换空间的状态，使用

    $ swapon --show

或者显示物理内存以及交换使用情况：

    $ free -h

## 交换分区

The factual accuracy of this article or section is disputed.

Reason: `82` is the swap partition type on MBR, there is no swap partition autodetection on MBR. / TRIM commands on swap partitions seem to be issued automatically by the Kernel if supported see Fedora Deployment Guides. (Discuss in Talk:Swap (简体中文)#Clarify swap discovery)

交换分区可以用大多数 GNU/Linux 分区工具(例如 `fdisk`, `cfdisk`) 创建。交换分区被分配为类型 `82`。尽管可以使用任何分区类型作为交换分区，但是在大多数情况下，建议使用 `82`，因为 systemd 会自动检测并挂载它（见下文）。

要将分区设置为Linux交换分区，请使用 mkswap(8) 命令。例如：

    # mkswap /dev/sdxy

警告： 指定分区上的所有数据会丢失。

想要启用一个设备作为交换分区：

    # swapon /dev/sdxy

想要启动时自动启用交换分区，添加一个条目到 `/etc/fstab`:

    UUID=device_UUID none swap defaults 0 0

UUID可以通过以下命令获得：

    lsblk -no UUID /dev/sdxy

其中 `device_UUID` 是交换分区的 UUID 。有关文件语法，请参见 fstab。

提示： UUID 和 LABEL 应该比使用由内核给出的设备名称更受青睐，因为设备顺序可能在将来发生变化。详细信息，请参见 fstab。
注意：

- The is optional if the swap partition is located on a device using GPT. See the next subsection.
- 警告： 下行原翻译语义与上行更新后的英文原句句意不符，我的英语功底太薄，无法翻译此处，请期待其他翻译人员来翻译吧。
- 如果交换分区位于使用 GPT 的设备上，那么 fstab 中的 swap 条目是可选的，参阅下一小节。
- 如果使用支持 TRIM 的 SSD，请考虑在 fstab 的 swap 条目中使用 `discard`。 如果使用 swapon 命令手动激活交换分区，则使用 `-d`/`--discard` 参数实现相同功能。详细信息，请参见 swapon(8)。

警告： 在使用 madam 进行 RAID 设置时，如果开启 swapon 命令的 discard 参数，将导致系统在启动和运行时锁定。

### 通过 Systemd 激活

systemd 通过两种机制来激活 swap 分区。两种都是 `/usr/lib/systemd/system-generators` 内的可执行文件。generators 在启动时运行并为 mounts 创建本地 systemd 单元。第一种机制是通过 `systemd-fstab-generator` 读取 fstab 来生成单元，包括 swap 单元。 第二种机制是通过 `systemd-gpt-auto-generator` 检查根磁盘来生成单位。这个机制仅在 GPT 磁盘上运行，并可以根据交换分区的GUID类型对其进行标识。详细信息，请参阅 systemd#GPT partition automounting。

### 关闭交换分区

使用下面的命令关闭交换分区：

    # swapoff /dev/sdxy

也可以使用 `-a` 参数来关闭所有的交换分区。

因为 swap 通过 systemd 管理，因此会在下一次系统启动时再次激活。要永久禁用该特性，运行 `systemctl --type swap` 来查找 .swap 单元，然后 mask 它。

## 交换文件

相比于使用一个磁盘分区作为交换空间，使用交换文件可以更方便地随时调整大小或者移除。当磁盘空间有限（例如常规大小的SSD）时，使用交换文件更加理想。

注意： 自Linux内核版本5.0起，Btrfs支持交换文件，但有限制。有关更多信息，请参见 Btrfs#Swap file。

### 手动方式

#### 建立交换文件

注意： 如果您使用Btrfs，请首先按照 Btrfs#Swap file 去初始化交换文件。

使用 dd 去创建一个由你自己指定大小的交换文件。例如，创建一个 512 MiB 的交换文件:

    # dd if=/dev/zero of=/swapfile bs=1M count=512 status=progress

注意： 使用 dd to allocate a swap file is the most portable solution，有关更多信息，请参见 swapon(8) § Files with holes

为交换文件设置权限（交换文件全局可读是一个巨大的本地漏洞）：

    # chmod 600 /swapfile

创建正确大小的文件后，将其格式化用来作为交换文件：

    # mkswap /swapfile

启用交换文件：

    # swapon /swapfile

最后，编辑 `/etc/fstab`，在为交换文件添加一个条目：

    /etc/fstab

    /swapfile none swap defaults 0 0

有关更多信息，请参见 fstab#Usage.

注意：

- 交换文件必须由文件系统上的位置指定，而不是由UUID或标签指定。
- 当使用 Btrfs 时，不要忘记将创建的子卷也添加到列表中，并删除 `discard,autodefrag` 和压缩选项。

#### 删除交换文件

如果要删除一个交换文件，必须先停用它。

作为root运行：

    # swapoff /swapfile

然后即可删除它：

    # rm -f /swapfile

最后从 `/etc/fstab` 中删除相关条目

### 自动化

#### zram-generator

The aim of this tool is the creation of zram devices. It is written in Rust and resides in systemd's GitHub. It can be installed with the zram-generator package. Configuration is straightforward and explained in the README.

#### systemd-swap

注意： The author now recommends using zram-generator instead, due to low commit frequency and zram covering the needs of most users.

systemd-swap is a script for creating hybrid swap space from zram swaps, swap files and swap partitions. It is not affiliated with the systemd project.

安装 软件包 systemd-swap。设置 `/etc/systemd/swap.conf` 文件的 Swap File Chunked 一节下的 `swapfc_enabled=1`。 启动/启用 `systemd-swap` 服务。

访问 作者的 GitHub 页面来获取更多的信息，或者设置 推荐的配置。

注意：

- If the journal keeps showing the following warning `systemd-swap[..]: WARN: swapFC: ENOSPC` and no swap file is being created, you need to uncomment and set `swapfc_force_preallocated=1` in `/etc/systemd/swap.conf`.
- The swap file created by systemd-swap cannot be easily used for hibernation. See systemd-swap issue 85.

## Swap encryption

See dm-crypt/Swap encryption.

## 性能优化

Swap operations are usually significantly slower than directly accessing data in RAM. Disabling swap entirely to improve performance can sometimes lead to a degradation, since it decreases the memory available for VFS caches, causing more frequent and costly disk I/O.

Swap values can be adjusted to help performance:

### Swappiness

swappiness sysctl 参数代表了内核对于交换空间的喜好(或厌恶)程度。Swappiness 的值可以是 0 到 200 之间 (在Linux内核版本低于5.8时最大值为100)，默认值为60。设置这个参数为较低的值会减少内存的交换，从而提升一些系统上的响应度。a high value causes the kernel to try to use swap space, and a value of 100 means IO cost is assumed to be equal. Using a low value on sufficient memory is known to improve responsiveness on many systems.

To check the current swappiness value:

    $ sysctl vm.swappiness

Alternatively, the files `/sys/fs/cgroup/memory/memory.swappiness` or `/proc/sys/vm/swappiness` can be read in order to obtain the raw integer value.

注意： As `/proc` is a lot less organized and is kept only for compatibility purposes, you are encouraged to use `/sys` instead.

To temporarily set the swappiness value:

    # sysctl -w vm.swappiness=10

To set the swappiness value permanently, create a sysctl.d(5) configuration file. For example:

    /etc/sysctl.d/99-swappiness.conf

    vm.swappiness=10

To test and more on why this may work, take a look at this article.

### VFS cache pressure

Another sysctl parameter that affects swap performance is `vm.vfs_cache_pressure`, which controls the tendency of the kernel to reclaim the memory which is used for caching of VFS caches, versus pagecache and swap. Increasing this value increases the rate at which VFS caches are reclaimed[1]. For more information, see the Linux kernel documentation.

### 优先级

如果你有多个交换文件或交换分区，你应该考虑给它们各自分配一个优先级值(0 到 32767)。在使用较低优先级的交换区域之前，系统会优先使用较高优先级的交换区域。例如，如果你有一个较快的磁盘 (`/dev/sda`) 和一个较慢的磁盘 (`/dev/sdb`)，给较快的设备分配一个更高的优先级。优先级可以在 fstab 中通过 `pri` 参数指定：

    /dev/sda1 none swap defaults,pri=100 0 0
    /dev/sdb2 none swap defaults,pri=10  0 0

或者通过 swapon 的 `--priority` 参数：

    # swapon --priority 100 /dev/sda1

如果两个或更多的区域有同样的优先级，并且它们都是可用的最高优先级，页面会按照循环的方式在它们之间分配。

### Using zswap or zram

Zswap is a Linux kernel feature providing a compressed write-back cache for swapped pages. This increases the performance and decreases the IO-Operations. ZRAM creates a virtual compressed Swap-file in memory as alternative to a swapfile on disk.

参阅 Improving performance#zram or zswap

### Striping

There is no necessity to use RAID for swap performance reasons. The kernel itself can stripe swapping on several devices, if you just give them the same priority in the `/etc/fstab` file. Refer to The Software-RAID HOWTO for details.

Category:

- File systems (简体中文)

Hidden categories:

- Pages or sections flagged with Template:Translateme (简体中文)
- Pages or sections flagged with Template:Accuracy