交换

来自 ArchWiki
(重定向自 Swap space)

本页面介绍了 GNU/Linux 上的 交换空间和分页。它涵盖了交换分区和交换文件的创建和激活。

来自 All about Linux swap space

Linux 将其物理 RAM(随机存取存储器)划分为称为页面的内存块。交换是将内存页面复制到硬盘上预配置的空间(称为交换空间)以释放该内存页面的过程。物理内存和交换空间的组合大小是可用的虚拟内存量。

对交换的支持由 Linux 内核和 util-linux 软件包中的用户空间实用程序提供。

交换空间

交换空间可以采用磁盘分区或文件的形式。用户可以在安装期间或之后任何时候根据需要创建交换空间。交换空间可用于两个目的:将虚拟内存扩展到超出已安装的物理内存 (RAM),以及用于支持 挂起到磁盘

是否通过交换来扩展虚拟内存是否有益取决于已安装物理内存的数量。如果物理内存量少于运行所有所需程序所需的内存量,那么启用交换可能是有益的。这避免了 内存不足的情况,在这种情况下,Linux 内核 OOM killer 机制将自动尝试通过杀死进程来释放内存。要将虚拟内存量增加到所需的量,请添加必要的差额(或更多)作为交换空间。

在内存不足时使用交换的最大缺点是其较低的性能,请参阅 #性能 部分。因此,启用交换是个人偏好的问题:有些人宁愿程序被杀死也不愿启用交换,而另一些人则宁愿启用交换并在物理内存耗尽时系统变慢。

要检查交换状态,请使用

$ 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 开关停用所有交换空间。

由于交换由 systemd 管理,因此它将在下次系统启动时再次激活。要永久禁用自动激活检测到的交换空间,请运行 systemctl --type swap 以查找负责的 .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

最后,编辑 fstab 配置文件以添加交换文件的条目

/etc/fstab
/swapfile none swap defaults 0 0

有关更多信息,请参阅 fstab#Usage

注意: 交换文件必须通过其在文件系统上的位置指定,而不是通过其 UUID 或 LABEL。

交换文件移除

要移除交换文件,必须先将其关闭,然后才能移除

# swapoff /swapfile
# rm -f /swapfile

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

交换加密

请参阅 dm-crypt/交换加密

性能

交换操作通常比直接访问 RAM 中的数据慢得多。但是,完全禁用交换以提高性能有时会导致性能下降。如果没有足够的物理内存来容纳所有内容,则不进行交换会使文件系统缓存可用的内存更少,从而导致更频繁和成本更高的磁盘使用。

可以调整交换值以帮助提高性能

Swappiness

当内存使用量达到一定阈值时,内核开始查看活动内存并查看它可以释放什么。文件数据可以写出到文件系统(如果已更改)、卸载并在以后重新加载;其他数据必须先写入交换空间才能卸载。

swappiness sysctl 参数表示内核在写入交换空间而不是文件时的偏好。它的值可以在 0 到 200 之间(如果 Linux < 5.8,则最大值为 100);默认值为 60。低值会导致内核倾向于释放打开的文件,高值会导致内核尝试使用交换空间,值为 100 意味着 IO 成本被认为是相等的。

注意: 有一个常见的误解,认为 swappiness 会影响内存阈值或阻止使用交换空间,但它只影响释放文件页面而不是交换空间的偏好。请参阅:本文 以获得更详细的解释,或 内核源代码,其中使用了它。

要检查当前的 swappiness 值

$ sysctl vm.swappiness

或者,可以读取文件 /proc/sys/vm/swappiness 以获得原始整数值。

要临时设置 swappiness 值

# sysctl -w vm.swappiness=35

要永久设置 swappiness 值,请创建一个 sysctl.d(5) 配置文件。例如

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

要让 引导加载程序 在加载内核时设置 swappiness,请添加一个 内核参数,例如 sysctl.vm.swappiness=35

要测试并了解更多关于这为什么可能有效的信息,请查看 本文。对于更近期的反驳论点,请参阅 本文

VFS 缓存压力

另一个影响交换性能的 sysctl 参数是 vm.vfs_cache_pressure,它控制内核回收用于缓存 VFS 缓存的内存的趋势,而不是 pagecache 和交换空间。增加此值会增加 VFS 缓存被回收的速度[1]。有关更多信息,请参阅 Linux 内核文档

优先级

如果您有多个交换文件或交换分区,则应考虑为每个交换区域分配优先级值(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 文件中为它们提供相同的优先级,则内核本身可以在多个设备上进行条带化交换。有关详细信息,请参阅 The Software-RAID HOWTO

Discard (又名 trim)

请参阅 固态硬盘#交换空间

RAM 中的压缩块设备

请参阅 Improving performance#zram 或 zswap

仅将交换空间用于休眠

如果您只需要将交换空间用作休眠映像存储空间,那么您可以使用 zswap 并禁用其写回,以便常规交换使用不会产生磁盘写入。请参阅 Power management/Suspend and hibernate#禁用 zswap 写回以仅将交换空间用于休眠

参见