内存告急先别急着加配置:给云服务器配一份 swap 救急
内存告急先别急着加配置:给云服务器配一份 swap 救急
1 核 2G 的小鸡跑个编译、起两个容器,动不动进程被系统"杀掉",dmesg 里躺着一行 Out of memory: Killed process。先别急着升配置——多数云厂商的默认镜像根本没开 swap,加一份 swap 文件,几分钟就能让这种"内存毛刺"场景稳下来。
先看清现状:到底缺不缺
free -h # 看 Mem 和 Swap 两行
swapon --show # 有输出才说明 swap 生效中
dmesg | grep -i "out of memory" # 确认之前是不是被 OOM killer 干掉的
如果 Swap 那行全是 0,而 OOM killer 确实杀过进程,那 swap 就是对症的药。注意:swap 治的是"偶发毛刺",不是"常态不够"——后面会讲边界。
四步配好 swap 文件
以 2G 内存的机器加 2G swap 为例(swap 大小一般取内存的 0.5~1 倍):
# 1. 创建 2G 的空文件
sudo fallocate -l 2G /swapfile
# 2. 权限必须 600,否则 swapon 直接拒绝
sudo chmod 600 /swapfile
# 3. 格式化成 swap 区并启用
sudo mkswap /swapfile
sudo swapon /swapfile
# 4. 验证
free -h
真实踩坑:fallocate 在某些文件系统上会翻车
在 btrfs(部分云镜像默认用它)上,fallocate 打出来的文件带"空洞",swapon 会报错 swapon failed: Invalid argument 或提示 swap file has holes。别跟它较劲,换 dd 老实写满:
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
慢一点,但哪都行得通。配完记得重做 chmod 600 和 mkswap。
重启不丢:写进 fstab
只 swapon 的话重启就没了,加一行持久化:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
写完先别急着重启验证——用 sudo swapoff -a && sudo swapon -a 走一遍 fstab 的逻辑,没报错才算数。fstab 写错一行,机器可能开不了机,这一步值得多花 10 秒。
swappiness:让系统别太"恋战"内存
cat /proc/sys/vm/swappiness # 默认一般是 60
这个值决定内核多积极地把不活跃内存页换到 swap。云服务器上建议调低一点(比如 10),让 swap 真正只在救急时上场:
# 临时生效
sudo sysctl -w vm.swappiness=10
# 永久生效
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
边界:什么时候 swap 救不了你
vmstat 1里si/so(换入/换出)长期大于 0,说明系统一直在靠 swap 续命——这时该升内存,不是加 swap。- 云盘 IO 本来就慢,重度 swap 会让整机卡成 PPT,这种场景加 swap 只是把"被杀"换成"卡死"。
- 不要拿 swap 容量去规划应用内存:Java 堆、数据库 buffer pool 这些常驻内存,该给物理内存还是得给。
一句话总结
fallocate(不行换 dd)→ chmod 600 → mkswap → swapon → 写 fstab → 按需调 swappiness。2G 小鸡的 OOM 毛刺,多数到这一步就安静了。真到了 si/so 常年不为零的那天,再大大方方去升配置——那是业务在增长,不是你在浪费钱。
- 点赞
- 收藏
- 关注作者
评论(0)