Linux Ubuntu swap 交换文件优化

我们在 Digital Ocean 创建 VPS (Droplet) 时,最便宜的配置如下:

Digital Ocean VPS 选择系统配置

内存是 1GB,一般情况下是够用了,如果多开几个 shadowsocks 进程,多个用户同时上 youtube.com,那么内存可能会不够用,怎么办

可以设置 swap 交换文件。DO 硬盘都是 SSD,内存不够时可以使用硬盘的swap,速度也不错


注意:

尽管通常建议对使用传统旋转硬盘驱动器的系统进行交换,但使用SSD交换可能会导致硬件随着时间的推移而出现问题。 出于这种考虑,通常不建议在使用SSD存储的提供商上启用交换文件。 这样做会影响您和您的邻居的底层硬件的可靠性

检查系统是否设置过 swap

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

我们可以通过键入以下内容来查看系统是否已配置了交换文件

sudo swapon - show

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

您可以使用 free 验证没有活动交换空间:

free -h

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

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

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

df -h

有足够的可用空间的时候,我们才能创建 swap 文件

创建 swap 交换文件

现在我们知道了可用的硬盘空间,我们可以在文件系统中创建一个交换文件。 我们将在根(/)目录中创建一个我们想要的交换大小的文件

创建交换文件的最佳方法是使用fallocate程序。 此命令立即创建预分配大小的文件

由于我们示例中的服务器具有1024MB的RAM,因此我们将在本教程中创建3 GB的文件。 调整此项以满足您自己的服务器的需求:

sudo fallocate -l 3G /swap

我们可以通过输入以下内容来验证是否保留了正确的空间量:

$ ls -lh /swap
-rw-r - r-- 1 root root 3.0G Dec 19 11:14 /swap

启用 swap 交换文件

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

首先,我们需要锁定文件的权限,以便只有具有root权限的用户才能读取内容。这可以防止普通用户访问该文件,这会产生重大的安全隐患

通过键入以下内容使该文件只能由root访问:

sudo chmod 600 /swap

键入以下命令验证权限更改:

$ ls -lh /swap
-rw ------- 1 root root 3.0G Dec 19 11:14 /swap

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

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

sudo mkswap /swap

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

sudo swapon /swap

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

sudo swapon - show

可以再次检查:

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           985M         96M        113M        1.6M        775M        727M
Swap:          3.0G        268K        3.0G

使 swap 交换文件永久化

我们最近的更改已启用当前会话的交换文件。 但是,如果我们重新启动,服务器将不会自动保留交换设置。 我们可以通过将交换文件添加到 /etc/fstab 文件来更改此设置

备份 /etc/fstab 文件,以防出现任何问题:

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

您可以通过键入以下内容将交换文件信息添加到 /etc/fstab 文件的末尾:

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

调整swap交换文件设置

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

调整 Swappiness 属性

swappiness参数配置系统将数据从RAM交换到交换空间的频率。这是介于0和100之间的值,表示百分比

值接近于零时,除非绝对必要,否则内核不会将数据交换到磁盘。请记住,与交换文件的交互是“昂贵的”,因为它们比与RAM的交互花费更长的时间,并且它们可能导致性能的显着降低。告诉系统不要太依赖交换通常会使您的系统更快

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

我们可以通过输入以下内容来查看当前的swappiness值:

$ cat /proc/sys/vm/swappiness
60

对于桌面,swappiness设置为60并不是一个糟糕的值。对于服务器,您可能希望将其移近0

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

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

$ sudo sysctl vm.swappiness = 20
vm.swappiness = 20

要使设置在重启系统后仍然生效,建议把自定义设置保存到 /etc/sysctl.d 目录下

$ sudo vi /etc/sysctl.d/98-swap.conf
vm.swappiness = 20

调整 Cache Pressure 缓存压力设置

您可能想要修改的另一个相关值是 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

同样,我们要把这个设置保存到 /etc/sysctl.d/98-swap.conf 文件中:

$ sudo vi /etc/sysctl.d/98-swap.conf
vm.vfs_cache_pressure = 50

我们把自定义内核参数设置都保存到 /etc/sysctl.d/ 目录下,并且文件名以 98 开头,当我们创建一个新的 VPS 时,可以轻松地用 tar 命令把 /etc/sysctl.d/98* 文件打包并迁移到新的环境中。你可以在下面地址查看内核参数优化文件:

https://github.com/softwaredownload/openwrt-fanqiang/tree/master/ubuntu/etc/sysctl.d

相关资源