上传 200MB 视频时 RSS 从 400MB 冲到 1.1GB,两个并发就触发容器限制。请求结束后内存不回落,GC 之后还留着 600MB。日志里能对上时间点,这种反而好排。
multer 不带 dest 或 storage 时把整个文件收进 memoryStorage,Buffer 之外还有一份拷贝,峰值接近文件大小的两倍。并发数一乘就超过容器 limit。这一点先确认清楚,后面就不用反复试。
const multer = require('multer');
const upload = multer({ dest: 'tmp/', limits: { fileSize: 200 * 1024 * 1024 } });
app.post('/upload', upload.single('file'), handler);
「上传内存翻倍」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
处理上按这个顺序:换成 diskStorage 直接落临时目录 不要先进内存;或者用 busboy 边读边写 落盘后再校验;限制单请求大小和并发上传数 超限提前拒绝;上传完成后显式删临时文件 别指望重启清理。
结果对不对很好判断,同样 200MB 上传 RSS 峰值在 450MB 上下 两个并发也不再触发 OOMKilled。
