如何获取正在运行的Node.js进程的线程转储?
在Java JVM中,如何获取正在运行的Node.js进程的线程转储?,node.js,profiling,stack-trace,v8,Node.js,Profiling,Stack Trace,V8,在Java JVM中,kill-3强制进程打印所有运行线程的当前堆栈跟踪。我发现快速定位瓶颈非常有效 V8中是否有同等的发动机?我可以让V8打印当前堆栈跟踪吗 澄清: 我假设,由于节点的异步性质,它不如典型的非异步程序有用。尽管如此,如果有一种简单的方法可以访问几个堆栈跟踪,那么查看它并不需要很多时间 根据我的经验,在您需要切换到更高级的工具之前,可以通过这种方式快速找到一些明显的瓶颈。Node具有完全加载的诊断功能,上面的技巧(如果我理解正确)将是多余的,但请随意更正 必须阅读:NodeSo
kill-3
强制进程打印所有运行线程的当前堆栈跟踪。我发现快速定位瓶颈非常有效
V8中是否有同等的发动机?我可以让V8打印当前堆栈跟踪吗
澄清: 我假设,由于节点的异步性质,它不如典型的非异步程序有用。尽管如此,如果有一种简单的方法可以访问几个堆栈跟踪,那么查看它并不需要很多时间
根据我的经验,在您需要切换到更高级的工具之前,可以通过这种方式快速找到一些明显的瓶颈。Node具有完全加载的诊断功能,上面的技巧(如果我理解正确)将是多余的,但请随意更正 必须阅读:NodeSource的精彩博客 我将尝试列出我发现有用的所有工具:
#节点--调试端口5858上侦听的brk buggy.js调试器
在另一个终端:
connecting to 127.0.0.1:5858 ... ok
break in buggy.js:16
14 }
15
>16 z();
17
18 });
debug> cont```
(wait for the node process to start using 100% CPU)
```debug> step
break in buggy.js:3
1 function x() {
2 var i = 0;
> 3 while(1) {
4 i++;
5 }
debug> bt
#0 buggy.js:3:8
#1 buggy.js:9:2
#2 buggy.js:13:2
#3 buggy.js:16:1```
Source:
https://github.com/nodejs/node-v0.x-archive/issues/25263
您可以使用heapdump工具完成相同的操作。我在下面找到了同样的文章(它也适用于我):
@PaulDraper我不知道是否只有我一个人,但Q似乎认为其他人在使用
kill-3
JVM时对OP的用例有一个合理的想法。我建议您提出一个编辑以获得适当的解决方案。@AdityaGuru在这里描述了这个想法(查看堆栈跟踪,有时被称为穷人档案器):@AdityaGuru类似的情况是调试一个“挂起”的程序。所以要点是“无法完成”——至少不能针对已经运行的任意NodeJS进程,就像我们可以用kill-3
做什么一样?@JanakaBandara我也这么认为。当然有一些方法可以识别NodeJ中的性能问题,但它们在生产中的应用不如运行“kill-3”那么容易。在确定生产中的性能时,我的第一种方法是现在就运行“perf top”。有时,它会给您提供第一条线索,但也有明显的缺点:它不理解NodeJs,因此输出可能很难解释。此外,它还监视CPU使用情况,因此可能会误导IO绑定进程。它仍然很容易运行,并且不会使生产系统太慢,所以我先尝试一下。我认为最好在您的答案中总结一下链接的重要部分。