如何在Ubuntu16.04上添加交换空间

来自菜鸟教程
跳转至:导航、​搜索

介绍

提高服务器响应能力和防止应用程序内存不足错误的最简单方法之一是添加一些交换空间。 在本指南中,我们将介绍如何将交换文件添加到 Ubuntu 16.04 服务器。

警告

尽管对于使用传统旋转硬盘的系统通常建议使用交换,但使用 SSD 交换可能会导致硬件随着时间的推移而退化。 出于这一考虑,我们不建议在 DigitalOcean 或任何其他使用 SSD 存储的提供商上启用交换。 这样做会影响您和您的邻居的底层硬件的可靠性。 本指南仅供可能在其他地方拥有旋转磁盘系统的用户参考。

如果您需要在 DigitalOcean 上提高服务器的性能,我们建议升级您的 Droplet。 这通常会带来更好的结果,并会降低导致可能影响服务的硬件问题的可能性。


什么是互换?

Swap 是硬盘驱动器上的一个区域,已被指定为操作系统可以临时存储无法再保存在 RAM 中的数据的位置。 基本上,这使您能够增加服务器可以保留在其工作“内存”中的信息量,但有一些警告。 硬盘驱动器上的交换空间将主要用于当 RAM 中不再有足够的空间来保存正在使用的应用程序数据时。

写入磁盘的信息将比保存在 RAM 中的信息慢得多,但操作系统更愿意将运行的应用程序数据保留在内存中,并使用交换来处理较旧的数据。 总体而言,当系统 RAM 耗尽时,将交换空间作为后备可以是一个很好的安全网,可以防止在具有非 SSD 存储的系统上出现内存不足异常。

检查系统以获取交换信息

在开始之前,我们可以检查系统是否已经有一些可用的交换空间。 可以有多个交换文件或交换分区,但通常一个就足够了。

我们可以通过键入以下内容来查看系统是否有任何已配置的交换:

sudo swapon --show

如果您没有返回任何输出,这意味着您的系统当前没有可用的交换空间。

您可以使用 free 实用程序验证是否没有活动交换:

free -h
Output              total        used        free      shared  buff/cache   available
Mem:           488M         36M        104M        652K        348M        426M
Swap:            0B          0B          0B

正如您在输出的“Swap”行中看到的,系统上没有活动的交换。

检查硬盘分区上的可用空间

为交换分配空间的最常见方法是使用专门用于任务的单独分区。 然而,改变分区方案并不总是可行的。 我们可以轻松地创建驻留在现有分区上的交换文件。

在我们这样做之前,我们应该通过键入以下内容检查当前的磁盘使用情况:

df -h
OutputFilesystem      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,我们将在本指南中创建一个 1 GB 的文件。 调整此项以满足您自己的服务器的需求:

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
Output-rw------- 1 root root 1.0G Apr 25 11:14 /swapfile

如您所见,只有 root 用户启用了读写标志。

我们现在可以通过键入以下内容将文件标记为交换空间:

sudo mkswap /swapfile
OutputSetting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf

标记文件后,我们可以启用交换文件,让我们的系统开始使用它:

sudo swapon /swapfile

我们可以通过键入以下内容来验证交换是否可用:

sudo swapon --show
OutputNAME      TYPE  SIZE USED PRIO
/swapfile file 1024M   0B   -1

我们可以再次检查 free 实用程序的输出来证实我们的发现:

free -h
Output              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 的交互花费的时间要长得多,并且会导致性能显着降低。 告诉系统不要过多地依赖交换通常会使您的系统更快。

接近 100 的值将尝试将更多数据放入交换中,以保持更多 RAM 空间可用。 根据您的应用程序的内存配置文件或您使用服务器的目的,在某些情况下这可能会更好。

我们可以通过键入以下内容查看当前的交换值:

cat /proc/sys/vm/swappiness
Output60

对于台式机,swappiness 设置为 60 并不是一个坏值。 对于服务器,您可能希望将其移近 0。

我们可以使用 sysctl 命令将 swappiness 设置为不同的值。

例如,要将 swappiness 设置为 10,我们可以输入:

sudo sysctl vm.swappiness=10
Outputvm.swappiness = 10

此设置将持续到下一次重新启动。 我们可以通过在我们的 /etc/sysctl.conf 文件中添加以下行来在重新启动时自动设置此值:

sudo nano /etc/sysctl.conf

在底部,您可以添加:

/etc/sysctl.conf

vm.swappiness=10

完成后保存并关闭文件。

调整缓存压力设置

您可能要修改的另一个相关值是 vfs_cache_pressure。 此设置配置系统将选择缓存多少 inode 和 dentry 信息而不是其他数据。

基本上,这是关于文件系统的访问数据。 这通常查找成本非常高,并且请求非常频繁,因此对您的系统进行缓存是一件好事。 您可以通过再次查询 proc 文件系统来查看当前值:

cat /proc/sys/vm/vfs_cache_pressure
Output100

按照目前的配置,我们的系统从缓存中删除 inode 信息的速度太快了。 我们可以通过键入以下命令将其设置为更保守的设置,例如 50:

sudo sysctl vm.vfs_cache_pressure=50
Outputvm.vfs_cache_pressure = 50

同样,这仅对我们当前的会话有效。 我们可以通过将其添加到我们的配置文件中来更改它,就像我们对 swappiness 设置所做的那样:

sudo nano /etc/sysctl.conf

在底部,添加指定新值的行:

/etc/sysctl.conf

vm.vfs_cache_pressure=50

完成后保存并关闭文件。

结论

遵循本指南中的步骤将为您提供一些喘息空间,否则会导致内存不足异常。 交换空间对于避免其中一些常见问题非常有用。

如果您遇到 OOM(内存不足)错误,或者您发现您的系统无法使用您需要的应用程序,最好的解决方案是优化您的应用程序配置或升级您的服务器。