从节点 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 时性能糟糕的主要内容,如果未能解决你的问题,请参考以下文章

8fabric node sdk1.4.8新增删除组织

7fabric node sdk1.4.8新增删除组织

将节点版本从 v6.10 升级到 v10.x 后捆绑项目的差异

从 v4.13.7 升级到 5.0.1 后节点应用程序崩溃

3fabric node sdk1.4.8更新锚节点(通道文件的形式)

10fabric node sdk1.4.8手工设置组织锚节点