Linux How To Add swap on Ubuntu

ailen · 2015年01月30日 · 最后由 luoping0425 回复于 2016年07月01日 · 8589 次阅读

背景

最近公司几款游戏的 staging server 是用的是 DO 的$5的套餐,配置是 512M 的内存,装了很多软件,在用 cap 做部署的时候经常报出了内存不足的错误,选择使用 swap(交换分区) 的方法来一定程度上缓解这个问题。

简介

swap(交换分区) 是当计算机物理内存不足时用来暂时存储数据的地方,占用的是硬盘空间,当内存不足时候会将内存中不活跃的页转移到 swap。swap 在一定程度上可以缓解内存不足 的情况,但是由于存在 IO 交互,效率存在问题。总的来说,当你的内存不足时候为了继续运行,使用 swap 是一个不错的方案。下面来介绍一下如何在 Ubuntu14.04 中来增加 swap(PS:我 在 DO 的 vps 默认是没有 swap 的)

1.查看操作系统的 swap 的信息

我们可以通过输入以下命令查新系统的 swap 信息:

sudo swapon -s 
Filename                Type        Size    Used    Priority    

这时候看到系统中没有交换空间,另外可以通过 free 查看当前系统的内存和交换空间的使用情况:

free -m
             total       used       free     shared    buffers     cached
Mem:          3953        154       3799          0          8         83
-/+ buffers/cache:         62       3890
swap:            0          0          0

2.查看磁盘当前可用空间

在创建 swap 之前首先要查看当前磁盘的可用空间,可以通过 df 命令来查看:

df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        30G  9.9G   19G  36% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            487M  4.0K  487M   1% /dev
tmpfs           100M  324K  100M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            498M     0  498M   0% /run/shm
none            100M     0  100M   0% /run/user

可以看到磁盘还有接近 20G 的空间,可以腾出 1G 来做 swap,默认情况下认为 swap 为 RAM 的 2 倍比较合适,不过这个看个人的需求,我的 RAM 为 1G,因此加上 2G swap 就够了,不过 还是创建了 4G 的空间。

3.创建 swap 文件

要创建 swap,首先在文件系统创建一个文件,我们在 root(/) 下创建一个叫swapfile的文件,这个文件必须有足够的大小来做 swap,有两种方式可以来创建 swap 文件:

3.1 传统的慢的方法:

sudo dd if=/dev/zero of=/swapfile bs=1G count=4

ls -lh /swapfile

-rw-r--r-- 1 root root 4.0G Jan 26 01:43 /swapfile

3.2 快速方法:

sudo fallocate -l 4G /swapfile

ls -lh /swapfile

-rw-r--r-- 1 root root 4.0G Jan 26 01:50 /swapfile

4.格式化 swap 文件

当创建好了 swap 文件之后 OS 并不知道这个文件的用途,因此我们需要告诉操作系统创建好的文件用作 swap。在格式化之前我们必须保证交换空间仅能为 root 只读,因此需要输入:

sudo chmod 600 /swapfile

ls -lh /swapfile

-rw------- 1 root root 4.0G Jan 26 01:43 /swapfile

可以看到/swapfile 文件为 root 只读。接下来通过 mkswap 来格式化 swap 文件:

sudo mkswap /swapfile

Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=e2f1e9cf-c0a9-4ed4-b8ab-714b8a7d6944

文件已经为操作系统识别的 swap,通过 swapon 来加载当前到操作系统:

sudo swapon /swapfile

通过以下命令可以验证是否创建成功:

sudo swapon -s

Filename                Type        Size    Used    Priority
/swapfile                               file        4194300 43220   -1

free -m

             total       used       free     shared    buffers     cached
Mem:           994        862        131          0         24        118
-/+ buffers/cache:        718        275
Swap:         4095         42       4053

5.持久化 swap

通过上面创建的交换空间当机器重启的系统不会自动挂载交换空间,我们需要更改 fstab 文件来自动挂载:

sudo nano /etc/fstab
在文件最后一行输入:
/swapfile   none    swap    sw    0   0

保存文件即可。

6.调节 swap 设置

注意:在设置交换空间的时候有一些参数影响到系统的性能,需要我们手动来调节。
swappiness参数代表着系统使用交换空间的频率,位于 0-100 之间,0 代表着内核尽可能减少向磁盘交换数据,除非 RAM 完全被耗光。100 代表这尽可能使用交换空间,给 RAM 腾空间 我们可以看到:

cat /proc/sys/vm/swappiness
60

对于 PC 机器,60 应该是不错的配置,但是对于 VPS 来说,最好是接近于 0,减少 swap 交互,除非 RAM 真正被耗光。因此通过增加下面几行来调整swappiness到 10。

sudo sysctl vm.swappiness=10
vm.swappiness = 10

这个值在重启之后会自动恢复为默认,因此我们需要设置为开机自动设置:

sudo nano /etc/sysctl.conf
在末尾加上:
vm.swappiness=10

保存文件退出。
另一个比较重要的配置是vfs_cache_pressure,该文件表示内核回收用于 directory 和 inode cache 内存的倾向;缺省值 100 表示内核将根据 pagecache 和 swapcache, 把 directory 和 inode cache 保持在一个合理的百分比;降低该值低于 100,将导致内核倾向于保留 directory 和 inode cache;增加该值超过 100,将导致内核倾向于 回收 directory 和 inode cache。

cat /proc/sys/vm/vfs_cache_pressure
100

默认为 100 的值时候系统移除 inode 的频率过高,我们可以通过设置为 50 来调整频率:

sudo sysctl vm.vfs_cache_pressure=50
vm.vfs_cache_pressure = 50

同上,重启过后会自动恢复为默认值,因此需要设置为开机自动设置:

sudo nano /etc/sysctl.conf
vm.vfs_cache_pressure = 50

保存文件即可

7.总结

swap 在我们遇到内存不足的时候是一个不错的选择,尤其像 DO 的$5套餐的机器,配置好 swap 可以灵活的帮助我们对机器的使用。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号