为Ubuntu启用Swap分区

简介

保护应用程序远离out-of-memeory错误的一种最简单方式,就是为服务器增加交换区。本文将介绍如何为Ubuntu Server添加交换区。

警告:在SSD磁盘上启用swap分区,可能导致系统不稳定。

什么是Swap分区

Swap分区是磁盘上的一块区域,当RAM空间不够使用时,系统会根据调度算法,将一部分内存数据存储到Swap分区中,从而保证应用正常执行。

Step1-检查系统的Swap信息

检测是否有swap分区:

1
root@oaoa:~# swapon --show

如果系统没有交换区,则不会有任何输出。

可以使用free命令检测是否有正在使用的swap空间:

1
2
3
4
root@oaoa:~# free -h
total used free shared buff/cache available
Mem: 989M 135M 109M 11M 744M 661M
Swap: 0B 0B 0B

Step2-检查磁盘可用空间

在创建swap分区之前,先检查磁盘空间是否足够:

1
2
3
4
5
6
7
8
9
root@oaoa:~# df -h
Filesystem Size Used Avail Use% Mounted on
udev 473M 0 473M 0% /dev
tmpfs 99M 11M 89M 11% /run
/dev/vda1 25G 2.7G 21G 12% /
tmpfs 495M 0 495M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 495M 0 495M 0% /sys/fs/cgroup
tmpfs 99M 0 99M 0% /run/user/0

Step3-创建Swap文件

接下来,使用fallocate命令,创建一个名为swap的交换分区,由于我需要搭建gitlab, 所以交换分区大小设置为3G:

1
root@oaoa:~# fallocate -l 3G /swap

检测交换分区文件是否创建成功:

1
2
root@oaoa:~# ls -lh /swap
-rw-r--r-- 1 root root 3.0G Jul 7 10:29 /swap

Step4-启用Swap文件

经过上面的步骤,已经在磁盘上预留了指定大小的磁盘空间,现在需要激活交换分区。

首先,需要禁用其他用户的读取权限,否则,会产生重大安全隐患。

使文件只有root用户可访问:

1
sudo chmod 600 /swap
1
2
root@oaoa:~# ls -lh /swap
-rw------- 1 root root 3.0G Jul 7 10:29 /swap

激活swap分区:

1
2
sudo mkswap /swap
sudo swapon /swap

检测交换分区是否可用:

1
2
3
root@oaoa:~# swapon --show
NAME TYPE SIZE USED PRIO
/swap file 3G 0B -1

Step5-使Swap文件持久化

上面的改动已经使swap分区生效,但是重启之后就没有了,所以需要在/etc/fstab文件中主动挂在swap分区。

备份fstab文件:

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

添加swap文件信息到/etc/fstab文件末尾:

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

截至到这里,已经完成了swap分区的创建和使用,下面是一些优化设置,可根据实际情况进行取舍。

Step6-调整交换分区设置

  • 调整Swappiness属性

    swappiness 参数用于配置系统将RAM数据交换到磁盘的优先级,值为0到100。

    • 值接近于0时,除非绝对必要,否则内核不会将数据交换到磁盘。
    • 值接近于100时,内核会尽可能将数据放入交换区,从而保证更多的RAM空间

    一般默认大小为60,可以通过下面命令查看

    1
    cat /proc/sys/vm/swappiness

    对于桌面系统,设置为60问题不大,但是对于服务器,最好设置为接近于0,因为与磁盘交互的速度远远慢于与RAM交互的速度。

    可以通过sysctl命令修改参数值:

    1
    sudo sysctl vm.swappiness=10

    添加到/etc/sysctl.conf文件,使重启之后仍然生效:

    1
    sudo vim /etc/sysctl.conf

    在文件末尾添加一行:

    /etc/sysctl.conf
    1
    vm.swappiness=10

  • 调整Cache Pressure设置

    另一个相关的参数是vfs_cache_pressure,表示系统将选择多少缓存inodedentry。基本上,这是关于文件系统的访问数据,一般是非常耗时又请求频繁的,所以缓存会增加性能。

    查看系统默认值:

    1
    cat /proc/sys/vm/vfs_cache_pressure

    一般默认值为100,系统会很快从缓存中删除inode信息,需要设置一个更加保守的数字,比如50:

    1
    sudo sysctl vm.vfs_cache_pressure=50

    添加到/etc/sysctl.conf文件,使重启之后仍然生效:

    1
    sudo vim /etc/sysctl.conf

    在文件末尾添加一行:

    /etc/sysctl.conf
    1
    vm.vfs_cache_pressure=50

参考文档:https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-ubuntu-18-04

发布时间: 2018年07月07日 - 10时43分
更新时间: 2018年10月17日 - 21时42分
原始链接: https://oaoa.me/posts/79805f44/