华为云 ECS 小内存实例实战:Swap 配置与内存问题排查
背景
很多开发者在华为云上买的是 1 核 2G 或 2 核 4G 的入门级 ECS,用来跑博客、测试环境或者几个小服务。刚开始一切正常,可一旦同时跑起 MySQL、Java 应用和 Nginx,就容易出现进程突然消失、SSH 卡顿甚至实例假死的情况。查看系统日志,往往能看到 “Out of memory: Killed process” 这样的记录,说明内核的 OOM Killer 已经出手,强行结束了占用内存最多的进程。
华为云公共镜像(如 Huawei Cloud EulerOS、CentOS、Ubuntu)默认通常不开启 Swap。Swap 是把一部分磁盘空间当作“备用内存”,当物理内存吃紧时,把不常用的内存页换出到磁盘,给活跃进程腾出空间。它的速度远比不上真实内存,但能在内存峰值时起到缓冲作用,避免关键服务被直接杀掉。
本文以一台 2G 内存的 ECS 为例,介绍如何排查内存占用、创建并持久化 Swap 文件,以及如何调整相关内核参数。
步骤
1. 先看清内存现状
在动手之前,先确认内存到底被谁吃掉了:
# 查看内存与 Swap 总体情况
free -h
# 按内存占用排序,列出前 10 个进程
ps aux --sort=-%mem | head -n 11
# 查看是否发生过 OOM
dmesg -T | grep -i -E "out of memory|killed process"
journalctl -k | grep -i oom
free -h 中要重点看 available 列,它表示系统还能分配给新进程的内存,比 free 列更有参考意义。如果 Swap 一行全是 0,说明当前没有配置 Swap。
2. 检查磁盘空间
Swap 文件会占用系统盘空间,先确认余量充足:
df -h /
经验上,2G 内存的实例配置 2G Swap 比较合适;4G 及以上内存可配置 2G 到 4G。系统盘剩余空间建议至少保留 Swap 大小再加 5G。
3. 创建 Swap 文件
# 创建 2G 的文件(若 fallocate 不可用,改用下面的 dd 命令)
sudo fallocate -l 2G /swapfile
# sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
# 只允许 root 读写,防止敏感内存数据泄露
sudo chmod 600 /swapfile
# 格式化为 Swap 并启用
sudo mkswap /swapfile
sudo swapon /swapfile
注意:如果系统盘是 XFS 且内核版本较老,fallocate 生成的文件可能无法被 swapon 识别,提示 “Invalid argument”,这时改用 dd 方式即可。
4. 开机自动挂载
swapon 只对当前运行有效,重启后会失效,需要写入 fstab:
# 先备份
sudo cp /etc/fstab /etc/fstab.bak
# 追加一行
echo '/swapfile none swap defaults 0 0' | sudo tee -a /etc/fstab
5. 调整 swappiness
vm.swappiness 决定内核使用 Swap 的积极程度,取值 0 到 100,默认常为 30 或 60。对于服务器,我们希望优先使用物理内存,只在紧张时才换出,建议设为 10:
# 立即生效
sudo sysctl vm.swappiness=10
# 永久生效
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swap.conf
sudo sysctl --system
如果系统上缓存的文件元数据很多,还可以适当把 vm.vfs_cache_pressure 调到 50,让内核更愿意保留目录和文件缓存。
6. 设置内存告警(可选)
只配 Swap 还不够,最好能在内存紧张时第一时间知道。可以在华为云控制台安装云监控插件(Agent),开启操作系统监控后,为“内存使用率”配置告警规则,例如连续三个周期超过百分之八十五就发送短信或邮件通知。这样在服务被拖慢之前,就能提前介入处理,比如重启异常进程、清理缓存或者评估是否需要升级规格。
验证
# 确认 Swap 已启用
swapon --show
free -h
# 确认参数
cat /proc/sys/vm/swappiness
# 校验 fstab 写法,无报错即可
sudo mount -a && sudo swapoff /swapfile && sudo swapon -a && swapon --show
swapon --show 能看到 /swapfile,大小为 2G,即说明配置成功。建议在业务低峰期执行一次 sudo reboot,重启后再用 free -h 确认 Swap 仍然存在。
日常观察可以使用 vmstat 2 10,重点看 si 和 so 两列:偶尔非零属于正常,如果长时间持续较大,说明内存严重不足,频繁换页会导致性能明显下降。
常见问题
1. 加了 Swap 后服务还是变慢?
Swap 只是缓冲,不是扩容。如果 si、so 长期很高,说明实际需要的内存远超物理内存,应考虑通过华为云控制台变更规格,或者限制应用内存,例如给 Java 进程设置 -Xmx,给 MySQL 调小 innodb_buffer_pool_size。
2. 如何删除 Swap?
sudo swapoff /swapfile
sudo sed -i '/\/swapfile/d' /etc/fstab
sudo rm -f /swapfile
3. 重启后实例无法启动?
多半是 fstab 写错。可以通过华为云控制台的远程登录(VNC)进入单用户模式,修复 /etc/fstab,或者用之前备份的 fstab.bak 还原。
4. 想保护某个关键进程不被 OOM 杀掉?
可以调整它的 oom_score_adj,数值越低越不容易被杀:
echo -500 | sudo tee /proc/$(pgrep -o mysqld)/oom_score_adj
如果服务由 systemd 托管,更推荐在 unit 文件中写 OOMScoreAdjust=-500,重启服务后依然有效。
5. 云盘性能会影响 Swap 吗?
会。高 IO 或超高 IO 类型的云硬盘换页速度更快,通用型 SSD 足以应对偶发峰值,但不适合长期依赖 Swap。
小结
小内存 ECS 上配置 Swap,是一种成本几乎为零的稳定性兜底手段。完整流程是:先用 free、ps、dmesg 定位内存压力来源,再创建 Swap 文件并写入 fstab,最后把 swappiness 调低,让系统优先使用物理内存。需要记住的是,Swap 解决的是“偶发峰值”,而不是“长期不够”。如果监控显示换页持续频繁,就该优化应用内存配置或升级实例规格了。建议配合华为云云监控设置内存使用率告警,做到问题早发现、早处理。
- 点赞
- 收藏
- 关注作者
评论(0)