从节点v6.7.0升级到v8.11.1时性能很差

时间:2018-04-09 06:23:33

标签: node.js performance websocket profiling graphql

在将节点从v6.x升级到v8.x时,我过去几天一直在调查web​​socket graphql api应用程序的性能不佳。

我已经拍了很多火焰图,但我无法弄清楚瓶颈在哪里。有谁知道___kdebug_trace_string(在c ++中)是什么?升级后,我的应用程序似乎花费了更多的时间。

查看此火焰图:

Flame graph

另请查看这些个人资料日志:

node v8.x profile log(慢): https://pastebin.com/2W65BZC8

node v6.x个人资料日志: https://pastebin.com/BL4kM7B7

提前致谢!

1 个答案:

答案 0 :(得分:6)

kdebug_trace_string是一个系统调用,已于2015年10月针对iOS 9和OS X 10.11添加到XNU。

它是kdebug的一部分,是主要的XNU内置调试工具。 阅读kdebug_trace.c时,我在评论中找到了以下注释:

  

请注意,用户空间API正在选择优化快速路径,非错误   通过验证每个debugid的验证来实现性能。这意味着   可能在用户空间中捕获的错误情况将成为   在使用正确的错误代码返回之前的系统调用。这种权衡   表现是故意的。

它解释了为什么___kdebug_trace_string在你的火焰图上占据了很多位置。

这只是一个猜测,如果您不使用Apple电脑,所有这一切都是错误的,但如果它错了,我真的想知道是什么导致了这个混乱。


假设我是对的,如果调用kdebug_trace_string,那么这意味着节点运行某种调试实用程序。 我下载了 node-v8.11.1-darwin-x64 ,并在node/config.gypi中找到了以下行:

 'node_use_dtrace': 'true',

因此节点v8.11.1使用dtrace。
然后,查看osx/src/dtrace/libdtrace/dt_open.c中的this line,我们可以假设dtrace使用kdebug_trace_string

因此,为了解决这个问题,我们希望阻止节点使用dtrace。根据{{​​3}},“当节点启动时,.gypi像任何其他设置文件一样被加载。”所以也许你应该把node_use_dtrace设置为false

但是

我不明白为什么你没有遇到与节点v6.7.0相同的问题:

  • node-v6.7.0-darwin-x64 中,node_use_dtrace也设置为true
  • 节点v6.7约。发布日期:2016-09-28
  • OS X 10.11约发布日期:2015-09-06

你能告诉我你的两个节点版本node_use_dtrace的价值吗?

希望它有所帮助,希望我是对的,
最好的问候