从节点 v6.7.0 升级到 v8.11.1 时性能糟糕
Posted
技术标签:
【中文标题】从节点 v6.7.0 升级到 v8.11.1 时性能糟糕【英文标题】:Horrible performance when upgrading from node v6.7.0 to v8.11.1 【发布时间】:2018-09-18 11:35:52 【问题描述】:过去几天我一直在调查 websocket graphql api 应用程序在将节点从 v6.x 升级到 v8.x 时性能不佳。
我已经拍摄了很多火焰图,但我无法弄清楚瓶颈在哪里。有谁知道___kdebug_trace_string
(c++) 是什么?升级后,我的应用程序似乎花费了更多时间。
看看这个火焰图:
还可以查看这些配置文件日志:
节点 v8.x 配置文件日志(慢): https://pastebin.com/2W65BZC8
节点 v6.x 配置文件日志: https://pastebin.com/BL4kM7B7
先谢谢了!
【问题讨论】:
试试node v9
怎么样?是否有可能在编译节点时启用了一些调试标志?
【参考方案1】:
kdebug_trace_string
是 2015 年 10 月为 ios 9 和 OS X 10.11 添加到 XNU 的系统调用。
它是主要 XNU 内置调试工具 kdebug 的一部分。 在阅读kdebug_trace.c时,我在cmets中发现了如下注释:
请注意,用户空间 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。根据this answer,“当 Node 启动时,.gypi 就像任何其他设置文件一样被加载。”。所以也许你应该将node_use_dtrace
设置为false
但是
我不明白为什么你在 node 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
的值吗?
希望它有所帮助,希望我是对的, 最好的问候
【讨论】:
我相信 kdebug_trace_string 也出现在 ubuntu 火焰图上,但我会仔细检查并在今晚回复。 我在 Ubuntu 中创建火焰图时遇到问题,因此我无法确认该部分。至于 node_use_dtrace,这两个版本都应该是 true,因为 macOS 上的 profiling node 使用 dtrace。 是的,但是如果你在配置文件中关闭分析呢?会影响表演吗?以上是关于从节点 v6.7.0 升级到 v8.11.1 时性能糟糕的主要内容,如果未能解决你的问题,请参考以下文章
将节点版本从 v6.10 升级到 v10.x 后捆绑项目的差异