nodejs分析; 什么是'未知'

在分析nodejs程序时,我发现61%的tick是由“Unknown”引起的(见下文)。 这可能是什么? 我该找什么?

GR,

科恩

Statistical profiling result from node, (14907 ticks, 9132 unaccounted, 0 excluded). [Unknown]: ticks total nonlib name 9132 61.3% [Shared libraries]: ticks total nonlib name 1067 7.2% 0.0% C:\Windows\SYSTEM32\ntdll.dll 55 0.4% 0.0% C:\Windows\system32\kernel32.dll [JavaScript]: ticks total nonlib name 1381 9.3% 10.0% LazyCompile: *RowDataPacket.parse D:\MI\packet.js:9 ...... 

您正在使用64位版本的Node.JS来运行您的应用程序,并使用32位版本的d8shell来处理您的v8.log 。 使用32位版本的Node.JS与ia32作为d8 shell的构build目标,或者使用x64的64位版本的Node.JS作为d8 shell构build目标应该可以解决您的问题。

你是否加载了任何已经构build了依赖的模块?

基本上由“未知”表示“不明”(更多解释请查看tickprocessor.js )。 例如,GC将打印“扫描,开始,…”等消息,但是logreader.js无法识别这些消息。

这将有助于了解用于分析v8.log文件的分析库。

更新

node-tick软件包在一年内还没有被更新,可能缺less很多最近的prof命令。 尝试使用node-profiler来代替。 它由节点的维护者之一创build。 如果你想得到最好的结果,你需要使用node-gyp来构build它。

更新

我已经使用来自node-profiler (最新的最新版本,不是最新的标签)的v8.log输出进行分析, v8.log结果发布到http://pastebin.com/pdHDPjzE

请允许我指出几个关键条目,大概在一半的时候出现:

 [GC]: ticks total nonlib name 2063 26.2% [Bottom up (heavy) profile] 6578 83.4% c:\node\node.exe 1812 27.5% LazyCompile: ~parse native json.js:55 1811 99.9% Function: ~<anonymous> C:\workspace\repositories\asyncnode_MySQL\lib\MySQL_DB.js:41 736 11.2% Function: ~Buffer.toString buffer.js:392 

所有脚本types的26.2%用于垃圾收集。 这比应该高得多。 虽然它与Buffer.toString花费了多less时间有很好的Buffer.toString 。 如果创build了许多缓冲区,然后转换为string,那么当它们离开作用域时,都需要gc'd。

另外我很好奇为什么在LazyCompilejson.js花了这么多时间。 或者更多,为什么json.js甚至在节点应用程序中是必需的?

为了帮助您调整应用程序的性能,我将在下面列出几个链接,提供有关如何执行和查找的详细说明。

基本的好幻灯片:
https://mkw.st/p/gdd11-berlin-v8-performance-tuning-tricks/#1

更先进的优化技术示例:
http://floitsch.blogspot.com/2012/03/optimizing-for-v8-introduction.html

更好地使用闭包:
http://mrale.ph/blog/2012/09/23/grokking-v8-closures-for-fun.html

现在至于为什么你不能达到相同的产出。 如果你build立和使用node-profiler及其提供的nprofnprof ,它仍然不起作用,那么我会认为它与在Windows上有关。 考虑在GitHub上提交一个bug,看看他是否会帮助你。

尝试构build带有分析支持的v8:

 scons prof=on d8 

确保你运行了与v8版本相对应的版本

然后tools/linux-tick-processor path/to/v8.log显示完整的configuration文件信息。