提高服务器响应能力和防止应用程序内存不足错误的最简单方法之一是添加一些交换空间。在本指南中,我们将介绍如何将交换文件添加到 Ubuntu 16.04 服务器。
Swap是硬盘驱动器上的一个区域,被指定为操作系统可以临时存储 RAM 中无法再保存的数据的位置。基本上,这使您能够增加服务器在其工作“内存”中可以保存的信息量,但有一些注意事项。主要当 RAM 中不再有足够的空间来保存正在使用的应用程序数据时,将使用硬盘驱动器上的交换空间。
写入磁盘的信息将比保存在 RAM 中的信息慢得多,但操作系统更愿意将运行的应用程序数据保留在内存中,并对旧数据使用交换。总的来说,当系统 RAM 耗尽时,使用交换空间作为后备措施可以成为一个很好的安全网,防止在具有可用非 SSD 存储的系统上出现内存不足异常。
在开始之前,我们可以检查系统是否已经有一些可用的交换空间。可以有多个交换文件或交换分区,但通常一个就足够了。
我们可以通过键入以下内容来查看系统是否有任何已配置的交换:
如果您没有得到任何输出,这意味着您的系统当前没有可用的交换空间。
您可以使用以下命令验证是否没有活动交换free
公用事业:
Output
total used free shared buff/cache available
Mem: 488M 36M 104M 652K 348M 426M
Swap: 0B 0B 0B
正如您在输出的“交换”行中看到的,系统上没有处于活动状态的交换。
为交换分配空间的最常见方法是使用专门用于该任务的单独分区。然而,改变分区方案并不总是可能的。我们可以轻松地创建驻留在现有分区上的交换文件。
在执行此操作之前,我们应该通过键入以下内容来检查当前的磁盘使用情况:
Output
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 后备,那么超过 4G 的交换空间可能是不必要的。
现在我们知道了可用的硬盘空间,我们可以在文件系统中创建交换文件。我们将创建一个我们想要的交换大小的文件swapfile
在我们的根 (/) 目录中。
创建交换文件的最佳方法是使用fallocate
程序。该命令立即创建一个预先分配大小的文件。
由于我们示例中的服务器有 512MB RAM,因此我们将在本指南中创建一个 1GB 文件。调整此以满足您自己的服务器的需求:
-
sudo fallocate -l 1G /swapfile
我们可以通过键入以下内容来验证是否保留了正确的空间量:
- -rw-r--r--1根根1.0G Apr 25 11:14 /交换文件
我们的文件已创建,并预留了正确的空间量。
现在我们有了一个正确大小的可用文件,我们需要将其实际转换为交换空间。
首先,我们需要锁定文件的权限,以便只有具有权限的用户才能访问该文件root
权限可以读取内容。这会阻止普通用户访问该文件,这会产生重大的安全隐患。
使文件只能访问root
通过输入:
通过键入以下内容验证权限更改:
Output
-rw------- 1 root root 1.0G Apr 25 11:14 /swapfile
正如您所看到的,只有 root 用户启用了读取和写入标志。
我们现在可以通过键入以下内容将文件标记为交换空间:
Output
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf
标记文件后,我们可以启用交换文件,允许我们的系统开始使用它:
我们可以通过输入以下内容来验证交换是否可用:
Output
NAME TYPE SIZE USED PRIO
/swapfile file 1024M 0B -1
我们可以检查输出free
再次验证我们的发现:
Output
total used free shared buff/cache available
Mem: 488M 37M 96M 652K 354M 425M
Swap: 1.0G 0B 1.0G
我们的交换已成功设置,我们的操作系统将根据需要开始使用它。
我们最近的更改启用了当前会话的交换文件。但是,如果我们重新启动,服务器将不会自动保留交换设置。我们可以通过将交换文件添加到我们的/etc/fstab
file.
备份/etc/fstab
文件以防出现问题:
-
sudo cp/etc/fstab /etc/fstab.bak
您可以将交换文件信息添加到您的文件末尾/etc/fstab
通过键入以下内容创建文件:
-
echo '/swapfile 无交换 sw 0 0' | sudo tee -a/etc/fstab
您可以配置一些选项,这些选项会在处理交换时影响系统的性能。
The swappiness
参数配置系统将数据从 RAM 交换到交换空间的频率。这是一个介于 0 到 100 之间的值,表示百分比。
当值接近于零时,除非绝对必要,否则内核不会将数据交换到磁盘。请记住,与交换文件的交互是“昂贵的”,因为它们比与 RAM 的交互花费更长的时间,并且可能导致性能显着降低。告诉系统不要过多依赖交换通常会让您的系统更快。
接近 100 的值将尝试将更多数据放入交换区,以保持更多可用 RAM 空间。根据您的应用程序的内存配置文件或您使用服务器的目的,这在某些情况下可能会更好。
我们可以通过输入以下内容来查看当前的交换值:
-
cat/proc/sys/vm/swappiness
Output
60
对于台式机来说,swappiness 设置为 60 并不是一个坏值。对于服务器,您可能希望将其移近 0。
我们可以使用以下命令将 swappiness 设置为不同的值sysctl
命令。
例如,要将 swappiness 设置为 10,我们可以输入:
Output
vm.swappiness = 10
此设置将持续到下次重新启动为止。我们可以通过将行添加到我们的重新启动时自动设置此值/etc/sysctl.conf
file:
-
sudo nano/etc/sysctl.conf
在底部,您可以添加:
/etc/sysctl.conf
vm.swappiness=10
完成后保存并关闭文件。
您可能想要修改的另一个相关值是vfs_cache_pressure
。此设置配置系统将选择在其他数据上缓存 inode 和 dentry 信息的程度。
基本上,这是有关文件系统的访问数据。通常,查找成本非常高并且请求非常频繁,因此对于系统来说,缓存是一件非常好的事情。您可以通过查询来查看当前值proc
再次文件系统:
-
cat/proc/sys/vm/vfs_cache_压
Output
100
根据当前配置,我们的系统从缓存中删除索引节点信息的速度太快。我们可以通过键入以下内容将其设置为更保守的设置,例如 50:
-
sudo sysctl vm.vfs_cache_压=50
Output
vm.vfs_cache_pressure = 50
再次强调,这仅对我们当前的会话有效。我们可以通过将其添加到我们的配置文件中来更改它,就像我们对交换设置所做的那样:
-
sudo nano/etc/sysctl.conf
在底部添加指定新值的行:
/etc/sysctl.conf
vm.vfs_cache_pressure=50
完成后保存并关闭文件。
遵循本指南中的步骤将为您提供一些喘息空间,以防出现内存不足异常。交换空间对于避免其中一些常见问题非常有用。
如果遇到 OOM(内存不足)错误,或者发现系统无法使用所需的应用程序,最好的解决方案是优化应用程序配置或升级服务器。