--- title: 为Ubuntu启用Swap分区 date: 2018-07-07 10:43:23 tags: [linux] categories: vps --- ## 简介 保护应用程序远离`out-of-memeory`错误的一种最简单方式,就是为服务器增加交换区。本文将介绍如何为Ubuntu Server添加交换区。 > 警告:在SSD磁盘上启用swap分区,可能导致系统不稳定。 ## 什么是Swap分区 Swap分区是磁盘上的一块区域,当RAM空间不够使用时,系统会根据调度算法,将一部分内存数据存储到Swap分区中,从而保证应用正常执行。 ## Step1-检查系统的Swap信息 检测是否有swap分区: ```shell root@oaoa:~# swapon --show ``` 如果系统没有交换区,则不会有任何输出。 可以使用`free`命令检测是否有正在使用的swap空间: ```shell root@oaoa:~# free -h total used free shared buff/cache available Mem: 989M 135M 109M 11M 744M 661M Swap: 0B 0B 0B ``` ## Step2-检查磁盘可用空间 在创建swap分区之前,先检查磁盘空间是否足够: ```shell 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: ```shell root@oaoa:~# fallocate -l 3G /swap ``` 检测交换分区文件是否创建成功: ```shell root@oaoa:~# ls -lh /swap -rw-r--r-- 1 root root 3.0G Jul 7 10:29 /swap ``` ## Step4-启用Swap文件 经过上面的步骤,已经在磁盘上预留了指定大小的磁盘空间,现在需要激活交换分区。 首先,需要禁用其他用户的读取权限,否则,会产生重大安全隐患。 使文件只有root用户可访问: ```shell sudo chmod 600 /swap ``` ```shell root@oaoa:~# ls -lh /swap -rw------- 1 root root 3.0G Jul 7 10:29 /swap ``` 激活swap分区: ```shell sudo mkswap /swap sudo swapon /swap ``` 检测交换分区是否可用: ```shell root@oaoa:~# swapon --show NAME TYPE SIZE USED PRIO /swap file 3G 0B -1 ``` ## Step5-使Swap文件持久化 上面的改动已经使swap分区生效,但是重启之后就没有了,所以需要在`/etc/fstab`文件中主动挂在swap分区。 备份fstab文件: ```shell sudo cp /etc/fstab /etc/fstab.bak ``` 添加swap文件信息到`/etc/fstab`文件末尾: ```shell echo '/swap none swap sw 0 0' | sudo tee -a /etc/fstab ``` 截至到这里,已经完成了swap分区的创建和使用,下面是一些优化设置,可根据实际情况进行取舍。 ## Step6-调整交换分区设置 - **调整Swappiness属性** `swappiness` 参数用于配置系统将RAM数据交换到磁盘的优先级,值为0到100。 - 值接近于0时,除非绝对必要,否则内核不会将数据交换到磁盘。 - 值接近于100时,内核会尽可能将数据放入交换区,从而保证更多的RAM空间 一般默认大小为60,可以通过下面命令查看 ```shell cat /proc/sys/vm/swappiness ``` 对于桌面系统,设置为60问题不大,但是对于服务器,最好设置为接近于0,因为与磁盘交互的速度远远慢于与RAM交互的速度。 可以通过`sysctl`命令修改参数值: ```shell sudo sysctl vm.swappiness=10 ``` 添加到`/etc/sysctl.conf`文件,使重启之后仍然生效: ```shell sudo vim /etc/sysctl.conf ``` 在文件末尾添加一行: ```shell /etc/sysctl.conf vm.swappiness=10 ``` ​ - **调整Cache Pressure设置** 另一个相关的参数是`vfs_cache_pressure`,表示系统将选择多少缓存*inode*和*dentry*。基本上,这是关于文件系统的访问数据,一般是非常耗时又请求频繁的,所以缓存会增加性能。 查看系统默认值: ```shell cat /proc/sys/vm/vfs_cache_pressure ``` 一般默认值为100,系统会很快从缓存中删除inode信息,需要设置一个更加保守的数字,比如50: ```shell sudo sysctl vm.vfs_cache_pressure=50 ``` 添加到`/etc/sysctl.conf`文件,使重启之后仍然生效: ```shell sudo vim /etc/sysctl.conf ``` 在文件末尾添加一行: ```shell /etc/sysctl.conf vm.vfs_cache_pressure=50 ``` ​ *参考文档:*