Node.js CPU占用率高,如何调试?

问题描述 投票:0回答:2

我有一个使用 Node.js + Express 3 + Jade 制作的应用程序,它使用 MySQL DB 和 node-mysql 模块。

应用程序由 PM2 启动并监控。

加载主页后,我发现 CPU 使用率非常高,如下图所示。

起始页对 MySQL DB 执行了三个查询,但如果我使用 Json 对象而不是 MySQL 查询,似乎 CPU 使用率仍然太高。

有办法通过端点功能跟踪CPU使用率来了解CPU使用率高的原因吗?

node.js express cpu-usage node-mysql
2个回答
4
投票

感谢分析,我解决了 CPU 问题。

我尝试在端点函数的更多部分记录 CPU 使用情况,但这种方法没有帮助。 对于每个需要获取 CPU 使用情况的人来说,这个脚本非常好: http://gist.github.com/bag-man/5570809

为了排除该问题与 MySQL 查询相关,我创建了一个仅执行查询的简单应用程序,并使用 ApacheBench 对其进行了测试。 本次测试顺利通过。

之后我找到了解决方案。

Node.js 的分析,解释如下: https://nodejs.org/en/docs/guides/simple-profiling/

我使用内置分析器运行应用程序:

NODE_ENV=development node --prof app.js

我通过 ApacheBench 提出了一些请求

ab -k -c 20 -n 250 "http://localhost:8080/"

我生成了一个processed.txt

node --prof-process isolate-0xnnnnnnnnnnnn-v8.log > processed.txt

在总结中我得到了:

 [Summary]:
   ticks  total  nonlib   name
    4036   22.6%   23.3%  JavaScript
   13130   73.6%   75.9%  C++
    1334    7.5%    7.7%  GC
     527    3.0%          Shared libraries
     144    0.8%          Unaccounted

“自下而上(重)配置文件”都与 uglify-js 模块相关:

/node_modules/with/node_modules/uglify-js/lib/parse.js

查看依赖项,我发现该模块由 Jade 使用。

我的应用程序执行了大量查询并生成一个大型 Json 对象,并将其传递给 Jade 模板引擎。

Jade 使用大量 CPU 来解析传递的大对象。

首先,我将该模块从 0.35.0 更新到 1.3.1(因为 pug 仍处于 alpha 状态)。

Jade 使用大量 CPU 来解析传递的大对象。

首先,我将该模块从 0.35.0 更新到 1.3.1(因为 pug 仍处于 alpha 状态)。

得益于此更新,性能有所提高。

但最终我计划加载页面而无需大量查询,并通过 REST 服务获取所需信息,而不将数据传递给 Jade


1
投票

您可以使用os模块来记录机器的CPU使用情况

var os = require('os');
console.log(os.cpus());
© www.soinside.com 2019 - 2024. All rights reserved.