本文最后更新于 243 天前,其中的信息可能已经有所发展或是发生改变。
1. 关于 SWaP 虚拟内存分区
1.1 什么是 SWaP
它可以是一个分区,也可以是一个文件,是操作系统中一个存放从内存中置换(swap 动作)出的数据的地方,也就是所谓的虚拟内存。
1.2 为什么需要 SWaP
- 解决服务器上系统资源占用峰值程序崩溃的问题:当物理内存不够用时候,会根据特定的算法,把一部分内存交换到 SWaP 分区。
- 保证服务器在即将到来的大内存请求时有足够的剩余资源:kswapd 进程会周期性地对内存进行检查,如果发现占用高于水位线,则触发 swap(动作),以保证系统剩余的内存不会很少。
1.3 什么场景下需要 SWaP
- 系统资源占用峰值时会占满 100% 的内存且持续时间并不长。
- 对服务器上的软件、服务运行稳定性有要求。
- 磁盘足够的任何情况下,有什么理由不添加虚拟内存呢?
1.4 对于 SWaP 分区该设置多大的建议
Red Hat 官方文档:Chapter 15. Swap Space
服务器内存大小 | 建议的 SWaP 分区大小 |
---|---|
≤ 2 GB | 2 倍内存大小 |
> 2 GB 且 ≤ 8 GB | 1 倍内存大小 |
> 8 GB 且 ≤ 64 GB | 至少 4 GB |
> 64 GB | 至少 4 GB |
1.5 通过 OpenVZ 虚拟化出来的服务器不可以添加虚拟内存
在其他网站上流传的所谓 OpenVZ 虚拟 VPS 下增加 SWaP 分区的脚本,不过也只是欺骗 free 工具使其显示错误的数据罢了:
# !/bin/bash
# 网传的自我安慰脚本
SWAP="${1:-512}"
NEW="$[SWAP*1024]"; TEMP="${NEW//?/ }"; OLD="${TEMP:1}0"
umount /proc/meminfo 2> /dev/null
sed "/^Swap\(Total\|Free\):/s,$OLD,$NEW," /proc/meminfo > /etc/fake_meminfo
可以从两个方面得到验证:
- 执行脚本后磁盘可用空间并没有减少,这和 SWaP 的工作原理不符。
- 压测时系统 SWaP 空间占用始终为零。
2. 创建并配置 SWaP 分区
确定当前无 SWaP 分区,如果有的话清理一下:
# 一般情况下 SWaP 分区操作都在服务器根目录下执行
cd /
free -m
# 查看 SWaP 分区文件目录
swapon --show
# swapfile 为之前的分区文件名
swapoff /swapfile
然后创建新的 SWaP 分区:
# 创建分区文件,新的分区文件名为 swapfile,count 的单位为 kb
sudo dd if=/dev/zero of=/swapfile bs=1k count=2048000
# 建立 SWaP
mkswap /swapfile
# 启动 SWaP
swapon /swapfile
# 查看虚拟内存是否创建成功
free -m

设置 SWaP 分区开机自动挂载,只需要修改 /etc/fstab 文件,在最后添加一行内容即可:
sudo chmod 777 /etc/fstab
sed -i '$a /swapfile swap swap defaults 0 0' /etc/fstab
你可以对磁盘测下速,测出来的 IO 也就是你虚拟内存的带宽:
time dd if=/dev/zero of=/test.disk bs=8k count=30000
而实际的内存带宽测速结果:
# 下载和编辑 mbw 测试软件 git clone http://github.com/raas/mbw cd mbw yum -y install gcc make # 测试 ./mbw -q -n 10 256
即使是这种超售严重、内存带宽打折扣的廉价 VPS 两者速度都差了 10 倍。
3. 后记
在我这里添加 SWaP 分区只是作为不让程序因为内存不足而崩溃的一种兜底手段,如果监控上显示 SWaP 分区长时间被占用,绝大多是情况下我会去主动降低这台服务器的负载或是去升级配置,系统的稳定远比坚守原配置带来的节约值钱得多。