Node服务端进程出现阻塞时如何定位到阻塞点
最近在做Node的底层监控,想实现在线实时调试cpu和mem信息,其实单纯实现在线输出并且调试cpu信息倒是不难,v8的cpu信息日志解析基本也完成了,但是遇到一个难点:
- 如果Node主线程出现阻塞(比如由于某些情况下正则贪婪匹配)时如何获取当前的栈信息呢?
- 如果没有办法在阻塞时获取栈信息,那么如何快速定位到阻塞点呢?
- 希望做法能不要在业务代码中加日志,一影响性能二耦合度太高,倾向于做oneAPM那种运行时侵入底层库的做法
之前的想法是写一个node扩展,将类似oneAPM一样的客户端在uv_thread_create或者uv_queue_work跑,这样子相当于在子线程中执行agent,不会受到主进程阻塞的影响。然而经过尝试,在子线程中貌似isolate有问题,所以导致在子线程调用
v8::Isolate::GetCurrent()->GetCpuProfiler()->StartProfiling
时总是段错误。 话说社区有大神指点迷津一下么,或者说如何在子线程进行StartProfiling/StopProfiling的操作呢,不胜感激