怎么调整 EC2 实例 Swap 交换分区大小优化内存使用

文章导读
调整 EC2 实例 Swap 大小主要通过创建 Swap 文件或调整分区实现,适用于缓解突发内存压力,但无法提升物理内存读写速度。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

调整 EC2 实例 Swap 大小主要通过创建 Swap 文件或调整分区实现,适用于缓解突发内存压力,但无法提升物理内存读写速度。

先说结论:Swap 是磁盘模拟内存的应急方案,能防止 OOM 崩溃但不能替代物理内存扩容。

  • 适合:临时内存峰值、预算有限的 t 系列实例、防止关键进程被杀。
  • 先准备:确认实例存储类型(EBS)、备份重要数据、规划 Swap 大小。
  • 验收:使用 free -h 查看 Swap 总量,监控 swapin/swapout 避免频繁交换。

命令速用版

# 创建 2G Swap 文件
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
# 设置权限
sudo chmod 600 /swapfile
# 格式化
sudo mkswap /swapfile
# 启用
sudo swapon /swapfile
# 永久生效
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab

为什么会这样

Swap 本质是利用磁盘空间模拟内存,当物理内存耗尽时将不活跃数据交换到磁盘。

EC2 实例默认不配置 Swap 分区,这在内存充足时能提升性能,但遇到突发流量就容易出问题。磁盘的读写速度远低于内存,因此 Swap 只能作为缓冲层,防止应用因内存不足而崩溃,不能作为长期性能提升方案。

分步处理

1. 规划容量

通用型应用建议 Swap 空间设置为实例内存的 50% 到 100%。对于 2 GiB 或以下内存的实例,推荐交换空间为 RAM 容量的 2 倍;大于 2 GiB 但小于 64 GiB 的实例,推荐为 RAM 容量的 0.5 倍。

2. 创建 Swap 文件

使用 dd 命令创建指定大小的文件,例如创建 4G 文件:

sudo dd if=/dev/zero of=/opt/swap/swap_4G bs=1024000 count=4000

3. 设置权限与格式化

Swap 文件权限必须设置为 600,否则系统会拒绝启用:

sudo chmod 600 /opt/swap/swap_4G
sudo mkswap /opt/swap/swap_4G

4. 启用与持久化

立即启用 Swap 并写入 fstab 确保开机自动挂载,建议添加 nofail 参数防止启动失败:

怎么调整 EC2 实例 Swap 交换分区大小优化内存使用
sudo swapon /opt/swap/swap_4G
echo '/opt/swap/swap_4G swap swap defaults,nofail 0 0' | sudo tee -a /etc/fstab

怎么验证是否生效

使用 free -h 命令查看 Swap 行,Total 列应显示新配置的大小。

free -h
swapon `--show`

观察 vmstat 命令输出,si 和 so 列如果不为 0 说明正在发生交换,需关注磁盘 IO 性能。

常见坑

权限错误:Swap 文件权限如果不是 600,swapon 会报错 insecure permissions。

启动失败:/etc/fstab 配置错误可能导致实例无法启动,建议添加 nofail 参数。

性能下降:频繁 Swap 交换会导致系统响应变慢,若 si/so 持续高位应考虑升级实例类型。

实例存储:实例存储(Instance Store)重启后数据丢失,Swap 文件应创建在 EBS 卷上。

常见问题

Swap 文件大小设置多少合适?

通用建议是物理内存的 50% 到 100%,内存小于 2GB 时可设为 2 倍。

配置 Swap 后需要重启实例吗?

不需要,使用 swapon 命令可立即生效,修改 fstab 仅影响下次启动。

Swap 文件可以放在根目录吗?

可以,通常放在/swapfile 或/opt/swap 目录,确保所在文件系统有足够空间。

如何删除 Swap 配置?

先执行 swapoff 禁用,删除文件后移除/etc/fstab 中对应行。

参考来源

  • AWS EC2 内存告急?3 步搞定虚拟内存扩容 (附自动挂载技巧)
  • AWS-EC2 配置 swap
  • 如何在硬盘上使用分区在 Amazon EC2 实例上分配内存作为交换空间?
  • Ubuntu 修改 Swap 交换空间大小
  • centos 怎么调整 swap 内存的大小