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
交换分区
交换分区可以用大多数 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。
- 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)。
通过 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)时,使用交换文件更加理想。
手动方式
建立交换文件
使用 dd 去创建一个由你自己指定大小的交换文件。例如,创建一个 512 MiB 的交换文件:
# dd if=/dev/zero of=/swapfile bs=1M count=512 status=progress
为交换文件设置权限(交换文件全局可读是一个巨大的本地漏洞):
# 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
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 setswapfc_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.
交换加密
性能优化
交换操作通常比直接访问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.