在Ubuntu下挂载swap分区

BobAnkh published on
4 min, 742 words

Categories: Linux

在Ubuntu下挂载swap分区(交换分区)与相关设置

在服务器内存不够的情况下,我们通常需要添加一些swap分区用于作为内存的备用,当然它比真实的内存要慢很多,所以需要谨慎考虑是否启用和选择其大小

检查系统的交换分区情况、内存情况、硬盘空间情况

使用sudo swapon --show命令来检查系统是否有交换分区,如果没有任何结果或者没有任何显示,说明系统当前没有可用的交换空间

若有交换分区,输出类似以下结果:

NAME      TYPE SIZE USED PRIO
/swapfile file   8G   0B   -2

也可以使用free -h来一并检查内存情况和交换分区情况:

              total        used        free      shared  buff/cache   available
Mem:           62Gi       477Mi        57Gi       2.0Mi       4.6Gi        61Gi
Swap:         8.0Gi          0B       8.0Gi

可以使用df -h命令来检查硬盘使用情况:

Filesystem      Size  Used Avail Use% Mounted on
udev             32G     0   32G   0% /dev
tmpfs           6.3G  2.3M  6.3G   1% /run
/dev/sda2       439G   52G  366G  13% /
tmpfs            32G     0   32G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs            32G     0   32G   0% /sys/fs/cgroup
tmpfs           6.3G     0  6.3G   0% /run/user/1001

创建swap

我们创建一个8G大小的交换文件:

sudo fallocate -l 8G /swapfile

接下来,我们将其变换成交换内存,不过为了保证安全,需要调整其权限,以便只有拥有root权限的用户才能读取文件内容:

sudo chmod 600 /swapfile

接下来通过以下命令将其标记为交换空间:

sudo mkswap /swapfile

然后启用该交换空间

sudo swapon /swapfile

最后,我们还需要永久保留swap设置,否则一重启就没了。我们可以通过将swap文件添加到/etc/fstab文件中来改变这一点:

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

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

接下来将swap文件信息添加到/etc/fstab文件的末尾:

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

我将以上过程汇总成了一个bash脚本mount-swap.sh,可以使用如下方式下载运行,第一个参数为想要的swap分区大小:

chmod +x mount_swap.sh
./mount_swap.sh 8G

swappiness属性

挂载swap分区后,我们也可以额外调整swappiness属性的值,以根据自己情况实现更好的性能

该属性配置系统将数据从RAM交换到swap的频率, 值介于0和100之间,表示百分比。

要记住一点,与swap交互花费的时间比与RAM的交互更长,并且会导致性能的显著下降,也即系统更少依赖swap分区通常会使你的系统更快,但是它又可补充物理内存的缺乏。所以根据自身实际情况合理设置该属性有助于取得更好的整体性能。

如果swappiness值接近0,除非绝对必要,内核将不会将数据交换到硬盘(即swap);swappiness值接近100时,内核将尝试将更多的数据放入交换中,以保持更多的RAM空间。

运用cat /proc/sys/vm/swappiness命令查看当前的swappiness值,默认值为60

我们可以使用sysctl命令将swappiness设置为不同的值,如要将swappiness设置为20:

sudo sysctl vm.swappiness=20

该设置将保持到系统下次重新启动,如果想要在重启之后也生效,我们可以通过在/etc/sysctl.conf文件中添加一行实现:

echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf