介绍
提高服务器响应能力和防止应用程序内存不足错误的最简单方法之一是添加一些交换空间。 Swap 是硬盘驱动器上的一个区域,已被指定为操作系统可以临时存储无法再保存在 RAM 中的数据的位置。
基本上,这使您能够增加服务器可以保留在其工作“内存”中的信息量,但有一些警告。 硬盘驱动器上的空间将主要用于当 RAM 中的空间不再足够存储数据时。
写入磁盘的信息将比保存在 RAM 中的信息慢,但操作系统更愿意将运行的应用程序数据保留在内存中,并使用交换来处理较旧的数据。 总体而言,当系统 RAM 耗尽时,将交换空间作为后备是一个很好的安全网。
在本指南中,我们将介绍如何在 Ubuntu 14.04 服务器上创建和启用交换文件。
笔记
尽管对于使用传统旋转硬盘的系统通常建议使用交换,但使用 SSD 交换可能会导致硬件随着时间的推移而退化。 出于这一考虑,我们不建议在 DigitalOcean 或任何其他使用 SSD 存储的提供商上启用交换。 这样做会影响您和您的邻居的底层硬件的可靠性。
如果您需要提高服务器的性能,我们建议升级您的 Droplet。 这通常会带来更好的结果,并会降低导致可能影响服务的硬件问题的可能性。
检查系统以获取交换信息
在开始之前,我们先看看我们的操作系统,看看我们是否已经有一些可用的交换空间。 我们可以有多个交换文件或交换分区,但通常一个就足够了。
我们可以通过键入以下内容来查看系统是否有任何已配置的交换:
sudo swapon -s
Filename Type Size Used Priority
如果您只取回表的标题,如上所示,您当前没有启用任何交换空间。
另一种更熟悉的检查交换空间的方法是使用 free
实用程序,它向我们显示系统内存使用情况。 我们可以通过键入以下内容来查看当前的内存和交换使用量(以 MB 为单位):
免费-m
总使用的空闲共享缓冲区缓存内存:3953 154 3799 0 8 83 -/+ 缓冲区/缓存:62 3890交换:0 0 0
如上所示,我们在系统中的总交换空间为“0”。 这与我们在前面的命令中看到的一致。
检查硬盘分区上的可用空间
为交换分配空间的典型方法是使用专门用于任务的单独分区。 然而,改变分区方案并不总是可行的。 我们可以轻松地创建驻留在现有分区上的交换文件。
在我们这样做之前,我们应该知道我们当前的磁盘使用情况。 我们可以通过键入以下内容来获取此信息:
df -h
Filesystem Size Used Avail Use% Mounted on /dev/vda 59G 1.3G 55G 3% / none 4.0K 0 4.0K 0% /sys/fs/cgroup udev 2.0G 12K 2.0G 1% /dev tmpfs 396M 312K 396M 1% /运行无 5.0M 0 5.0M 0% /run/lock 无 2.0G 0 2.0G 0% /run/shm 无 100M 0 100M 0% /run/user
正如您在第一行看到的,我们的硬盘分区有 55 GB 可用,因此我们有大量空间可以使用。 但是,这是在一个新的中型 VPS 实例上,因此您的实际使用情况可能会有很大不同。
尽管对于交换空间的适当大小有很多意见,但这实际上取决于您的个人喜好和您的应用程序要求。 通常,等于或两倍于系统上的 RAM 量是一个很好的起点。
由于我的系统有 4 GB 的 RAM,并且翻倍会占用我不愿意放弃的大量磁盘空间,我将创建一个 4 GB 的交换空间来匹配我系统的 RAM。
创建交换文件
现在我们知道了可用的硬盘空间,我们可以在文件系统中创建一个交换文件。
我们将在根 (/) 目录中创建一个名为 swapfile
的文件。 该文件必须为我们的交换文件分配我们想要的空间量。 有两种主要方法可以做到这一点:
传统的、缓慢的方式
传统上,我们会使用 dd
命令创建具有预分配空间的文件。 这个多功能的磁盘实用程序从一个位置写入另一个位置。
我们可以使用它从位于 /dev/zero
的 Linux 系统中的一个特殊设备向文件写入零,该设备会根据要求吐出尽可能多的零。
我们通过将 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 /交换文件
-rw-r–r-- 1 root root 4.0G Apr 28 17:15 /swapfile
如果你已经完成了上面的命令,你可能会注意到它花了很长时间。 事实上,您可以在输出中看到我的系统花了 18 秒来创建文件。 那是因为它必须将 4 GB 的零写入磁盘。
如果您想了解如何更快地创建文件,请删除该文件并按照以下说明进行操作:
sudo rm /swapfile
更快的方式
获取相同文件的更快方法是使用 fallocate
程序。 此命令会立即创建一个预先分配大小的文件,而无需实际写入虚拟内容。
我们可以通过键入以下内容创建一个 4 GB 的文件:
sudo fallocate -l 4G /swapfile
提示将几乎立即返回给您。 我们可以通过键入以下内容来验证是否保留了正确的空间量:
ls -lh /交换文件
-rw-r–r-- 1 root root 4.0G Apr 28 17:19 /swapfile
如您所见,我们的文件是在留出正确空间量的情况下创建的。
启用交换文件
现在,我们的文件已创建,但我们的系统不知道这应该用于交换。 我们需要告诉我们的系统将此文件格式化为交换,然后启用它。
不过,在我们这样做之前,我们需要调整文件的权限,以便除 root 之外的任何人都无法读取它。 允许其他用户读取或写入此文件将是一个巨大的安全风险。 我们可以通过键入以下内容来锁定权限:
sudo chmod 600 /swapfile
通过键入以下内容验证文件是否具有正确的权限:
ls -lh /交换文件
-rw------- 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
我们可以通过检查我们的系统现在是否报告交换空间来验证该过程是否成功:
须藤交换 -s
文件名 类型 使用的大小 优先级/swapfile 文件 4194300 0 -1
我们这里有一个新的交换文件。 我们可以再次使用 free
实用程序来证实我们的发现:
免费-m
总使用的空闲共享缓冲区缓存内存:3953 101 3851 0 5 30 -/+ 缓冲区/缓存:66 3887交换:4095 0 4095
我们的交换已成功设置,我们的操作系统将根据需要开始使用它。
使交换文件永久化
我们启用了交换文件,但是当我们重新启动时,服务器不会自动启用该文件。 我们可以通过修改 fstab
文件来改变它。
在文本编辑器中使用 root 权限编辑文件:
sudo nano /etc/fstab
在文件的底部,您需要添加一行,告诉操作系统自动使用您创建的文件:
/swapfile none swap sw 0 0
完成后保存并关闭文件。
调整你的交换设置
您可以配置一些选项,这些选项会在处理交换时影响系统的性能。
swappiness
参数配置系统将数据从 RAM 交换到交换空间的频率。 这是一个介于 0 和 100 之间的值,表示百分比。
当值接近零时,除非绝对必要,否则内核不会将数据交换到磁盘。 请记住,与交换文件的交互是“昂贵的”,因为它们比与 RAM 的交互花费的时间要长得多,并且会导致性能显着降低。 告诉系统不要过多地依赖交换通常会使您的系统更快。
接近 100 的值将尝试将更多数据放入交换中,以保持更多 RAM 空间可用。 根据您的应用程序的内存配置文件或您使用服务器的目的,在某些情况下这可能会更好。
我们可以通过键入以下内容查看当前的交换值:
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
完成后保存并关闭文件。
结论
遵循本指南中的步骤将为您的 RAM 使用提供一些喘息的空间。 交换空间在避免一些常见问题方面非常有用。
如果您遇到 OOM(内存不足)错误,或者您发现您的系统无法使用您需要的应用程序,最好的解决方案是优化您的应用程序配置或升级您的服务器。 但是,配置交换空间可以为您提供更大的灵活性,并可以帮助您在功能较弱的服务器上争取时间。