如何在ArchLinux云服务器上添加交换文件
介绍
增加云服务器响应能力的一种简单方法是添加一些交换空间。 交换是硬盘驱动器的一个区域,可用于临时保存通常存储在 RAM 中的信息。 结果是更多 RAM 可用于您当前正在运行的进程。
笔记
尽管对于使用传统旋转硬盘的系统通常建议使用交换,但使用 SSD 交换可能会导致硬件随着时间的推移而退化。 出于这一考虑,我们不建议在 DigitalOcean 或任何其他使用 SSD 存储的提供商上启用交换。 这样做会影响您和您的邻居的底层硬件的可靠性。
如果您需要提高服务器的性能,我们建议升级您的 Droplet。 这通常会带来更好的结果,并且会降低导致可能影响服务的硬件问题的可能性。
引擎盖下
Linux 内核以称为“页面”的小块将信息存储在 RAM 中。 一个程序可以有大量的页面占用 RAM 中的空间。 当新进程需要访问物理内存时,会根据需要创建新页面。 但是当 RAM 中没有更多空间用于更多页面时会发生什么?
如果程序没有使用它在 RAM 中分配的所有页面,则可以删除未使用的页面并重新分配空间。 这是因为如果需要,可以轻松地重新创建这些页面文件。 例如,如果程序 A 被分配了 10 个页面,但只写入了 7 个页面,则可以暂时销毁 3 个页面,并在实际需要时重新创建它们。 同时,这三个页面正在使用的空间可以被其他程序使用。
那么,交换从何而来?
有时系统必须从 RAM 中删除包含无法随意重新创建的数据的页面。 写给他们的信息在硬盘上并不容易获得。 当系统删除处于这种状态的页面时,它需要一个放置它们的地方,这样它就不会丢失该信息。 那个地方叫做“交换”。
交换文件或交换分区没有什么很复杂的。 它只是一个专门用于临时存储 RAM 数据的区域。 这可以是来自应用程序的状态信息、缓存数据或任何其他可能占用 RAM 的信息。 操作系统会在必要时将信息从 RAM 交换到交换空间,反之亦然。
检查交换空间
我们需要以 root 身份登录才能完成本教程中的步骤。
su
在我们创建自己的交换文件之前,我们要检查系统上是否已经启用了交换空间。 我们可以通过多种方式轻松做到这一点。 让我们先试试“swapon”命令。
swapon -s
swapon: stat failed -s: No such file or directory
如您所见,在干净的 Arch Linux VPS 上,此命令不会产生任何输出。 该命令已正确执行,但未找到任何交换空间。
让我们尝试一种不同的方式来检查交换,这将为我们提供更多的视觉反馈。
free -m
total used free shared buffers cached Mem: 494 60 434 0 6 28 -/+ buffers/cache: 25 469 Swap: 0 0 0
正如预期的那样,总列中的交换为 0。 这证实了“swapon”命令告诉我们的内容。
检查文件系统
关于交换区的理想大小有许多不同的意见。 大多数情况下,匹配或加倍您拥有的 RAM 量就足够了(除非您有非常大量的 RAM,在这种情况下您可以分配更少的交换空间)。 最后,这取决于个人喜好,而决定通常受到机器上可用 RAM 和硬盘空间量的影响。
对于本指南,我们有 512MB 的 RAM 和 20GB 的硬盘驱动器。 如果我们将交换空间设置为 RAM 的两倍,那么它将是我们硬盘驱动器的重要组成部分。 因此,我们将匹配我们拥有的 RAM 数量并创建一个 512MB 的交换空间。
在我们实际创建交换空间之前,我们需要检查硬盘驱动器上是否有足够的可用空间。 现在让我们用“df”命令检查一下。
df -h
Filesystem Size Used Avail Use% Mounted on /dev/vda 20G 965M 18G 6% / dev 240M 0 240M 0% /dev run 248M 212K 248M 1% /run tmpfs 248M 0 248M 0% /dev/shm tmpfs 248M 0 248M 0% /sys/fs/cgroup tmpfs 248M 0 248M 0% /tmp
如果我们查看第一行,我们可以看到我们的 20GB 硬盘驱动器,其中大约 18GB 未使用。 这是足够的空间来创建我们的 512MB 交换空间。
创建并启用交换文件
我们现在准备创建我们的交换空间。 我们将讨论两种不同的方法来实现这一点。 首先,我们将使用“dd”命令。
dd if=/dev/zero of=/swapfile bs=1M count=512
512+0 records in 512+0 records out 536870912 bytes (537 MB) copied, 1.96268 s, 274 MB/s
让我们确认文件已正确创建。
ls -lh /swapfile
-rw-r--r-- 1 root root 512M Jun 28 18:41 /swapfile
如您所见,我们现在有一个名为 /swapfile 的 512MB 文件。 让我们尝试以不同的方式创建交换文件。 我们将删除刚刚创建的交换文件,以便我们重试。
rm /swapfile
“fallocate”程序可以比“dd”更快地创建交换文件。 作为一个额外的好处,它的语法也更容易记住。
fallocate -l 512M /swapfile
同样,我们可以看到现在有一个正确大小的交换文件。
ls -lh /swapfile
-rw-r--r-- 1 root root 512M Jun 28 18:54 /swapfile
我们现在在硬盘驱动器的根分区中有一个名为“swapfile”的文件,但我们可以看到系统尚未识别或使用它。
free -m
total used free shared buffers cached Mem: 494 41 453 0 1 13 -/+ buffers/cache: 25 468 Swap: 0 0 0
现在,该文件只是一个普通文件。 我们可能称它为“swapfile”,但 Linux 还不知道将其用作交换文件。 我们必须将其格式化为交换并启用它。
在我们这样做之前,我们需要完成一个非常重要的步骤。 我们需要更改文件的权限,以便只有 root 可以读取和写入文件。 非 root 用户可以读取或写入的交换文件是一个非常大的安全漏洞。 正如您在我们运行“ls”时所看到的,系统上的任何人当前都可以读取它。 现在让我们改变它。
chmod 600 /swapfile
如果我们重新检查文件,我们可以看到权限现在是正确的。
ls -lh /swapfile
-rw------- 1 root root 512M Jun 28 18:54 /swapfile
现在我们的文件是安全的,我们可以格式化它。
mkswap /swapfile
Setting up swapspace version 1, size = 524284 KiB no label, UUID=61f42c98-d1ef-4f27-84c2-713c5f63d434
最后,我们可以启用该文件,以便系统知道开始使用它。
swapon /swapfile
让我们检查一下我们的文件是否被识别并被使用。
free -m
total used free shared buffers cached Mem: 494 42 452 0 1 14 -/+ buffers/cache: 25 468 Swap: 511 0 511
伟大的! 我们的交换文件被识别,操作系统将根据需要开始使用它来存储 RAM 中的数据。
不过,我们还没有完成。 操作系统需要知道每次启动时使用此文件进行交换是安全的。 我们可以通过编辑“/etc/fstab”文件来实现。
nano /etc/fstab
# Paste this information at the bottom of the file /swapfile none swap defaults 0 0
调整交换设置
使用交换时有许多事情要记住。 因为交换空间位于硬盘驱动器上,所以它比 RAM 慢得多。 这意味着您只希望操作系统在需要时使用它。 如果在 RAM 用完之前就将页面移动到交换空间,那么您的操作将大大减慢。
控制系统将项目移出 RAM 并移入交换空间的频率的参数称为“swappiness”。 它的值可以是 0 到 100 之间的任何值。 当值接近零时,内核将选择不交换,除非绝对必要。 当值接近 100 时,系统将更早地换出文件。 这可能会导致速度问题,因为必须从硬盘驱动器而不是 RAM 获取信息。
我们可以通过输入以下命令找出我们当前的 swappiness 设置:
cat /proc/sys/vm/swappiness
60
我们的系统默认的 swappiness 值为 60。 这对于 VPS 来说是一个很好的默认设置。 如果我们正在调整桌面的 swappiness,我们可能希望将其移近 0。 我们可以使用“sysctl”命令尝试不同的交换值。
sysctl vm.swappiness=10
vm.swappiness = 10
我们可以看到系统已经接受了我们为 swappiness 参数设置的新值。
cat /proc/sys/vm/swappiness
10
如果我们想默认这个设置,我们可以编辑“/etc/sysctl.conf”文件。
nano /etc/sysctl.conf
# Search for the vm.swappiness setting. Uncomment and change it as necessary. vm.swappiness=10
这将允许我们的设置在重新启动后保持不变。 随意使用此参数以根据您的情况实现最佳交换。
我们可能要调整的另一个相关参数是“vm.vfs_cache_pressure”设置。 更改缓存压力值将更改系统对保留 inode 和 dentry 缓存信息而不是其他类型信息的偏好。 这意味着操作系统将更长时间地保留有关文件系统的信息,这恰好是查找成本非常高且请求非常频繁。 这通常会导致性能提升。
同样,我们可以通过查看 /proc 目录来检查当前值。
cat /proc/sys/vm/vfs_cache_pressure
100
当前设置将 inode 信息移出缓存的速度比我们希望的要快。 对于我们的目的来说,50 的缓存压力会好得多。 我们可以像改变沼泽地一样改变这些设置。
sysctl vm.vfs_cache_pressure=50
vm.vfs_cache_pressure = 50
同样,我们可以通过将其添加到“/etc/sysctl.conf”文件中来使其在重新启动时持续存在。
nano /etc/sysctl.conf
# Search for the vm.vfs_cache_pressure setting. Uncomment and change it as necessary. vm.vfs_cache_pressure = 50
这使我们的缓存压力配置永久化。