先说背景
我有一台 1 核 1.9G 内存的破 VPS,20G 硬盘,Intel Xeon E5-2660 v2 这种上古神U。放在现在任何云厂商眼里都属于「垃圾配置,建议升级」。
但我就喜欢折腾,这台机子上跑着:
- Docker(Hugo 博客容器 + Nginx Proxy Manager)
- 定时脚本(每天自动写文章、做图片)
- 一堆后台服务
内存从来就没超过 1.5G 空闲过。今天就聊聊我是怎么让这台小破机子苟延残喘的。
第一刀:砍掉 swap 的幻想
Linux 默认 swap 大小为 RAM 的两倍,但小内存机器开大 swap 纯属自我安慰。内存不够靠 swap 撑?等着被 OOM Killer 干碎吧。
我的做法:swap 只开 512M,而且把 swappiness 调成 10。
| |
不是不用 swap,而是让它当最后一道防线,不是日常缓存池。
第二刀:Docker 内存硬限制
以前 Docker 容器默认不限制内存,几个容器跑起来直接干到 1.2G。后来我学乖了,每个容器都加了 --memory 限制:
| |
nginx:alpine 跑静态博客,128M 完全够。 之前不加限制它吃 300M+,纯属浪费。
第三刀:关掉不需要的系统服务
Ubuntu 24.04 默认开了一堆你用不上的服务:cups(打印服务)、bluetooth(蓝牙,服务器有个锤子蓝牙)、avahi-daemon(局域网发现)。全给我关了:
| |
这一刀下去,直接省了 100M+。蚊子腿也是肉。
第四刀:用 Alpine 镜像
Docker 镜像能用 Alpine 的就别用 Ubuntu/Debian。同样一个容器,nginx:alpine 不到 8M,nginx:latest 要 200M。虽然这是磁盘,但小镜像也意味着更少的内存占用(更少的进程、更少的缓存)。
第五刀:日志轮转
这是最容易被忽视的。Docker 默认的日志驱动是 json-file,如果不限制大小,一个容器跑几个月日志能到几个 G。我加了全局限制:
| |
写到 /etc/docker/daemon.json 然后重启 Docker。配合 journalctl --vacuum-size=200M 把系统日志也砍了,又能腾出几百兆。
现状
折腾完这一套,现在这台 1.9G 的机子日常内存占用稳定在 800M-1G 左右,还有将近 1G 的空闲。跑博客、跑脚本、偶尔跑个编译任务,完全够用。
当然,你要问我为什么不上 4G 内存的机器?
因为穷。
而且折腾本身就是一种快乐,看着自己用各种骚操作把一台垃圾配置的机子压榨到极致,这种成就感比直接花钱升级爽多了。就像玩《戴森球计划》里用最烂的传送带搭出完美的生产线——虽然效率低,但是帅啊。
下次再聊聊怎么优化那 20G 的磁盘,比内存更绝望的话题。