如何在 Ubuntu 14.04 上添加交换程序

简介

要提高服务器的响应速度并防止应用程序出现内存不足错误,最简单的方法之一就是增加一些交换空间。 交换 是硬盘上的一个区域,被指定为操作系统临时存储内存中无法再保存的数据的地方。

从根本上说,这可以增加服务器工作 "内存 "中的信息量,但有一些注意事项。 硬盘上的空间主要用于 RAM 空间已不足以存储数据时。

写入磁盘的信息比保存在内存中的信息要慢,但操作系统更愿意将运行中的应用程序数据保存在内存中,而使用交换空间来保存较旧的数据。 总的来说,当系统内存耗尽时,拥有交换空间作为备用是一个很好的安全网。

在本指南中,我们将介绍如何在 Ubuntu 14.04 服务器上创建并启用交换文件。

<$>[注释] [标签 备注] 虽然交换通常推荐用于使用传统旋转硬盘驱动器的系统,但在固态硬盘上使用交换可能会导致硬件随着时间的推移而退化。 基于这一考虑,我们不建议在 DigitalOcean 或其他使用固态硬盘存储的提供商上启用交换功能。 这样做会影响您和您邻居的底层硬件的可靠性。

如果您需要提高服务器性能,我们建议您升级 Droplet。 这将在总体上带来更好的结果,并降低导致硬件问题的可能性,从而影响您的服务。 <$>

检查系统的交换信息

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

我们可以通过键入 "swap "查看系统是否配置了交换机:

1sudo swapon -s

1Filename				Type		Size	Used	Priority

如果只取回表头,如上图所示,则当前未启用任何交换空间。

另一种更熟悉的检查交换空间的方法是使用 "free "实用程序,它可以显示系统内存的使用情况。 我们可以通过键入以下命令查看当前内存和交换空间的使用情况(单位:Megabytes):

free -m
             total used free shared buffers cached
Mem:          3953 154 3799 0 8 83
-/+ buffers/cache:         62 3890
Swap:            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% /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 实例上,所以你的实际使用情况可能会有很大不同。

虽然关于交换空间的适当大小众说纷纭,但这确实取决于你的个人喜好和应用程序要求。 一般来说,与系统内存容量相等或两倍是一个不错的起点。

由于我的系统有 4GB 内存,而翻倍内存会占用很大一部分磁盘空间,我不愿意放弃,所以我将创建一个与系统内存相匹配的 4GB 交换空间。

创建交换文件

现在我们知道了可用的硬盘空间,就可以在文件系统中创建交换文件了。

我们将在根目录(/)下创建一个名为 "swapfile "的文件。 该文件必须为我们的交换文件分配足够的空间。 主要有两种方法:

传统、缓慢的方式

传统上,我们会使用 dd 命令创建一个预分配空间的文件。 这种多功能磁盘实用程序可以从一个位置写入另一个位置。

在 Linux 系统中,我们可以使用位于 /dev/zero的特殊设备将零写入文件,该设备会根据请求输出尽可能多的零。

我们通过使用表示块大小的 bs 和表示块数量的 count 来指定文件大小。 我们为每个参数指定什么几乎完全是任意的。 重要的是它们相乘的乘积是多少。

例如,在我们的示例中,我们希望创建一个 4GB 的文件。 为此,我们可以指定块大小为 1 千兆字节,计数为 4:

1sudo dd if=/dev/zero of=/swapfile bs=1G count=4

14+0 records in
24+0 records out
34294967296 bytes (4.3 GB) copied, 18.6227 s, 231 MB/s

在按 ENTER 键之前,请检查您的命令,因为如果将 of(代表输出文件)指向错误的位置,有可能会破坏数据。

我们可以看到,通过键入已分配了 4 千兆字节:

ls -lh /swapfile
-rw-r--r-- 1 root root 4.0G Apr 28 17:15 /swapfile

如果你已经完成了上面的命令,你可能会注意到它花了不少时间。 事实上,你可以从输出中看到,我的系统花了 18 秒才创建文件。 这是因为它必须向磁盘写入 4GB 的 0。

如果您想学习如何更快地创建文件,请移除文件并按照下面的步骤操作:

1sudo rm /swapfile

更快的方式

获得相同文件的更快方法是使用 "fallocate "程序。 该命令可立即创建一个预分配大小的文件,而无需实际写入虚拟内容。

我们可以通过键入创建一个 4GB 的文件:

1sudo fallocate -l 4G /swapfile

提示几乎会立即返回给您。 我们可以通过键入以下内容来验证是否预留了正确的空间:

ls -lh /swapfile
-rw-r--r-- 1 root root 4.0G Apr 28 17:19 /swapfile

正如你所看到的,我们创建的文件预留了正确的空间。

启用交换文件

现在,我们的文件已经创建,但系统并不知道它应该用于交换。 我们需要告诉系统将此文件格式化为交换文件,然后启用它。

不过,在此之前,我们需要调整文件的权限,以便除 root 用户外,其他任何人都无法读取该文件。 允许其他用户读取或写入该文件将带来巨大的安全风险。 我们可以通过键入以下命令来锁定权限

1sudo chmod 600 /swapfile

键入"...... "验证文件的权限是否正确:

ls -lh /swapfile
-rw------- 1 root root 4.0G Apr 28 17:19 /swapfile

可以看到,只有 root 用户的列启用了读写标志。

现在,我们的文件更安全了,我们可以输入以下信息,告诉系统设置交换空间:

1sudo mkswap /swapfile

1Setting up swapspace version 1, size = 4194300 KiB
2no label, UUID=e2f1e9cf-c0a9-4ed4-b8ab-714b8a7d6944

我们的文件现在可以用作交换空间了。 我们可以键入

1sudo swapon /swapfile

我们可以通过检查系统现在是否报告交换空间来验证程序是否成功:

sudo swapon -s
Filename				Type		Size	Used	Priority
/swapfile file		4194300	0	    -1

这里有一个新的交换文件。 我们可以再次使用 free 工具来证实我们的发现:

free -m
             total used free shared buffers cached
Mem:          3953 101 3851 0 5 30
-/+ buffers/cache:         66 3887
Swap:         4095          0 4095

我们的交换系统已经设置成功,我们的操作系统将根据需要开始使用它。

将交换文件永久化

我们启用了交换文件,但重启时服务器不会自动启用该文件。 我们可以通过修改 fstab 文件来改变这种情况。

在文本编辑器中以 root 权限编辑文件:

1sudo nano /etc/fstab

在文件底部,您需要添加一行内容,告诉操作系统自动使用您创建的文件:

1/swapfile none swap sw 0 0

完成后保存并关闭文件。

调整你的交换设置

在处理交换时,您可以配置一些对系统性能有影响的选项。

交换度 "参数用于配置系统将数据从 RAM 交换到交换空间的频率。 该值介于 0 和 100 之间,代表一个百分比。

当值接近零时,除非绝对必要,内核不会将数据交换到磁盘上。 请记住,与交换文件的交互是 "昂贵 "的,因为它们比与 RAM 的交互耗时更长,而且会导致性能显著下降。 告诉系统不要过多依赖交换文件,通常会让系统运行得更快。

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

我们可以通过键入"...... "来查看当前的交换度值:

1cat /proc/sys/vm/swappiness

160

对于台式机来说,交换性设置为 60 并不是一个坏值。 对于 VPS 系统,我们可能希望将其接近于 0。

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

例如,要将交换度设置为 10,我们可以键入

1sudo sysctl vm.swappiness=10

1vm.swappiness = 10

该设置将持续到下次重启。 我们可以在/etc/sysctl.conf文件中添加这一行,在重启时自动设置该值:

1sudo nano /etc/sysctl.conf

在底部,您可以添加

1vm.swappiness=10

完成后保存并关闭文件。

你可能想修改的另一个相关值是 vfs_cache_pressure。 该设置用于配置系统在多大程度上选择缓存 inode 和 dentry 信息而不是其他数据。

基本上,这是有关文件系统的访问数据。 一般来说,这些数据的查询成本很高,而且请求频率也很高,因此是系统缓存的最佳内容。 你可以通过再次查询 proc 文件系统来查看当前值:

1cat /proc/sys/vm/vfs_cache_pressure

1100

按照目前的配置,我们的系统从缓存中删除 inode 信息的速度太快。 我们可以将其设置为更保守的值,比如 50,只需键入

1sudo sysctl vm.vfs_cache_pressure=50

1vm.vfs_cache_pressure = 50

同样,这只对当前会话有效。 我们可以将其添加到配置文件中进行更改,就像交换性设置一样:

1sudo nano /etc/sysctl.conf

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

1vm.vfs_cache_pressure = 50

完成后保存并关闭文件。

结论

按照本指南中的步骤操作,将为你的内存使用提供一些喘息空间。 交换空间对于避免一些常见问题非常有用。

如果遇到 OOM(内存不足)错误,或者发现系统无法使用所需的应用程序,最好的解决办法是优化应用程序配置或升级服务器。 不过,配置交换空间可以给你带来更大的灵活性,并能帮助你在性能较弱的服务器上赢得时间。

By Justin Ellingwood
Published At
Categories with 技术
comments powered by Disqus