压测到 8000 连接,RSS 从 800MB 涨到 6.1GB,单个连接平均 750KB,GC 之后不回落,再加连接直接被 OOM kill。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
node --inspect=0.0.0.0:9229 server.js # 连上后抓两次 heap snapshot 对比连接数变化
每个连接上挂了读缓冲、写队列和一份全量房间快照,房间快照是每次广播时按人复制的。业务对象还反向引用了 socket,连接关了对象也没释放。这一点先确认清楚,后面就不用反复试。
「连接数内存」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
具体做法是,用堆快照对比 1000 和 8000 连接时的对象数 看谁在涨;写队列加上限 超过 1MB 就断开慢客户端;广播复用同一份序列化结果 不要每人一份;close 回调里把引用置空 特别是定时器和事件监听。
改完照着核一遍,8000 连接时 RSS 稳定在 1.8GB 左右 断开一半后回落到 1GB 以内。
