0.5G 云主机跑 Docker:zram + swapfile 实战

举报
yd_271751777 发表于 2026/10/22 03:59:19 2026/10/22
【摘要】 0.5G 内存云主机跑 Docker 总被 OOM?用 zram 内存压缩交换加一个 swapfile,不动分区表,几行命令把小机器救活。

背景

手上只有一台 0.5G 内存的入门云主机,想在上面跑 Docker,结果稍微跑两个容器就被 OOM Killer 干掉。直接加 swap 分区又要动分区表,风险高。这里记录一套不动磁盘分区、纯靠 zram + swapfile 把小机器救活的做法。

一、先看现状

free -h
swapon --show
cat /proc/sys/vm/swappiness

典型输出是内存 512M、swap 为 0、swappiness=60。没有 swap 时,只要容器峰值超过可用内存,内核会直接杀掉进程。

二、开启 zram(内存压缩交换)

zram 把一部分内存当作压缩后的交换区使用,压缩比通常在 2~3 倍,速度远快于磁盘 swap。

modprobe zram
echo 256M > /sys/block/zram0/disksize
mkswap /dev/zram0
swapon -p 100 /dev/zram0

优先级给到 100,让内核优先使用 zram;只有 zram 满了才会落到磁盘 swapfile。

三、加一个 1G 的 swapfile

fallocate -l 1G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon -p 10 /swapfile

fallocate 比 dd 快很多,也不会产生大量磁盘写入。

四、调整内核参数

sysctl -w vm.swappiness=100
sysctl -w vm.vfs_cache_pressure=50
sysctl -w vm.min_free_kbytes=16384

对 zram 来说 swappiness 建议调高(100),因为压缩内存的代价远低于磁盘 IO;min_free_kbytes 留一点余量,避免突发分配时直接触发 OOM。

五、让配置开机自动生效

把上面的 modprobe、mkswap、swapon 写进 /etc/rc.local,或者用 systemd 单元管理;sysctl 参数写进 /etc/sysctl.d/99-swap.conf。

六、效果

调整后同一台机器可以稳定跑 3~4 个轻量容器(Nginx、Redis、一个 Node 服务),docker stats 观察内存峰值在 480M 左右时不再触发 OOM,构建镜像时的短时内存尖峰也被 zram 吸收掉了。

小结

  • 小内存机器优先用 zram,压缩换空间,几乎无 IO 代价;
  • swapfile 作为第二层兜底,用 fallocate 创建最快;
  • zram 场景下 swappiness 调高而不是调低,这一点和传统磁盘 swap 的直觉相反。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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