如何在 Ubuntu 20.04 上添加交换空间

介绍

防止应用程序内存不足错误的一种方法是向服务器添加一些交换空间。在本指南中,我们将介绍如何将交换文件添加到 Ubuntu 20.04 服务器。

警告:虽然通常建议对使用传统旋转硬盘驱动器的系统进行交换,但将交换放置在 SSD 上可能会随着时间的推移导致硬件退化问题。因此,我们不建议在 DigitalOcean 或任何其他使用 SSD 存储的提供商上启用交换。

什么是掉期?

交换是硬盘驱动器存储的一部分,已为操作系统留出,用于临时存储其无法再保存在 RAM 中的数据。这使您可以增加服务器可以保留在其工作内存中的信息量,但有一些注意事项。硬盘驱动器上的交换空间将主要在 RAM 中不再有足够空间来保存正在使用的应用程序数据时使用。

写入磁盘的信息将比保存在 RAM 中的信息慢得多,但操作系统更愿意继续在内存中运行应用程序数据,并为旧数据使用交换。总体而言,当系统 RAM 耗尽时,将交换空间作为后备可能是一个很好的安全网,可以防止在具有非 SSD 存储可用的系统上出现内存不足异常。

步骤 1 – 检查系统的交换信息

在开始之前,我们可以检查系统是否已经有一些可用的交换空间。可以有多个交换文件或交换分区,但通常一个就足够了。

我们可以通过键入以下内容来查看系统是否有任何配置的交换:

  • sudo swapon --show

如果你没有得到任何输出,这意味着你的系统当前没有可用的交换空间。

您可以使用该free实用程序验证没有活动交换

  • free -h
Output
total used free shared buff/cache available Mem: 981Mi 122Mi 647Mi 0.0Ki 211Mi 714Mi Swap: 0B 0B 0B

正如您在输出Swap行中看到的那样,系统上没有活动的交换。

步骤 2 – 检查硬盘分区上的可用空间

在创建交换文件之前,我们将检查当前的磁盘使用情况以确保我们有足够的空间。输入:

  • df -h
Output
Filesystem Size Used Avail Use% Mounted on udev 474M 0 474M 0% /dev tmpfs 99M 932K 98M 1% /run /dev/vda1 25G 1.4G 23G 7% / tmpfs 491M 0 491M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 491M 0 491M 0% /sys/fs/cgroup /dev/vda15 105M 3.9M 101M 4% /boot/efi /dev/loop0 55M 55M 0 100% /snap/core18/1705 /dev/loop1 69M 69M 0 100% /snap/lxd/14804 /dev/loop2 28M 28M 0 100% /snap/snapd/7264 tmpfs 99M 0 99M 0% /run/user/1000

在这种情况下/Mounted on列中的设备是我们的磁盘。在这个例子中我们有足够的可用空间(只使用了 1.4G)。您的用法可能会有所不同。

尽管对于交换空间的适当大小有很多意见,但这实际上取决于您的个人喜好和您的应用程序要求。通常,等于或两倍于您系统上的 RAM 量是一个很好的起点。另一个很好的经验法则是,如果您只是将其用作 RAM 回退,则可能不需要任何超过 4G 的交换。

步骤 3 – 创建交换文件

现在我们知道了可用的硬盘空间,我们可以在我们的文件系统上创建一个交换文件。我们将swapfile在我们的根 ( /) 目录中分配一个我们想要调用的大小的文件

创建交换文件的最佳方式是使用fallocate程序。此命令立即创建指定大小的文件。

由于我们示例中的服务器有 1G 的 RAM,我们将在本指南中创建一个 1G 的文件。调整此项以满足您自己服务器的需求:

  • sudo fallocate -l 1G /swapfile

我们可以通过键入以下内容来验证是否保留了正确的空间量:

  • ls -lh /swapfile
  • -rw-r--r-- 1 root root 1.0G Apr 25 11:14 /swapfile

我们的文件已创建并预留了正确的空间量。

步骤 4 – 启用交换文件

现在我们有一个正确大小的可用文件,我们需要实际将其转换为交换空间。

首先,我们需要锁定文件的权限,以便只有具有root权限的用户才能读取内容。这会阻止普通用户访问该文件,这将具有重大的安全隐患。

通过键入以下内容使文件只能root访问

  • sudo chmod 600 /swapfile

通过键入以下内容验证权限更改:

  • ls -lh /swapfile
Output
-rw------- 1 root root 1.0G Apr 25 11:14 /swapfile

如您所见,只有root用户启用了读写标志。

我们现在可以通过键入以下内容将文件标记为交换空间:

  • sudo mkswap /swapfile
Output
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes) no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf

标记文件后,我们可以启用交换文件,允许我们的系统开始使用它:

  • sudo swapon /swapfile

通过键入以下内容验证交换是否可用:

  • sudo swapon --show
Output
NAME TYPE SIZE USED PRIO /swapfile file 1024M 0B -2

我们可以free再次检查该实用程序的输出以证实我们的发现:

  • free -h
Output
total used free shared buff/cache available Mem: 981Mi 123Mi 644Mi 0.0Ki 213Mi 714Mi Swap: 1.0Gi 0B 1.0Gi

我们的交换已成功设置,我们的操作系统将根据需要开始使用它。

步骤 5 – 使交换文件永久化

我们最近的更改为当前会话启用了交换文件。但是,如果我们重新启动,服务器将不会自动保留交换设置。我们可以通过将交换文件添加到我们的/etc/fstab文件来改变这一点

备份/etc/fstab文件以防万一出现问题:

  • sudo cp /etc/fstab /etc/fstab.bak

/etc/fstab通过键入以下内容将交换文件信息添加到文件末尾

  • echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

接下来,我们将回顾一些可以更新以调整交换空间的设置。

第 6 步 – 调整您的交换设置

您可以配置一些选项,这些选项在处理交换时会对系统性能产生影响。

调整 Swappiness 属性

swappiness参数配置您的系统将数据从 RAM 交换到交换空间的频率。这是一个介于 0 和 100 之间的值,表示百分比。

值接近于零时,除非绝对必要,否则内核不会将数据交换到磁盘。请记住,与交换文件的交互是“昂贵的”,因为它们比与 RAM 的交互花费的时间要长得多,并且可能导致性能显着降低。告诉系统不要过多依赖交换通常会使您的系统更快。

接近 100 的值将尝试将更多数据放入交换区,以保持更多 RAM 空间可用。根据您的应用程序的内存配置文件或您使用服务器的目的,在某些情况下这可能会更好。

我们可以通过键入以下内容来查看当前的 swappiness 值:

  • cat /proc/sys/vm/swappiness
Output
60

对于台式机,swappiness 设置为 60 是一个不错的值。对于服务器,您可能希望将其移近 0。

我们可以使用sysctl命令将 swappiness 设置为不同的值

例如,要将 swappiness 设置为 10,我们可以输入:

  • sudo sysctl vm.swappiness=10
Output
vm.swappiness = 10

此设置将持续到下一次重新启动。我们可以通过在/etc/sysctl.conf文件中添加以下行来在重新启动时自动设置此值

  • sudo nano /etc/sysctl.conf

在底部,您可以添加:

/etc/sysctl.conf
vm.swappiness=10

完成后保存并关闭文件。

调整缓存压力设置

您可能想要修改的另一个相关值是vfs_cache_pressure. 此设置配置系统将选择在多大程度上缓存inodedentry信息而不是其他数据。

基本上,这是关于文件系统的访问数据。这通常是非常昂贵的查找并且经常被请求,因此对您的系统进行缓存是一件极好的事情。您可以通过proc再次查询文件系统来查看当前值

  • cat /proc/sys/vm/vfs_cache_pressure
Output
100

由于它当前的配置,我们的系统从缓存中删除 inode 信息太快了。我们可以通过键入以下内容将其设置为更保守的设置,例如 50:

  • sudo sysctl vm.vfs_cache_pressure=50
Output
vm.vfs_cache_pressure = 50

同样,这仅对我们当前的会话有效。我们可以通过将它添加到我们的配置文件中来改变它,就像我们在 Swappiness 设置中所做的那样:

  • sudo nano /etc/sysctl.conf

在底部,添加指定新值的行:

/etc/sysctl.conf
vm.vfs_cache_pressure=50

完成后保存并关闭文件。

结论

遵循本指南中的步骤将为您提供一些喘息空间,否则会导致内存不足异常。交换空间对于避免其中一些常见问题非常有用。

如果您遇到 OOM(内存不足)错误,或者您发现您的系统无法使用您需要的应​​用程序,最好的解决方案是优化您的应用程序配置或升级您的服务器。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁