我现在手上大概有 19 个 Grok Bot,写博客的、跑资讯的、管美术的都有,它们共用同一台云端 Linux 电脑。平时相安无事,今天下午它终于撑不住了。
先交代一下这台机器:8 核 Xeon,16G 内存,126G 硬盘,没有 GPU。最开始一点 swap 都没有。
先是内存紧
中午 13:16 让 bot 看了一眼,内存已经用掉 10G,可用 5.5G。占得最多的是两个浏览器自动化进程,一个 1.3G 到 1.8G 不等。
当时觉得有点悬,13 点 20 多分顺手加了 16G swap。后面会说到,这片 swap 在回滚时跟着一起丢了。
然后就卡死了
16:29 左右,我让几个 bot 并行跑一条 AI 资讯的流水线:AI 资讯 bot 写文稿,Distro Bot 写社媒文案,写完交给美术总监去调度出图和做视频。
大概 16:59 到 17:03 之间,机器卡住了。连 free -h; uptime 这种命令都两分多钟不返回,试了两次,两次都是我手动打断的。
原因说起来也简单,就是 OOM。机器本来就只剩几个 G 的余量,中午那 16G swap 也没扛住,好几个 bot 同时出图、做视频,内存一下就见底了。内核忙着到处回收内存,整台机器就卡在那里,连一条 free -h 都跑不完。

最后只能在设置里点了 Reset,回滚到上一次快照,17:05 左右重新开机。
回滚的代价
损失不算大。工作目录里的文件基本都在,丢的主要是一些装在系统目录里的小工具,补装一下就好了。之前加的 swap 也跟着回滚没了,后面重新开的。
真正难受的是体验。Reset 会把所有 bot 手上的活一起打断,正在跑的任务直接没了,只能重新来一遍。十几个 bot 共用一台机器,一卡死就是全体停工,这比丢几个文件烦人多了。
在 overlay 上开 swap
重新加 swap 的时候踩了个坑。这台机器的根目录是 overlay 文件系统,按常规做法建个文件直接 swapon,会报错:
swapon: /swapfile: swapon failed: Invalid argument绕过去的办法是先把文件挂成 loop 设备,再对 loop 设备 swapon:
sudo fallocate -l 32G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
L=$(sudo losetup -f --show /swapfile)
sudo swapon $L过程有点绕。回滚后先重开了 16G,后来我想要 32G,就又加了一个 16G 的 /swapfile2。两块看着别扭,19:46 干脆合成一块:两块都 swapoff,losetup -d 卸掉 loop 设备,删文件,再按上面的命令建一个 32G 的。
现在 cat /proc/swaps 是这样:
/dev/loop0 partition 33554428 0 -2swappiness 没动,保持 10。
这里有个坑还没填:loop 设备没法直接写进 fstab,所以机器一重启,swap 就得重新挂。目前是手动的,回头得写个开机脚本。
顺便测了一下
swap 是放在硬盘上的,所以顺手用 dd(direct IO)测了下盘:顺序写 663MB/s,顺序读 1.8GB/s,4K 写 146MB/s。比我预想的好一些。
然后用 python 硬塞了 5G 内存进去。free -m 显示内存用了 15581/16013,可用只剩 431,swap 用了 2878MB。程序正常跑完,机器没卡。跑完之后 swap 里还留了 2.4G 左右没回来。
写这篇的时候(19:52)free -h 是:内存 15Gi,用了 10Gi,可用 4.9Gi;swap 31Gi,用了 2.1Gi。
不过 swap 说到底只是个缓冲垫,不是多出来的内存。真用到它的时候肯定比内存慢,它的作用是让机器慢下来而不是直接卡死。
内存到底去哪了
19:45 看的时候用了 12G,其中 cgroup 里的匿名内存约 6.2G,文件缓存约 3G,后者是可以回收的。
大头其实是每个 bot 的固定开销。19 个 bot,每个有一个后台服务,约 150MB,加起来 3G 左右;每个 bot 还有一套自己的虚拟桌面(Xvfb、xfwm4、plank、x11vnc 这些),按 RSS 加起来约 4G,不过这个数有重复计算,实际会少一点。
也就是说,bot 们什么都不干,就已经占掉不少了。再让几个同时出图做视频,不出事才怪。
还没做的事
目前唯一的「预防措施」是我口头跟各个 bot 打了招呼,别同时开太多吃内存的任务。说白了就是靠自觉。
真正该做的几件事都还没做:限制同时跑的重任务数量,给 bot 设 cgroup 内存上限,再写个开机自动重挂 swap 的脚本。等哪天又卡一次,估计就会去做了。
如果你也在一台小机器上养了一堆 bot,建议先把 swap 划上。不贵,关键时候能救命。

