文章

网站又挂了,本地却跑得好好的

10 月 3 日和 5 日,我的网站各挂了一次。线上内存一直涨,同样的请求拿到本地,怎么跑都复现不了。

Blaine
约 2 分钟RSS

10 月 3 日,我的网站挂了一次。10 月 5 日,又挂了一次。

它跑在一台 VPS 上,Next.js 和 Payload 装在同一个 Docker 容器里,外面是 Caddy。原来后台和公开页面分开,每次改内容都要重建。后来合成一个应用,日常发布也改成上传构建产物,再切换版本目录。

这次出问题,翻到容器的内存记录:大约 44 小时,匿名内存涨到 3.3GB。其中大约 2.9GB 在 glibc 的堆里,JavaScript 的堆没有这么大。

容器没设内存上限,宿主机也没有 swap。内存涨上去,系统把进程杀了。

我把同样的请求拿到本地跑,内存不涨。线上每来一次请求,都能看到原生内存增加,本地却一直好好的。

找不到原因,先给容器加上限,再限制 V8、glibc 和图片处理的内存占用。后台队列原来每秒查一次,改成每 5 秒一次。

我又加了一个探针,每 5 分钟留一条内存记录。最初盯错了进程,记到的是启动器 tini,后来才改成真正的 Node 进程。页面预取也单独分出来,免得和普通请求混在一起。

有个办法是内存快满时自动抓快照。我没用:上限只有 384MB,抓快照本身就可能再把服务撑挂,主要增长的又是原生内存。

本地还复现不出来。先让服务器把每次增长记下来,下一轮从这些记录接着查。

#产品与工程