先把当时的情况摆出来。Chrome headless 抓取任务突然全部失败,报 No space left on device,可 df -h 显示根目录和 /tmp 都还很空,只有 /dev/shm 是满的。

真正麻烦的地方在于,几个原因的现象几乎一样。/dev/shm 默认是内存的一半,容器里常常只有六十四 M。另一种情况是抓取进程崩溃之后共享内存段没有释放,残留越积越多。

还有一种情况,compose 文件里没有显式指定 shm 尺寸,沿用默认值。

动手时先看共享内存使用情况

df -h /dev/shm

接着列出残留的共享内存段

ipcs -m | head -20

然后按 shmid 释放无用段

ipcrm -m 32769

给容器加大 shm 尺寸后重建

docker run --shm-size=1g myapp

同事提醒我看一下最近一次发布,时间点确实对得上。

怎么算真的好了,看的是同一批现象。df -h /dev/shm 使用率降到一成以下,抓取任务连续跑一小时不再报空间不足。

容易忽略的是,shm 里的数据重启就消失,别当缓存目录用;容器默认六十四 M 是最常见的坑,浏览器类任务至少要给一 G。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189