生产环境NodeJS Express应用PM2生态配置最优参数选择
PM2 生产环境配置实践建议
cluster_mode 实例数设置
- 优先参考服务器用途和服务类型:如果服务器仅部署当前Express服务,且服务以IO密集型逻辑为主(常规接口服务,包含数据库查询、第三方接口调用等场景),可设置为服务器物理CPU核数的1~1.5倍;如果服务包含大量CPU密集型计算(加解密、文件处理等),不要超过物理CPU核数,避免过多上下文切换带来的性能损耗。
- 如果服务器同时部署了Nginx、数据库、缓存等其他服务,需要预留足够的CPU资源给这些进程,实例数需在上述基础上适当下调,比如8核物理机上同时跑MySQL和Redis,可将实例数设置为5~6即可。
- 不要盲目开过多实例:每个Node实例独立占用内存,实例总数越高总内存消耗越大,要结合服务器可用内存总量调整,避免整体内存不足触发系统OOM Kill。
max_memory_restart 阈值设置
- 先确定服务正常运行的内存基线:通过压测或者线上运行观测,拿到服务峰值流量下的正常内存占用值,阈值设置为该值的1.52倍即可,留出足够冗余避免正常峰值时误重启。比如常规Express服务峰值内存占200M,可设置为`300M`
400M。 - 阈值不能超过V8堆内存上限:64位系统下Node默认的V8老年代堆内存上限约1.4G,未调整V8参数的情况下,
max_memory_restart不要超过1.2G,否则还没触发PM2重启,V8会先抛出内存溢出错误导致服务崩溃。 - 若你手动调整了V8堆上限(启动参数加
--max-old-space-size=xxx,单位为MB),max_memory_restart要比你设置的V8堆上限低10%~20%,留出缓冲空间。 - 注意总内存约束:单实例阈值乘以实例总数,不要超过服务器可用内存的70%,避免多个实例同时达到阈值时占满服务器内存。
注意:如果服务出现频繁触发重启的情况,优先排查代码内存泄漏问题,不要靠调高阈值兜底,重启只是临时补救方案。
内容的提问来源于stack exchange,提问作者duthaho
相关产品推荐
相关产品推荐

