华为云 ECS 小内存实例实战:Swap 配置与内存问题排查

举报
yd_252351073 发表于 2026/11/04 09:20:20 2026/11/04
【摘要】 背景很多开发者在华为云上买的是 1 核 2G 或 2 核 4G 的入门级 ECS,用来跑博客、测试环境或者几个小服务。刚开始一切正常,可一旦同时跑起 MySQL、Java 应用和 Nginx,就容易出现进程突然消失、SSH 卡顿甚至实例假死的情况。查看系统日志,往往能看到 “Out of memory: Killed process” 这样的记录,说明内核的 OOM Killer 已经出手...

背景

很多开发者在华为云上买的是 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 解决的是“偶发峰值”,而不是“长期不够”。如果监控显示换页持续频繁,就该优化应用内存配置或升级实例规格了。建议配合华为云云监控设置内存使用率告警,做到问题早发现、早处理。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。