如何在Debian8上添加交换空间
介绍
防止应用程序内存不足错误的最简单方法之一是向服务器添加一些交换空间。 在本指南中,我们将介绍如何将交换文件添加到 Debian 8 服务器。
警告: 虽然通常建议使用传统旋转硬盘驱动器的系统进行交换,但使用 SSD 交换可能会随着时间的推移导致硬件退化问题。 出于这一考虑,我们不建议在 DigitalOcean 或任何其他使用 SSD 存储的提供商上启用交换。 这样做会影响您和您的邻居的底层硬件的可靠性。 本指南仅供可能在其他地方拥有旋转磁盘系统的用户参考。
如果您需要在 DigitalOcean 上提高服务器的性能,我们建议升级您的 Droplet。 这通常会带来更好的结果,并会降低导致可能影响服务的硬件问题的可能性。
什么是互换?
Swap 是硬盘驱动器上的一个区域,已被指定为操作系统可以临时存储无法再保存在 RAM 中的数据的位置。 基本上,这使您能够增加服务器可以保留在其工作“内存”中的信息量,但有一些警告。 硬盘驱动器上的交换空间将主要用于当 RAM 中不再有足够的空间来保存正在使用的应用程序数据时。
写入磁盘的信息将比保存在 RAM 中的信息慢得多,但操作系统更愿意将运行的应用程序数据保留在内存中,并使用交换来处理较旧的数据。 总体而言,将交换空间作为系统 RAM 耗尽时的后备可能是一个很好的安全网,可以防止在具有非 SSD 存储的系统上出现内存不足异常。
第 1 步 – 检查系统的交换信息
在开始之前,我们可以检查系统是否已经有一些可用的交换空间。 可以有多个交换文件或交换分区,但通常一个就足够了。
我们可以通过键入以下内容来查看系统是否有任何已配置的交换:
sudo swapon --show
如果您没有返回任何输出,这意味着您的系统当前没有可用的交换空间。
您可以使用 free
实用程序验证是否没有活动交换:
free -h
Output total used free shared buffers cached Mem: 1.0G 331M 668M 4.3M 11M 276M -/+ buffers/cache: 44M 955M Swap: 0B 0B 0B
正如您在输出的 Swap 行中看到的,系统上没有激活交换。
第 2 步 – 检查硬盘分区上的可用空间
在我们创建我们的交换文件之前,我们将检查我们当前的磁盘使用情况以确保我们有足够的空间。 通过输入:
df -h
OutputFilesystem Size Used Avail Use% Mounted on /dev/vda1 25G 946M 23G 4% / udev 10M 0 10M 0% /dev tmpfs 201M 4.3M 196M 3% /run tmpfs 501M 0 501M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 501M 0 501M 0% /sys/fs/cgroup tmpfs 101M 0 101M 0% /run/user/1001
在这种情况下,Mounted on
列中带有 /
的设备就是我们的磁盘。 在这个例子中我们有足够的可用空间(仅使用了 946M)。 您的用法可能会有所不同。
尽管对于交换空间的适当大小有很多意见,但这实际上取决于您的个人喜好和您的应用程序要求。 通常,等于或两倍于系统上的 RAM 量是一个很好的起点。 另一个好的经验法则是,如果您只是将其用作 RAM 后备,那么任何超过 4G 的交换都可能是不必要的。
第 3 步 – 创建交换文件
现在我们知道了可用的硬盘空间,我们可以在文件系统中创建一个交换文件。
我们将在根 (/) 目录中创建一个名为 swapfile
的文件。 该文件必须为我们的交换文件分配我们想要的空间量。 有两种主要方法可以做到这一点:
传统的、缓慢的方式
传统上,我们会使用 dd
命令创建具有预分配空间的文件。 这个多功能的磁盘实用程序从一个位置写入另一个位置。
我们可以使用它从位于 /dev/zero
的 Linux 系统中的一个特殊设备向文件写入零,该设备会根据要求吐出尽可能多的零。
我们通过将 bs
用于块大小和 count
用于块数的组合来指定文件大小。 我们分配给每个参数的内容几乎完全是任意的。 重要的是它们相乘的结果是什么。
例如,在我们的示例中,我们希望创建一个 1 GB 的文件。 我们可以通过指定 1 兆字节的块大小和 1024 的计数来做到这一点:
sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
Output1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB) copied, 1.36622 s, 786 MB/s
在按 ENTER 之前检查您的命令,因为如果您将 of
(代表输出文件)指向错误的位置,这可能会破坏数据。
我们可以通过键入以下内容看到已分配了 1 GB:
ls -lh /swapfile
Output-rw-r--r-- 1 root root 1.0G May 30 15:07 /swapfile
如果您已完成上述命令,您可能会注意到它需要几秒钟。 这个小交换文件只有 1.3 秒,但对于速度较慢的硬盘驱动器上的较大文件,这可能会显着增加。
如果您想学习如何更快地创建文件,请使用 sudo rm /swapfile
删除文件交换文件,然后按照以下说明进行操作:
更快的方式
获取相同文件的更快方法是使用 fallocate
程序。 请注意,此命令仅适用于更现代的文件系统,因此,例如,如果您使用的是 ext3
系统,则此选项对您不可用。
fallocate
命令会立即创建一个预先分配大小的文件,而无需实际写入虚拟内容。
我们可以通过键入以下内容创建一个 1 GB 的文件:
sudo fallocate -l 1G /swapfile
提示将几乎立即返回给您。 我们可以通过键入以下内容来验证是否保留了正确的空间量:
ls -lh /swapfile
Output-rw-r--r-- 1 root root 1.0G May 30 15:07 /swapfile
如您所见,我们的文件是在留出正确空间量的情况下创建的。
第 4 步 – 启用交换文件
现在我们有了一个正确大小的可用文件,我们需要将其实际转换为交换空间。
首先,我们需要锁定文件的权限,以便只有具有 root 权限的用户才能读取内容。 这会阻止普通用户访问该文件,这将产生重大的安全隐患。
通过键入以下内容使该文件只能由 root 访问:
sudo chmod 600 /swapfile
通过键入以下内容验证权限更改:
ls -lh /swapfile
Output-rw------- 1 root root 1.0G May 29 17:34 /swapfile
如您所见,只有 root 用户启用了读写标志。
我们现在可以通过键入以下内容将文件标记为交换空间:
sudo mkswap /swapfile
OutputSetting up swapspace version 1, size = 1048572 KiB no label, UUID=757ee0b7-db04-46bd-aafb-adf6954ea077
标记文件后,我们可以启用交换文件,让我们的系统开始使用它:
sudo swapon /swapfile
通过键入以下内容验证交换是否可用:
sudo swapon --show
OutputNAME TYPE SIZE USED PRIO /swapfile file 1024M 0B -1
我们可以再次检查 free
实用程序的输出来证实我们的发现:
free -h
Output total used free shared buffers cached Mem: 1.0G 925M 74M 4.3M 13M 848M -/+ buffers/cache: 63M 936M Swap: 1.0G 0B 1.0G
我们的交换已成功设置,我们的操作系统将根据需要开始使用它。
第 5 步 - 使交换文件永久化
我们最近的更改已启用当前会话的交换文件。 但是,如果我们重新启动,服务器将不会自动保留交换设置。 我们可以通过将交换文件添加到我们的 /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
接下来,我们将查看一些可以更新以调整交换空间的设置。
第 6 步 – 调整您的交换设置
您可以配置一些选项,这些选项会在处理交换时影响系统的性能。
调整 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(内存不足)错误,或者您发现您的系统无法使用您需要的应用程序,最好的解决方案是优化您的应用程序配置或升级您的服务器。