0.5G 云主机跑 Docker:zram + swapfile 实战
【摘要】 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)