代码之家  ›  专栏  ›  技术社区  ›  kramer65

如何在特定的运行时间内评测nodejs应用程序?

  •  3
  • kramer65  · 技术社区  · 8 年前

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

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

    我查看了 隔离-0x321c640-v8。日志 文件(见下面的摘录)希望在每一行上都有某种时间戳,这样我就可以分离出我感兴趣的时间,但在那里我找不到类似的东西。

    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
    

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

    3 回复  |  直到 8 年前
        1
  •  4
  •   Alexandru Olaru    8 年前

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

        2
  •  0
  •   Akrion    8 年前

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

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

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

    如果无法进行模拟,则可以在 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 .

        3
  •  0
  •   haggis    8 年前

    您是否想过集成第三方应用程序性能管理(APM),如 NewRelic , AppDynamics , Atatus 或 Keymetrics ? 它们都有各自的优缺点和不同的定价方案。但他们都有一个共同的目标,那就是帮助开发人员更好地理解他们的应用程序,以解决像您这样的问题。

    其中一些免费试用。这可能是一个很好的开始,看看它是否适合你的需要。

    推荐文章