介绍
在增加服务器的响应速度并防止应用程序出现内存不足错误的最简单方法之一是添加一些交换空间。在本指南中,我们将介绍如何向 Ubuntu 16.04 服务器添加交换文件。
什么是交换空间?
交换空间是硬盘上被指定为操作系统可以临时存储无法再放入 RAM 中的数据的区域。基本上,这使您能够增加服务器可以保存在其工作“内存”中的信息量,但有一些注意事项。硬盘上的交换空间主要在 RAM 中不再有足够空间来容纳正在使用的应用程序数据时使用。
写入磁盘的信息速度将明显慢于保存在 RAM 中的信息,但操作系统会更倾向于将运行的应用程序数据保留在内存中,并使用交换空间来存储旧数据。总的来说,当系统的 RAM 耗尽时,拥有交换空间作为后备可以有效防止系统出现内存不足异常,尤其是在具有非 SSD 存储的系统上。
检查系统的交换信息
在开始之前,我们可以检查系统是否已经有一些可用的交换空间。系统可以有多个交换文件或交换分区,但通常一个就足够了。
我们可以通过输入以下命令来查看系统是否配置了任何交换空间:
sudo swapon --show
如果没有返回任何输出,这意味着您的系统当前没有可用的交换空间。
您可以使用 free
实用程序验证是否没有活动的交换:
free -h
total used free shared buff/cache available Mem: 488M 36M 104M 652K 348M 426M Swap: 0B 0B 0B
如您在输出的“Swap”行中所见,系统上没有活动的交换空间。
检查硬盘分区上的可用空间
为交换分配空间的最常见方法是使用专门用于此任务的单独分区。但是,改变分区方案并非总是可能的。我们同样可以在现有分区上创建一个交换文件。
在执行此操作之前,我们应该通过输入以下命令来检查当前磁盘使用情况:
df -h
Filesystem Size Used Avail Use% Mounted on udev 238M 0 238M 0% /dev tmpfs 49M 624K 49M 2% /run /dev/vda1 20G 1.1G 18G 6% / tmpfs 245M 0 245M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 245M 0 245M 0% /sys/fs/cgroup tmpfs 49M 0 49M 0% /run/user/1001
在本例中,/dev
下的设备是我们的磁盘。在此示例中,我们有足够的可用空间(仅使用了 1.1G)。您的使用情况可能会有所不同。
尽管有关交换空间适当大小的意见很多,但实际上取决于个人偏好和应用程序要求。通常,与系统上的 RAM 量相等或两倍于 RAM 量的交换空间是一个很好的起点。另一个经验法则是,如果您只是将其用作 RAM 后备,那么超过 4G 的交换空间可能是不必要的。
创建交换文件
现在我们知道了可用的硬盘空间,我们可以开始在文件系统中创建一个交换文件。我们将在根目录(/)中创建一个名为 swapfile
的交换大小文件。
使用 fallocate
程序创建交换文件是最佳方式。此命令可以立即创建一个预分配大小的文件。
由于我们示例中的服务器具有 512MB 的 RAM,我们将在本指南中创建一个 1GB 的文件。请根据您自己服务器的需求进行调整:
sudo fallocate -l 1G /swapfile
我们可以通过输入以下命令来验证已保留正确数量的空间:
ls -lh /swapfile
-rw-r--r-- 1 root root 1.0G Apr 25 11:14 /swapfile
我们已经创建了具有正确空间大小的文件。
启用交换文件
现在我们已经有了正确大小的文件,我们需要将其转换为交换空间。
首先,我们需要锁定文件的权限,以便只有具有 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 -1
我们可以再次使用 free
实用程序的输出来证实我们的发现:
free -h
total used free shared buff/cache available Mem: 488M 37M 96M 652K 354M 425M Swap: 1.0G 0B 1.0G
我们成功设置了交换空间,操作系统将开始根据需要使用它。
使交换文件永久化
我们最近的更改已经为当前会话启用了交换文件。但是,如果我们重新启动,服务器将不会自动保留交换设置。我们可以通过将交换文件添加到我们的 /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
调整交换设置
有一些选项可以配置,这些选项将影响系统在处理交换时的性能。
调整 Swappiness 属性
swappiness
参数配置系统将数据从 RAM 交换到交换空间的频率。这是一个介于 0 和 100 之间的值,表示一个百分比。
当值接近零时,内核只有在绝对必要时才会将数据交换到磁盘。请记住,与 RAM 的交互“昂贵”,因为它所需的时间比与 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
同样,这仅对当前会话有效。我们可以通过将其添加到配置文件中来更改:
sudo nano /etc/sysctl.conf
在底部,添加指定新值的行:
vm.vfs_cache_pressure=50
完成后保存并关闭文件。
结论
按照本指南中的步骤进行操作,可以在本应导致内存不足异常的情况下为您提供一些缓冲空间。交换空间在避免一些常见问题方面非常有用。
如果您遇到内存不足错误(OOM),或者发现系统无法使用您需要的应用程序,最佳解决方案是优化应用程序配置或升级服务器。