介绍
增加服务器的响应速度并防止应用程序出现内存不足错误的最简单方法之一是添加一些交换空间。交换空间是指硬盘上被指定为操作系统可以临时存储无法放入 RAM 中的数据的区域。
基本上,这使您能够增加服务器可以保留在其工作“内存”中的信息量,但有一些注意事项。硬盘上的空间主要在 RAM 中的空间不再足够存放数据时使用。
写入磁盘的信息速度会比保存在 RAM 中的信息慢,但操作系统会更倾向于将运行应用程序的数据保留在内存中,并使用交换空间来存储较旧的数据。总的来说,当系统的 RAM 耗尽时,拥有交换空间作为后备是一个很好的安全网。
在本指南中,我们将介绍如何在 Ubuntu 14.04 服务器上创建和启用交换文件。
检查系统的交换信息
在开始之前,我们将查看我们的操作系统,看看是否已经有一些交换空间可用。我们可以有多个交换文件或交换分区,但通常一个就足够了。
我们可以通过输入以下命令来查看系统是否配置了任何交换空间:
sudo swapon -s
Filename Type Size Used Priority
如果您只收到上面我展示的表的标题,那么您目前没有启用任何交换空间。
另一种更常见的检查交换空间的方法是使用 free
实用程序,它显示系统内存使用情况。我们可以通过输入以下命令来查看我们当前的内存和交换使用情况(以兆字节为单位):
free -m
total used free shared buffers cached Mem: 3953 154 3799 0 8 83 -/+ buffers/cache: 62 3890 <span class="highlight">Swap: 0</span> 0 0
如上所示,我们系统中的总交换空间为“0”。这与我们之前的命令所看到的相匹配。
检查硬盘分区上的可用空间
分配交换空间的典型方法是使用专门用于此任务的单独分区。但是,改变分区方案并非总是可能的。我们可以在现有分区上轻松创建一个交换文件。
在这样做之前,我们应该了解当前的磁盘使用情况。我们可以通过输入以下命令来获取此信息:
df -h
Filesystem Size Used Avail Use% Mounted on <span class="highlight">/dev/vda 59G 1.3G 55G 3% /</span> none 4.0K 0 4.0K 0% /sys/fs/cgroup udev 2.0G 12K 2.0G 1% /dev tmpfs 396M 312K 396M 1% /run none 5.0M 0 5.0M 0% /run/lock none 2.0G 0 2.0G 0% /run/shm none 100M 0 100M 0% /run/user
如您在第一行所看到的,我们的硬盘分区有 55 GB 可用空间,因此我们有大量的空间可供使用。但是,这是在一个全新的中型 VPS 实例上,因此您的实际使用情况可能会有很大不同。
虽然有很多关于交换空间适当大小的观点,但实际上这取决于您的个人偏好和应用程序的要求。通常,与系统上的 RAM 量相等或是其两倍的空间是一个很好的起点。
由于我的系统有 4 GB 的 RAM,将其翻倍将占用我不愿意放弃的大部分磁盘空间,因此我将创建一个 4 GB 的交换空间以匹配我的系统 RAM。
创建交换文件
现在我们知道了可用的硬盘空间,我们可以开始在文件系统中创建一个交换文件。
我们将在根目录(/)中创建一个名为 swapfile
的文件。该文件必须分配我们想要的交换文件空间。有两种主要的方法可以做到这一点:
传统、较慢的方法
传统上,我们会使用 dd
命令创建一个预分配空间的文件。这个多功能磁盘实用程序从一个位置写入到另一个位置。
我们可以使用它从 Linux 系统中位于 /dev/zero
的特殊设备向文件写入零,该设备只会输出所请求的零。
我们通过使用 bs
表示块大小和 count
表示块数来指定文件大小。我们为每个参数分配的值几乎完全是任意的。重要的是它们的乘积结果是什么。
例如,在我们的示例中,我们要创建一个 4 GB 的文件。我们可以通过指定 1 GB 的块大小和 4 个块来实现:
sudo dd if=/dev/zero of=/swapfile bs=1G count=4
4+0 records in 4+0 records out 4294967296 bytes (4.3 GB) copied, 18.6227 s, 231 MB/s
在按下 ENTER 键之前,请检查您的命令,因为如果将 of
(表示输出文件)指向错误的位置,这可能会破坏数据。
我们可以通过输入以下命令来查看已分配了 4 GB:
ls -lh /swapfile
-rw-r--r-- 1 root root <span class="highlight">4.0G</span> Apr 28 17:15 /swapfile
如果您完成了上面的命令,您可能会注意到它花了相当长的时间。实际上,您可以在输出中看到,我的系统花了 18 秒来创建该文件。这是因为它必须将 4 GB 的零写入磁盘。
如果您想了解如何更快地创建文件,请删除文件并按照下面的步骤进行:
sudo rm /swapfile
更快的方式
获取相同文件的更快方式是使用 fallocate
程序。该命令可以立即创建预分配大小的文件,而无需实际写入虚拟内容。
我们可以通过输入以下命令创建一个 4GB 的文件:
sudo fallocate -l 4G /swapfile
几乎立即会返回提示符。我们可以通过输入以下命令验证已保留正确大小的空间:
ls -lh /swapfile
-rw-r--r-- 1 root root <span class="highlight">4.0G</span> Apr 28 17:19 /swapfile
如您所见,我们的文件已创建并正确设置了空间大小。
启用交换文件
目前,我们已创建了文件,但系统不知道这应该用作交换空间。我们需要告诉系统格式化此文件为交换文件,然后启用它。
不过,在执行此操作之前,我们需要调整文件的权限,以便除 root 用户外,其他用户无法读取。允许其他用户读取或写入此文件将构成巨大的安全风险。我们可以通过输入以下命令锁定权限:
sudo chmod 600 /swapfile
通过输入以下命令验证文件是否具有正确的权限:
ls -lh /swapfile
<span class="highlight">-rw-------</span> 1 root root 4.0G Apr 28 17:19 /swapfile
如您所见,只有 root 用户的列启用了读取和写入标志。
现在,我们的文件更加安全,我们可以通过输入以下命令告诉系统设置交换空间:
sudo mkswap /swapfile
Setting up swapspace version 1, size = 4194300 KiB no label, UUID=e2f1e9cf-c0a9-4ed4-b8ab-714b8a7d6944
我们的文件现在已准备好用作交换空间。我们可以通过输入以下命令启用它:
sudo swapon /swapfile
我们可以通过检查系统是否报告交换空间来验证该过程是否成功:
sudo swapon -s
Filename Type Size Used Priority <span class="highlight">/swapfile file 4194300 0 -1</span>
我们在这里有一个新的交换文件。我们可以再次使用 free
实用程序来证实我们的发现:
free -m
total used free shared buffers cached Mem: 3953 101 3851 0 5 30 -/+ buffers/cache: 66 3887 <span class="highlight">Swap: 4095</span> 0 4095
我们的交换已成功设置,操作系统将根据需要开始使用它。
使交换文件永久化
我们已启用了交换文件,但重新启动服务器时,系统将不会自动启用该文件。不过,我们可以通过修改 fstab
文件来更改这一点。
使用 root 权限在文本编辑器中编辑文件:
sudo nano /etc/fstab
在文件底部,您需要添加一行,告诉操作系统自动使用您创建的文件:
/swapfile none swap sw 0 0
完成后保存并关闭文件。
调整交换设置
有一些选项可以配置,这些选项将影响系统在处理交换时的性能。
swappiness
参数配置系统将数据从 RAM 交换到交换空间的频率。这是一个介于 0 和 100 之间的值,表示百分比。
值接近零时,内核将只在绝对必要时将数据交换到磁盘。请记住,与 RAM 的交互“昂贵”,因为它所需的时间比与 RAM 的交互长得多,并且可能会显著降低性能。告诉系统不要过多依赖交换通常会使系统更快。
接近 100 的值将尝试将更多数据放入交换空间,以保持更多的 RAM 空间空闲。根据您的应用程序内存配置或服务器用途,这在某些情况下可能更好。
我们可以通过输入以下命令查看当前的 swappiness 值:
cat /proc/sys/vm/swappiness
60
对于桌面系统,swappiness 设置为 60 不是一个坏值。对于 VPS 系统,我们可能希望将其调整到接近 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)错误,或者发现系统无法运行所需的应用程序,最好的解决方案是优化应用程序配置或升级服务器。然而,配置交换空间可以为您提供更多灵活性,并有助于在性能较弱的服务器上争取更多时间。