Swap (简体中文)

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

Tango-preferences-desktop-locale.png本文或本节需要翻译。要贡献翻译,请访问简体中文翻译团队Tango-preferences-desktop-locale.png

附注: 自动化及其后续翻译缺失(在 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

交换分区

Tango-inaccurate.pngThe factual accuracy of this article or section is disputed.Tango-inaccurate.png

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

该工具的目的是创建zram设备。 项目使用Rust编写,存放在systemd's GitHub。 可使用包 zram-generator 安装。

工具配置非常简单,在 README 中有相应解释

systemd-swap

注意: 现在作者 建议只用 zram-generator 来替代该项目, 由于本项目提交频率低,且zram覆盖了大多数用户的需求。

systemd-swap是一个脚本,用于从zram交换、交换文件和交换分区创建混合交换空间。它不属于systemd项目。

安装 软件包 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.

交换加密

查看 dm-crypt/Swap encryption.

性能优化

交换操作通常比直接访问RAM中的数据慢得多。完全禁用交换以提高性能有时会导致性能下降,因为它会减少VFS缓存的可用内存,从而导致更频繁地使用宝贵的磁盘I/O。

可以调整交换值以提高性能:

交换值(Swappiness)

swappiness sysctl 参数代表了内核对于交换空间的喜好(或厌恶)程度。Swappiness 的值可以是 0 到 200 之间 (在Linux内核版本低于5.8时最大值为100),默认值为60。设置这个参数为较低的值会减少内存的交换,从而提升一些系统上的响应度。较高值会导致内核尝试使用交换空间,而值100意味着各IO的喜好(或厌恶)程度相等。众所周知,在许多系统中,在足够的内存上使用较低的值可以提高响应能力。

要查看当前交换值(Swappiness),请执行以下操作:

$ sysctl vm.swappiness

此外,可以读取文件 /sys/fs/cgroup/memory/memory.swappiness 或 /proc/sys/vm/swappiness 以获得原始整数值。

注意: 由于 /proc 的组织性要差得多,并且只出于兼容性目的而保留,因此鼓励您改用 /sys

要临时设置交换值(Swappiness),请执行以下操作:

# sysctl -w vm.swappiness=10

要永久设置交换值,请创建sysctl.d(5)配置文件。例如:

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

要测试和了解这可能起作用的原因,请查看 此文章.

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.