【问题标题】:How to profile nodejs application during specific time in running?如何在运行的特定时间分析 nodejs 应用程序?
【发布时间】:2019-01-26 01:31:37
【问题描述】:

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

我不是 Node 专家(在 Python/php 方面有更多经验),但我尝试使用 node --prof 标志分析此应用程序,然后使用 --prof-process 标志(在 3GB isolate-0x321c640-v8.log 文件上)。这没问题,但问题是如果我这样做,我会分析它运行的整个时间,而不是它运行的高流量部分。

我检查了isolate-0x321c640-v8.log 文件(请参阅下面的摘录),希望在每一行上都有某种时间戳,以便我可以隔离我感兴趣的时间,但我在那里找不到类似的东西。

tick,0x8ad1f58c24,26726463388,0,0x3fedc8b5859026ea,0,0x8ad76332f8,0x8ad7619f68,0x84113fbe10b,0x8ad12fd54f,0x8ad734f837,0x8ad735192b,0x8ad59c2598,0x8ad59c9765
tick,0x8ad1f6d472,26726464443,0,0x3ff76afe21366278,0,0x8ad7633873,0x8ad7619f68,0x84113fbe10b,0x8ad12fd54f,0x8ad734f837,0x8ad735192b,0x8ad59c2598,0x8ad59c9765
tick,0x8ad1206bd5,26726465499,0,0x8ad1f58c40,0,0x8ad76332f8,0x8ad7619f68,0x84113fbe10b,0x8ad12fd54f,0x8ad734f837,0x8ad735192b,0x8ad59c2598,0x8ad59c9765
tick,0x8ad1f6d472,26726466552,0,0x400040d9bba74cfb,0,0x8ad763377d,0x8ad7619f68,0x84113fbe10b,0x8ad12fd54f,0x8ad734f837,0x8ad735192b,0x8ad59c2598,0x8ad59c9765
tick,0x8ad1f591fa,26726467615,0,0x3fe94cccccccccce,0,0x8ad7626638,0x8ad761c1d9,0x84113fbe10b,0x8ad12fd54f,0x8ad734f837,0x8ad735192b,0x8ad59c2598,0x8ad59c9765
tick,0x8ad1f6d472,26726468680,0,0x7ffcc894f270,0,0x8ad1f59054,0x8ad7626638,0x8ad761c1d9,0x84113fbe10b,0x8ad12fd54f,0x8ad734f837,0x8ad735192b,0x8ad59c2598,0x8ad59c9765
tick,0x8ad1f6d41c,26726469744,0,0x329ab68,0,0x8ad7626cc9,0x8ad761c1d9,0x84113fbe10b,0x8ad12fd54f,0x8ad734f837,0x8ad735192b,0x8ad59c2598,0x8ad59c9765

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

【问题讨论】:

  • 为什么投反对票?非常欢迎对我的问题有什么问题发表任何评论!
  • 也许您可以将文件拆分为多个文件以减少部分运行时间的流量。

标签: javascript node.js profiling cpu


【解决方案1】:

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

其中一些提供免费试用。这可能是一个很好的开始,看看它是否符合您的需求。

【讨论】:

    【解决方案2】:

    我不会寻找并希望“抓住”问题发生的时间范围,而是尝试通过对您的应用进行压力测试来模拟它。

    首先设置监控正在发生的事情所需的工具。任何你觉得可读和有用的东西都应该在这里使用。例如,您可以使用0xv8-profilerheap-profile 等。这里的关键是尝试这些,看看什么是最易读和最容易理解的,因为其中一些数据太多以至于你会迷失在其中.

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

    如果无法模拟,那么您可以简单地在setInterval 上运行任何分析库并将数据写入磁盘。例如,heap-profile 与这种方法一起使用:

    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 相比,它是否是处理节点崩溃的正确方法。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2013-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-01
        • 2011-09-06
        • 2013-03-06
        • 1970-01-01
        相关资源
        最近更新 更多