如何在运行的特定时间剖析nodejs应用程序?

时间:2018-08-19 21:22:19

标签: javascript node.js profiling cpu

我有一个节点应用程序,它侦听websocket数据提要,并通过与另一个API对话对其进行操作。我现在遇到性能问题。在大多数情况下,情况很安静,CPU约为2-5%,但有时(每24小时约3次),我们收到的Websocket订阅源突然之间在大量数据上变得疯狂了几分钟。这使应用程序进行了大量计算,导致CPU峰值飙升到100%,从而导致其他各种麻烦。我无法预测这些繁忙时间,也无法在测试设置中真正复制它。由于这些原因,我很难分析这些峰值。

我不是Node专家(在Python / php中有更多经验),但是我尝试使用node --prof标志和随后的--prof-process标志(在3GB {{1 }}文件)。没关系,但是问题是,如果我这样做,我会在整个运行过程中进行配置,而不是在运行过程中的高流量部分进行配置。

我签出了isolate-0x321c640-v8.log文件(请参见下面的摘录),希望每行都有某种时间戳,以便我可以隔离出自己感兴趣的时间,但是我找不到这样的东西。在那里。

isolate-0x321c640-v8.log

有人知道在运行时描述这些特定时间的好方法吗?欢迎所有提示!

3 个答案:

答案 0 :(得分:4)

  

我不能为您的问题提供一个简单的答案,但是我准备了以下路线图,以了解有关可以对您有所帮助的用于概要分析和优化的node.js工具和技术的更多信息。

答案 1 :(得分:0)

我宁愿追赶并希望“抓住”问题发生的时间范围,尝试通过对应用程序进行压力测试来模拟它。

首先设置您需要监视正在发生的事情的工具。您认为可读和有用的所有内容都应在此处使用。例如,您可以使用0xv8-profilerheap-profile等。这里的关键是尝试使用这些内容,并找出最易读和易于理解的内容,因为其中一些数据量很大迷路了。

然后获取传入数据的样本,并使用Artilery等库发出大量请求并查看给出的结果。我的意思是,在0x火焰图和来自其他调试库的所有数据之间,您应该具有足够的信息才能得出结论。

如果无法进行模拟,则可以仅在setInterval上运行任何配置文件库,然后将数据写入磁盘。例如,通过这种方法使用堆配置文件:

const heapProfile = require('heap-profile');

heapProfile.start();

// Write a snapshot to disk every hour
setInterval(() => {
  heapProfile.write((err, filename) => {
    console.log(`heapProfile.write. err: ${err} filename: ${filename}`);
  });
}, 60 * 60 * 1000).unref();

因此,每个小时您都会有一个数据文件可查询。

如果节点崩溃,则可以在process.catch中写入转储:

process.on('uncaughtException', function (err) {
  heapProfile.write(...)
});

希望这会有所帮助。

注意process.on('uncaughtException' ...仍在争论中,就我的理解还是使用domains而言,这似乎是处理节点崩溃的正确方法。

答案 2 :(得分:0)

您是否考虑过集成第三方应用程序性能管理(APM),例如NewRelicAppDynamicsAtatusKeymetrics? 它们都有自己的优缺点和不同的定价计划。但是他们都有共同的目标,就是帮助开发人员更好地了解他们的应用程序,以解决像您这样的问题。

其中一些可以免费试用。这可能是判断它是否符合您需求的一个好开始。