Node.js hight CPU 用法,如何调试呢?

Node.js hight CPU usage, how to debug it?

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

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

加载主页时,我看到 CPU 的使用率非常高,如下图所示。

起始页在 MySQL 数据库上执行三个查询,但如果我用 Json 对象而不是 MySQL 查询,似乎 CPU 用法仍然存在太高了。

有一种方法可以在端点函数中跟踪 CPU 的使用情况,以了解 CPU 使用率高的原因?

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

var os = require('os');
console.log(os.cpus());

我解决了我的 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

"Bottom up (heavy) profile" 都与 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