如何在 Debian 8 上添加交换空间

简介

防止应用程序出现内存不足错误的最简单方法之一就是为服务器添加一些交换空间。在本指南中,我们将介绍如何为 Debian 8 服务器添加交换文件。

<$>[警告] 警告: 尽管交换通常推荐用于使用传统旋转硬盘驱动器的系统,但在固态硬盘中使用交换可能会随着时间的推移导致硬件降级问题。基于这一考虑,我们不建议在DigitalOcean或其他使用固态硬盘存储的提供商上启用交换功能。对你和你的邻居来说,这样做可能会影响底层硬件的可靠性。本指南仅供在其他地方使用旋转磁盘系统的用户参考。

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

什么是交换?

_Swap_是硬盘上的一个区域,被指定为操作系统临时存储 RAM 中无法再保存的数据的地方。基本上,交换空间可以增加服务器工作 "内存 "中的信息量,但也有一些注意事项。硬盘上的交换空间主要用于 RAM 空间不足以保存使用中的应用程序数据时。

写入磁盘的信息比保存在内存中的信息要慢得多,但操作系统更愿意将运行中的应用程序数据保存在内存中,而使用交换空间来保存较旧的数据。总的来说,在系统内存耗尽的情况下,将交换空间作为后备空间,可以很好地防止系统出现内存不足的异常情况。

步骤 1 - 检查系统的交换信息

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

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

1sudo swapon --show

如果没有任何输出结果,说明系统目前没有可用的交换空间。

您可以使用 free 工具验证是否存在活动交换:

1free -h
1[secondary_label Output]
2             total used free shared buffers cached
3Mem:          1.0G 331M 668M 4.3M 11M 276M
4-/+ buffers/cache:        44M 955M
5Swap:           0B 0B 0B

从输出结果的 Swap 行可以看到,系统上没有激活交换。

第 2 步 - 检查硬盘分区的可用空间

在创建交换文件之前,我们先检查一下当前的磁盘使用情况,确保有足够的空间。请输入

1df -h
1[secondary_label Output]
2Filesystem Size Used Avail Use% Mounted on
3/dev/vda1 25G 946M 23G 4% /
4udev 10M 0 10M 0% /dev
5tmpfs 201M 4.3M 196M 3% /run
6tmpfs 501M 0 501M 0% /dev/shm
7tmpfs 5.0M 0 5.0M 0% /run/lock
8tmpfs 501M 0 501M 0% /sys/fs/cgroup
9tmpfs 101M 0 101M 0% /run/user/1001

在本例中,"Mounted on "栏中带有"/"的设备就是我们的磁盘。在本例中,我们有足够的可用空间(仅使用了 946M)。您的使用情况可能会有所不同。

虽然关于交换空间的适当大小众说纷纭,但这确实取决于你的个人喜好和应用程序要求。一般来说,与系统内存容量相等或两倍是一个不错的起点。另一个好的经验法则是,如果你只是将交换空间用作内存的备用空间,那么超过 4G 的交换空间可能就没有必要了。

第 3 步 - 创建交换文件

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

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

传统、缓慢的方式

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

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

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

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

1sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
1[secondary_label Output]
21024+0 records in
31024+0 records out
41073741824 bytes (1.1 GB) copied, 1.36622 s, 786 MB/s

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

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

1ls -lh /swapfile
1[secondary_label Output]
2-rw-r--r-- 1 root root 1.0G May 30 15:07 /swapfile

如果你已经完成了上述命令,你可能会注意到它花了几秒钟的时间。对于这个小的 swapfile 来说只用了 1.3 秒,但对于速度较慢的硬盘上的较大文件来说,这个时间可能会大大增加。

如果你想学习如何更快地创建文件,请使用 sudo rm /swapfile删除文件swapfile,然后继续下面的操作:

更快的方式

获取相同文件的更快方法是使用 fallocate 程序。请注意,该命令只适用于较新的文件系统,因此如果你使用的是 ext3 系统,则无法使用该选项。

fallocate "命令会立即创建一个预分配大小的文件,而无需实际写入虚拟内容。

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

1sudo fallocate -l 1G /swapfile

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

1ls -lh /swapfile
1[secondary_label Output]
2-rw-r--r-- 1 root root 1.0G May 30 15:07 /swapfile

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

第 4 步 - 启用交换文件

现在,我们有了一个大小正确的文件,我们需要将其转化为交换空间。

首先,我们需要锁定文件的权限,只有拥有root 权限的用户才能读取文件内容。这样,普通用户就无法访问该文件,因为这将产生重大的安全影响。

键入 "root**",使文件只能被** root** 访问:

1sudo chmod 600 /swapfile

输入验证权限更改:

1ls -lh /swapfile
1[secondary_label Output]
2-rw------- 1 root root 1.0G May 29 17:34 /swapfile

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

现在,我们可以输入

1sudo mkswap /swapfile
1[secondary_label Output]
2Setting up swapspace version 1, size = 1048572 KiB
3no label, UUID=757ee0b7-db04-46bd-aafb-adf6954ea077

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

1sudo swapon /swapfile

通过输入验证交换是否可用:

1sudo swapon --show
1[secondary_label Output]
2NAME TYPE SIZE USED PRIO
3/swapfile file 1024M 0B   -1

我们可以再次检查 free 工具的输出,以证实我们的发现:

1free -h
1[secondary_label Output]
2             total used free shared buffers cached
3Mem:          1.0G 925M 74M 4.3M 13M 848M
4-/+ buffers/cache:        63M 936M
5Swap:         1.0G 0B 1.0G

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

第 5 步 - 永久保存交换文件

我们最近的更改启用了当前会话的交换文件。不过,如果我们重新启动,服务器将不会自动保留交换设置。我们可以通过在 /etc/fstab 文件中添加 swap 文件来改变这种情况。

备份 /etc/fstab 文件,以防出错:

1sudo cp /etc/fstab /etc/fstab.bak

/etc/fstab 文件末尾添加交换文件信息,键入

1echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

接下来,我们将查看一些可以更新的设置,以调整交换空间。

第 6 步 - 调整交换设置

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

调整交换属性

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

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

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

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

1cat /proc/sys/vm/swappiness
1[secondary_label Output]
260

对于台式机来说,交换性设置为 60 也不错。对于服务器,你可能希望将其接近于 0。

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

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

1sudo sysctl vm.swappiness=10
1[secondary_label Output]
2vm.swappiness = 10

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

1sudo nano /etc/sysctl.conf

在底部,您可以添加

1[label /etc/sysctl.conf]
2vm.swappiness=10

完成后保存并关闭文件。

调整缓存压力设置

你可能想修改的另一个相关值是 vfs_cache_pressure。该设置用于配置系统选择缓存 inodedentry 信息而非其他数据的程度。

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

1cat /proc/sys/vm/vfs_cache_pressure
1[secondary_label Output]
2100

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

1sudo sysctl vm.vfs_cache_pressure=50
1[secondary_label Output]
2vm.vfs_cache_pressure = 50

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

1sudo nano /etc/sysctl.conf

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

1[label /etc/sysctl.conf]
2vm.vfs_cache_pressure=50

完成后保存并关闭文件。

结论

按照本指南中的步骤操作,可以在出现内存不足异常时给你一些喘息的机会。交换空间在避免某些常见问题方面非常有用。

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

Published At
Categories with 技术
comments powered by Disqus