Docker+PM2部署NestJS应用出现HTTP高延迟该如何排查优化?
核心问题特征先明确
从你给出的监控数据可以直接排除业务代码阻塞问题:事件循环延迟p95仅1.59ms,平均HTTP延迟仅2ms,只有P95延迟接近10s,且无请求量,说明问题出在极少数请求的前置准备阶段,不是普遍的服务性能问题。
排查思路
- 先验证是否为闲置冷启动问题:连续发送10次相同请求,查看首请求响应时间是否远高于后续9次,如果符合则直接定位为闲置资源回收类问题
- 排查Docker资源限制与回收策略:执行
docker stats查看容器是否存在CPU节流、内存Swap占用,确认宿主机是否开启了闲置容器资源回收、SWAP分区 - 排查PM2进程回收配置:检查PM2配置文件中
max_memory_restart阈值,当前堆已使用91.5M,如果阈值设置低于128M,会触发进程静默重启,首请求会被重启流程阻塞 - 排查网络链路问题:用
curl -w "%{time_connect} %{time_starttransfer} %{time_total}\n" <接口地址>测试请求耗时分布,确认是连接阶段慢还是服务端处理慢;重点验证DNS解析、数据库/缓存连接是否存在闲时超时回收的情况 - 排查应用懒加载逻辑:确认NestJS是否配置了模块懒加载、数据库连接是否为按需创建,闲置时连接被服务端回收后,首次请求需要重建连接会产生秒级延迟
可调整的配置项
PM2配置调整
- 将
max_memory_restart调整为至少256M,避免阈值过低触发意外重启 - 集群模式下添加
min_uptime: 10000配置,避免进程启动初期误判为异常重启 - 确认线上Node.js版本与本地开发版本一致,避免跨版本运行时差异
Docker配置调整
- 启动容器时添加固定资源预留参数:
--cpus=2 --memory=512M --memory-reservation=256M --memory-swappiness=0,避免闲置容器资源被宿主机回收、内存被交换到磁盘 - 不要使用Alpine版本的Node.js镜像作为运行时,部分底层依赖缺失会导致偶发的调用延迟
应用配置调整
- 数据库/缓存连接池配置最小空闲连接数,例如TypeORM添加
extra: { min: 2 }参数,避免连接被全部回收 - 关闭不必要的模块懒加载,第三方服务域名配置本地hosts或者开启DNS缓存,避免首次请求解析超时
内容的提问来源于stack exchange,提问作者DaSch
相关产品推荐
相关产品推荐

