最近公司几款游戏的 staging server 是用的是 DO 的$5的套餐,配置是 512M 的内存,装了很多软件,在用 cap 做部署的时候经常报出了内存不足的错误,选择使用 swap(交换分区) 的方法来一定程度上缓解这个问题。
swap(交换分区) 是当计算机物理内存不足时用来暂时存储数据的地方,占用的是硬盘空间,当内存不足时候会将内存中不活跃的页转移到 swap。swap 在一定程度上可以缓解内存不足 的情况,但是由于存在 IO 交互,效率存在问题。总的来说,当你的内存不足时候为了继续运行,使用 swap 是一个不错的方案。下面来介绍一下如何在 Ubuntu14.04 中来增加 swap(PS:我 在 DO 的 vps 默认是没有 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
在创建 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 的空间。
要创建 swap,首先在文件系统创建一个文件,我们在 root(/) 下创建一个叫swapfile
的文件,这个文件必须有足够的大小来做 swap,有两种方式可以来创建 swap 文件:
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
sudo fallocate -l 4G /swapfile
ls -lh /swapfile
-rw-r--r-- 1 root root 4.0G Jan 26 01:50 /swapfile
当创建好了 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
通过上面创建的交换空间当机器重启的系统不会自动挂载交换空间,我们需要更改 fstab 文件来自动挂载:
sudo nano /etc/fstab
在文件最后一行输入:
/swapfile none swap sw 0 0
保存文件即可。
注意:在设置交换空间的时候有一些参数影响到系统的性能,需要我们手动来调节。
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
保存文件即可
swap 在我们遇到内存不足的时候是一个不错的选择,尤其像 DO 的$5套餐的机器,配置好 swap 可以灵活的帮助我们对机器的使用。