Skip to content
Go back

【归档文章】KVM 虚拟化的服务器建立 SWaP 分区以增加虚拟内存

| 0 Views Edit page

关于使用 SWaP 增加虚拟内存的教程。

注:这篇文章是从旧的博客系统中迁移过来的、我觉得还存在价值的文章。但是由于时间关系,可能已经不再是最佳实践,请仅作参考。

1. 关于 SWaP 虚拟内存分区

1.1 什么是 SWaP

它可以是一个分区,也可以是一个文件,是操作系统中一个存放从内存中置换(swap 动作)出的数据的地方,也就是所谓的虚拟内存。

1.2 为什么需要 SWaP

  1. 解决服务器上系统资源占用峰值程序崩溃的问题:当物理内存不够用时候,会根据特定的算法,把一部分内存交换到 SWaP 分区。
  2. 保证服务器在即将到来的大内存请求时有足够的剩余资源:kswapd 进程会周期性地对内存进行检查,如果发现占用高于水位线,则触发 swap(动作),以保证系统剩余的内存不会很少。

1.3 什么场景下需要 SWaP

  1. 系统资源占用峰值时会占满 100% 的内存且持续时间并不长。
  2. 对服务器上的软件、服务运行稳定性有要求。
  3. 磁盘足够的任何情况下,有什么理由不添加虚拟内存呢?

1.4 对于 SWaP 分区该设置多大的建议

Red Hat 官方文档:Chapter 15. Swap Space

服务器内存大小建议的 SWaP 分区大小
≤ 2 GB2 倍内存大小
> 2 GB 且 ≤ 8 GB1 倍内存大小
> 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

可以从两个方面得到验证:

  1. 执行脚本后磁盘可用空间并没有减少,这和 SWaP 的工作原理不符。
  2. 压测时系统 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 分区长时间被占用,绝大多是情况下我会去主动降低这台服务器的负载或是去升级配置,系统的稳定远比坚守原配置带来的节约值钱得多。


Edit page