如何在 Linux 命令行创建和启用交换文件

当进程耗尽内存时,Linux 使用交换文件。该进程将被允许使用一块磁盘,而不是崩溃,这明显更慢,但可以防止可能损害服务可用性的意外内存不足崩溃。
什么是交换文件?
让我们从一个反问开始:当您的计算机内存不足时会发生什么?
在 Linux 中,一个特殊的监控进程——OOM 监控/killer 进程——将监控系统是否内存不足,除非 OOM killer 被禁用或配置不同。
发生这种情况时,此进程将终止系统上运行的进程之一以释放内存。这可能会导致痛苦的结果,例如数据损坏或服务不可用。首字母缩略词 OOM 代表“内存不足”
一种解决方案是购买额外的内存或减少计算机或服务器上同时运行的程序或服务的数量。但是如果我们可以使用我们的一些(通常便宜的)磁盘空间作为“额外内存”呢?
这正是交换文件的本质和作用:在存储设备上创建的特殊文件,然后成为主内存的一部分。不是直接的,有处理开销,而是间接的,对处理速度有相当大的影响。
交换文件的优点和缺点
与较慢的磁盘相比,主内存通常非常快。即使是 SSD(固态驱动器)也几乎总是比高速主存储芯片慢。对于 HDD(机械、旋转、传统硬盘驱动器),速度差异更大。
因此,在大多数设置中,使用较慢的磁盘(SDD,尤其是 HDD)作为内存源是一个明显的优势。在主内存和磁盘之间来回写入数据的延迟(即使用磁盘作为内存)称为“交换”(用磁盘空间换出内存)
也就是说,在您的系统上有一个合理的边交换文件总是一个好主意。原因很简单;假设我们只需要在几分钟内额外增加 1 GB 的内存,以确保我们的系统不会调用 OOM 杀手并终止某些进程。在这种情况下,交换文件更好,因为即使一个进程用完了可用的 RAM,它也不会崩溃,只是运行得慢一点,直到它完成它的任务。
但是,如果系统开始大量交换,它几乎肯定会变慢(阅读:慢得多)。这将非常明显。
总而言之,存在一种微妙而微妙的平衡,这种平衡有些随意,取决于给定情况下的许多不同事物;系统上运行的进程数及其内存工作大小、使用中的总内存、交换文件中可用的内存、系统的特定交换文件配置等。
一些交换文件注意事项
在当今世界上的许多 Linux 设置中,系统中的一个磁盘上分配了一个交换分区。这是一个特殊区域,通常(但不限于此;可以稍后添加)在安装 Linux 操作系统时保留。它具有与交换文件相同的目标功能。要检查您的系统当前是否启用了某种形式的交换,只需在您的终端中执行以下命令:
sudo apt -y install htop
htop
并找到以下输出:

请注意,在这个系统上,有 62.7G 主内存和 11.0G 交换空间。您还可以看到当前仅使用了少量 (23.5M)。如果您怀疑您的系统正在交换,请检查这两个计数器的外观。
如果它们都快满了,您的系统很可能会大量交换并且运行速度会明显变慢。原因是现在有一个沉重的 I/O 绑定(即磁盘绑定)负载,不断地与基于磁盘的内存交换主内存。
根据经验,有些人更喜欢使用一定百分比的系统内存作为分配给交换文件的大小。我个人采取了另一条路线,那就是考虑我可能需要多少额外的内存。如果大小相当大,例如 8GB 的服务器最终可能会在特定用例中使用 14GB,那么将服务器内存从 8GB 提高到 16GB 就更有意义了。
但是,如果系统有 8GB 并且通常使用 6-7GB,如果我一次启动太多程序偶尔会出现峰值,我可能会考虑 8GB 的额外交换空间,或者稍微多一些。磁盘空间通常很便宜,所以如果您有足够的空间,将其大小调整得过大一点也不会有什么坏处。
如何启用交换文件
准备好添加交换文件了吗?这可以即时完成。此方法适用于 Debian(Ubuntu、Mint 等)以及基于 RedHat(RedHat、Centos 等)的系统。
在此示例中,我们将创建一个 1 GB、1000 兆字节或 1024000 块(计算为兆字节数 x 1024)交换文件。
我们将其命名为 swapfile123,位于根 (/) 目录中,我们给它起这个名字是为了避免覆盖您可能已经存在的任何文件。如果您确信没有任何名为 /swapfile 的文件,您可以根据需要使用它,注意正确更改所有位置的文件名。
请务必小心输入任何命令,尤其是 dd
命令,以免覆盖系统上的任何数据。我们使用 sudo su
通过 sudo
进入超级用户 (su) 模式。它与使用 sudo
执行每个命令非常相似,尽管使用这种方式不键入每个 sudo 命令前缀会更容易。
sudo su
if [ -r /swapfile123 ]; then echo "Stop please! /swapfile123 already exists!"; fi
dd if=/dev/zero of=/swapfile123 bs=1024 count=1024000
chmod 0600 /swapfile123
mkswap /swapfile123
swapon /swapfile123
您应该看到类似于以下内容的输出:

如果是这样,恭喜!您刚刚在 Linux 命令行动态地(即时)启用了您的第一个交换文件!
首先,我们使用 dd
工具创建我们的交换空间,使用 /dev/zero
设备(一个虚拟设备,在调用时只输出零,由 dd
或任何其他工具)。接下来我们设置一些适当的安全权限。
接下来,我们使用 mkswap
命令向操作系统指示该文件将成为交换文件。最后,我们在命令行动态地打开了交换空间,而无需重新启动我们的系统。
我们还可以使用 free -m
轻松检查我们的交换空间是否变大了:

太好了,当我们停用新创建的交换文件时,您可以看到我们如何从 12215M 变为 11215M(预期为 -1000M)。您还可以看到我们如何使用 swapoff
在命令行动态关闭交换。
很高兴知道,如果我们看到我们的系统遇到内存问题,并且我们可以足够快地键入,我们可以即时为其提供额外的内存 🙂 实际上,最好在问题发生之前提前这样做.
我们现在只有一个小问题要解决。如果我们此时重新启动,而我们的交换文件将保留在磁盘上,系统将不会使用它。到目前为止没有进行任何设置更改,这将确保在系统重新启动时重新加载交换空间。
在启动时启用我们的新交换
要在启动时启用新的交换空间,只需将以下行(作为行)添加到 /etc/fstab:
/swapfile123 swap swap defaults 0 0
您可以通过启动 /etc/fstab 的 nano 编辑器在 sudo su
模式下(如前导 #
所示)执行此操作:
nano /etc/fstab
cat /etc/fstab
然后只需将上面的行添加到文件末尾并保存 (CTRL+X > Y > enter)。不要修改或删除任何其他行,因为这可能会导致您的系统不再正确启动。还要确保在通过执行上面的 cat /etc/fstab
重新启动之前仔细检查 /etc/fstab 文件的内容。
您现在可以重新启动系统并再次使用 free -m
确认您的额外交换空间仍然可用。
删除我们的新交换空间
如果你想删除新的交换空间,或者创建一个更大的交换空间,你可以先再次编辑 /etc/fstab 文件,然后删除完全加载交换文件的行。不要修改或删除任何其他行,因为这可能会导致您的系统不再正确启动!然后你可以执行:
sudo swapoff /swapfile123
rm /swapfile123
全做完了!也不需要重新启动,因为此更改是动态进行的。在下次重新启动时,交换文件将不再被激活,因为我们从 /etc/fstab 文件中删除了匹配的行。
享受交换文件吧!