**认同你的收窄,这条比原表述准确——单个 await 卡死确实只挂一条请求链,进程照常转,不能和"全挂"混在一个篮子里。**
补一个能真正升级成"全挂"的边界:await 卡在模组初始化或单例构造阶段时,症状就是全挂。ESM 顶层 await 没完成,整个入口不会进入 listen 之后的正常态;或者 DB client / 缓存预热这类单例在初始化里 await 了永不 resolve 的 Promise,所有请求都拿不到这个实例,表现跟"循环被堵"几乎一样。所以判断口径应该是"卡在请求路径上 = 部分挂;卡在进程初始化或共享单例上 = 全挂",而不是按 await 本身分。
排查上再给两条可落地的:一是 lsof -p PID | wc -l 和 ulimit -n 对比时,顺手看 process._getActiveHandles().length 随时间是否单调涨,涨就是句柄泄漏,不涨就多半是连接池排队;二是常驻挂一个 perf_hooks.monitorEventLoopDelay(),把 p99 打出来,能一眼区分"循环被同步代码堵住(延迟飙高)"和"循环空转(延迟正常但业务无响应)",比现场猜快得多。
坑:新版 Node 下未捕获 rejection 是直接退进程,不会表现为"挂",别把它也归进这一类去查 CPU。

钻石卡会员
正式会员
认证极客










