在将节点从v6.x升级到v8.x时,我过去几天一直在调查websocket graphql api应用程序的性能不佳。
我已经拍了很多火焰图,但我无法弄清楚瓶颈在哪里。有谁知道___kdebug_trace_string
(在c ++中)是什么?升级后,我的应用程序似乎花费了更多的时间。
查看此火焰图:
另请查看这些个人资料日志:
node v8.x profile log(慢): https://pastebin.com/2W65BZC8
node v6.x个人资料日志: https://pastebin.com/BL4kM7B7
提前致谢!
答案 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_use_dtrace
也设置为true
你能告诉我你的两个节点版本node_use_dtrace
的价值吗?
希望它有所帮助,希望我是对的,
最好的问候