作者:jia19891213 | 来源:互联网 | 2022-12-21 13:22
在将节点从v6.x升级到v8.x时,过去几天我一直在调查websocket graphql api应用程序的性能不佳.
我已经采取了很多火焰图,但我无法弄清楚瓶颈在哪里.有谁知道___kdebug_trace_string
(用c ++)是什么?升级后,我的应用程序似乎花费了更多的时间.
看看这个火焰图:
还可以查看这些配置文件日志:
node v8.x profile log(慢):https://pastebin.com/2W65BZC8
node v6.x profile log:https://pastebin.com/BL4kM7B7
谢谢!
1> boehm_s..:
kdebug_trace_string
是iOS 10和OS X 10.11在2015年10月添加到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
,我们可以假设,DTrace的用途kdebug_trace_string
因此,要解决此问题,可能需要阻止节点使用dtrace.根据这个答案,"当Node启动时,.gypi就像任何其他设置文件一样加载." 所以也许你应该node_use_dtrace
坚持下去false
但
我不明白为什么你没有遇到与节点v6.7.0相同的问题:
在节点v6.7.0 -达尔文-64,node_use_dtrace
被设置为true
过
节点v6.7约.发布日期:2016-09-28
OS X 10.11约发布日期:2015-09-06
你能告诉我node_use_dtrace
两个版本节点的价值吗?
希望它有所帮助,并希望我是对的,
最好的问候