1

我正在尝试诊断我的 node.js 应用程序中的错误。问题是,在让 node.js 进程在一夜之间运行之后,我们一直遇到这样一种情况,即节点核心中的 HTTP 解析器最终会吞噬所有 CPU 周期并锁定进程。我知道它是 HTTP 解析器,因为我已经使用 dtrace 对其进行了跟踪。

请考虑以下快速而肮脏的火焰图可视化:

http://37.153.104.73:8081/main.html

此可视化使用此处描述的技术。顶部的滑块可调整进行跟踪的小时数。左边的列是我的应用程序代码所花费的时间,右边的列是 HTTP 解析器所花费的时间。您可以看到,在整个晚上,越来越多的时间花在 HTTP 解析器上,直到凌晨 3:00,实际上所有时间都花在了 HTTP 处理器上。

可能导致这种情况的一件事是我们正在使用 eventsource-node 库,它设置了长寿命的 HTTP 连接。

此问题出现在 Node.js 0.8 和 0.10、32 位 Linux、64 位 Linux 和 SmartOS 上。

我没有任何诊断源自节点核心的问题的经验,因此将不胜感激有关如何开始诊断此问题的任何指导。我在上面链接到的服务器上提供了所有跟踪数据。

4

1 回答 1

2

火焰图的顶部显示了 HTTP 解析器之外的堆栈上的其他功能。这显示解析器调用 EventEmitter.emit(),它在原生 string.js 调用 match(),然后在原生 regexp.js 调用 RegExpExecNoTests(),然后进入 v8:internal::Runtime_RegExpExec。

因此,占用 CPU 的是作为来自 http 解析器的“数据”事件的结果执行正则表达式。match() 在不断增长的数据缓冲区上被调用。

于 2013-10-15T19:46:57.440 回答