介绍
在应用程序中防止内存不足错误的最简单方法之一是为服务器添加一些交换空间。在本指南中,我们将介绍如何在 Ubuntu 18.04 服务器上添加交换文件。
什么是交换空间?
交换空间 是硬盘上被指定为操作系统可以临时存储无法再保留在 RAM 中的数据的区域。基本上,这使您能够增加服务器可以保留在其工作“内存”中的信息量,但有一些注意事项。硬盘上的交换空间主要在 RAM 不再足以容纳正在使用的应用程序数据时使用。
写入磁盘的信息速度将明显慢于保留在 RAM 中的信息,但操作系统会更倾向于将运行的应用程序数据保留在内存中,并使用交换空间来存储旧数据。总的来说,对于具有非 SSD 存储的系统,将交换空间作为系统 RAM 耗尽时的后备可以有效防止内存不足异常。
步骤 1 – 检查系统的交换信息
在开始之前,我们可以检查系统是否已经有一些可用的交换空间。可能有多个交换文件或交换分区,但通常一个就足够了。
我们可以通过输入以下命令来查看系统是否配置了任何交换:
sudo swapon --show
如果没有返回任何输出,这意味着您的系统当前没有可用的交换空间。
您可以使用 free
实用程序验证没有活动的交换:
free -h
total used free shared buff/cache available Mem: 985M 84M 222M 680K 678M 721M Swap: 0B 0B 0B
如您在输出的 Swap 行中所见,系统上没有活动的交换。
步骤 2 – 检查硬盘分区上的可用空间
在创建交换文件之前,我们将检查当前磁盘使用情况,以确保有足够的空间。通过输入以下命令来执行此操作:
df -h
Filesystem Size Used Avail Use% Mounted on udev 481M 0 481M 0% /dev tmpfs 99M 656K 98M 1% /run /dev/vda1 25G 1.4G 23G 6% / tmpfs 493M 0 493M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 493M 0 493M 0% /sys/fs/cgroup /dev/vda15 105M 3.4M 102M 4% /boot/efi 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
-rw------- 1 root root 1.0G Apr 25 11:14 /swapfile
如您所见,只有 root 用户拥有读取和写入权限。
现在我们可以通过输入以下命令将文件标记为交换空间:
sudo mkswap /swapfile
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes) no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf
标记文件后,我们可以启用交换文件,使系统开始使用它:
sudo swapon /swapfile
通过输入以下命令验证交换是否可用:
sudo swapon --show
NAME TYPE SIZE USED PRIO /swapfile file 1024M 0B -2
我们可以再次使用 free
实用程序的输出来证实我们的发现:
free -h
total used free shared buff/cache available Mem: 985M 84M 220M 680K 680M 722M Swap: 1.0G 0B 1.0G
我们成功设置了交换空间,操作系统将根据需要开始使用它。
步骤 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
60
对于桌面系统,swappiness
设置为 60 不是一个坏值。对于服务器,您可能希望将其调整到接近 0。
我们可以使用 sysctl
命令将 swappiness
设置为不同的值。
例如,要将 swappiness
设置为 10,我们可以输入:
sudo sysctl vm.swappiness=10
vm.swappiness = 10
此设置将持续到下次重新启动。我们可以通过将该行添加到我们的 /etc/sysctl.conf
文件来在重新启动时自动设置此值:
sudo nano /etc/sysctl.conf
在底部,您可以添加:
vm.swappiness=10
完成后保存并关闭文件。
调整缓存压力设置
您可能还希望修改的另一个相关值是 vfs_cache_pressure
。此设置配置系统在其他数据之上选择缓存 inode 和 dentry 信息的程度。
基本上,这是有关文件系统的访问数据。这通常是非常昂贵的查找,并且经常被请求,因此对于系统来说,这是一个很好的缓存。您可以再次查询 proc
文件系统来查看当前值:
cat /proc/sys/vm/vfs_cache_pressure
100
按照当前配置,我们的系统会过快地从缓存中删除 inode 信息。我们可以通过输入以下命令将其设置为更保守的值,如 50:
sudo sysctl vm.vfs_cache_pressure=50
vm.vfs_cache_pressure = 50
同样,这仅对当前会话有效。我们可以通过将其添加到我们的配置文件中来更改这一点,就像我们对 swappiness
设置所做的那样:
sudo nano /etc/sysctl.conf
在底部,添加指定新值的行:
vm.vfs_cache_pressure=50
完成后保存并关闭文件。
结论
按照本指南中的步骤进行操作,可以在本应导致内存不足异常的情况下为您提供一些缓冲空间。交换空间在避免一些常见问题方面非常有用。
如果您遇到内存不足错误(OOM),或者发现系统无法使用您需要的应用程序,最佳解决方案是优化应用程序配置或升级服务器。