直接在Debug Console执行require('perf_hooks').performance.eventLoopUtilization(),若active值长期接近0(如0.0001)且utilization持续趋近0,可确认事件循环已僵死;返回undefined则说明Node版本低于v14.10。

如何用 Debug Console 快速判断事件循环是否卡住
事件循环卡住时,process.uptime() 停止增长、console.log 不输出、断点不命中——这些现象背后是 poll 阶段空转,无 I/O、定时器或 setImmediate 可执行。VSCode 的调试器依赖 V8 Inspector 心跳通信,一旦事件循环冻结,心跳超时就会断连。
直接在 Debug Console 里执行以下命令:
require('perf_hooks').performance.eventLoopUtilization()返回对象中 active 值长期接近 0(比如 0.0001),就说明事件循环几乎没干活;若 utilization 也持续趋近于 0,基本可确认已僵死。
- 别等进程彻底挂掉才查——毛刺期(延迟 >50ms)就该干预
-
eventLoopUtilization()是运行时快照,需多次调用对比趋势,不是单次结果定论 - 如果返回
undefined,说明 Node 版本低于 v14.10,得换方式验证
为什么 launch.json 加了 --inspect-brk 还没用
默认 launch.json 启动的调试会话不开启底层事件追踪,--inspect-brk 只管连接,不管分析。要让 VSCode 捕获事件循环阶段细节,必须显式启用 Node.js 内部 trace 事件。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
在 launch.json 的配置中补全这两项:
"runtimeArgs": ["--inspect-brk=9229", "--trace-event-categories", "v8,disabled-by-default-node"]
"env": {"NODE_OPTIONS": "--trace-events-enabled --trace-event-file=./tracing.json"}-
--trace-event-categories是关键,漏掉它,Chrome DevTools 里看不到loop、timer、idle等阶段标记 -
tracing.json文件生成后,可用 Chrome 打开chrome://tracing→ Load → 查看火焰图中主线程是否长时间空白 - 端口
9229要和chrome://inspect中显示的一致,否则无法关联录制
用 process.nextTick + performance.now 实时抓毛刺
静态配置不如运行时埋点来得及时。在入口文件(如 index.js 或 app.js)顶部插入轻量探测代码,能第一时间发现延迟突增。
const start = performance.now();process.nextTick(() => {const delta = performance.now() - start;if (delta > 50) console.warn('Event loop delay:', delta, 'ms');});- 这个组合利用了
process.nextTick的最高优先级微任务特性——它总在当前操作结束后、进入下一事件循环阶段前执行 -
delta > 50是经验值,生产环境建议设为30,开发期可放宽到100 - 不要放多处——重复埋点会导致日志污染,且
nextTick堆积本身可能加重负担 - 该方法对长同步循环(如
while(true))敏感,但对未处理Promise.reject无效,后者需配合process.on('unhandledRejection')
常见误判:CPU 归零 ≠ 事件循环健康
CPU 使用率低常被当成“系统空闲”,但在 Node.js 里,这更可能是事件循环卡在 poll 阶段空等,既没 I/O 事件,也没定时器到期,更没 setImmediate 待执行——整个线程处于“假活”状态。
-
kill -USR1 <pid>触发不了堆快照?说明 V8 已失去响应能力,不是慢,是停了 - 用
strace -p <pid>(Linux)观察系统调用,若长期停留在epoll_wait且无返回,就是 poll 阶段死等 - 同步阻塞(如
fs.readFileSync)、未捕获拒绝的 Promise、密集计算循环,三者表现相似但根因不同,得结合堆栈和日志交叉定位

















