【问题标题】:Horrible performance when upgrading from node v6.7.0 to v8.11.1从节点 v6.7.0 升级到 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怎么样?是否有可能在编译节点时启用了一些调试标志?

标签: node.js performance websocket profiling graphql


【解决方案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。
  • 是的,但是如果你在配置文件中关闭分析呢?会影响表演吗?
猜你喜欢
  • 1970-01-01
  • 2018-01-16
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
  • 2013-02-04
  • 1970-01-01
相关资源
最近更新 更多