我有一个节点应用程序,它侦听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
有人知道在运行时描述这些特定时间的好方法吗?欢迎所有提示!
答案 0 :(得分:4)
我不能为您的问题提供一个简单的答案,但是我准备了以下路线图,以了解有关可以对您有所帮助的用于概要分析和优化的node.js工具和技术的更多信息。
Netflix JavaScript Talks - Debugging Node.js in Production-他们有一个有趣的想法,即在崩溃时存储完整的处理器和内存转储,我认为这对您很有用。
0x-火焰图分析工具,对了解CPU的行为非常有帮助: 关于如何使用0x Squeeze node.js performance with flame graphs
clinic-一个非常有趣的工具,用于基于异步钩子对node.js应用程序进行性能分析和性能审核
答案 1 :(得分:0)
我宁愿追赶并希望“抓住”问题发生的时间范围,尝试通过对应用程序进行压力测试来模拟它。
首先设置您需要监视正在发生的事情的工具。您认为可读和有用的所有内容都应在此处使用。例如,您可以使用0x,v8-profiler,heap-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),例如NewRelic,AppDynamics,Atatus或Keymetrics? 它们都有自己的优缺点和不同的定价计划。但是他们都有共同的目标,就是帮助开发人员更好地了解他们的应用程序,以解决像您这样的问题。
其中一些可以免费试用。这可能是判断它是否符合您需求的一个好开始。