【问题标题】:Node.js hight CPU usage, how to debug it?Node.js CPU占用率高,如何调试?
【发布时间】:2016-07-29 21:48:58
【问题描述】:

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

应用由 PM2 启动和监控。

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

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

有没有办法在endpoint函数中追踪CPU使用率来了解CPU使用率高的原因?

【问题讨论】:

  • "main page is loaded I see a very high use of CPU" -- 你的意思是说你在应用程序执行时总是看到高使用率,你只有在加载主页时才看到,或者你只在第一次加载主页时看到它?
  • 这个应用只有两页。起始页是一种配置器,因此它会在启动时进行一些查询,而其他查询则通过 AJAX Rest 服务执行。第二页(最重要的)在开始时有很多查询,在这种情况下 CPU 使用率为 80/100%。该应用程序将一些数据存储在会话中,并且在此页面中执行的其他操作(通过 REST 服务)具有非常低的 CPU 使用率。所以我认为 MySQL 查询可能是问题所在,但我需要一种方法来检查它,也许可以解决它。

标签: node.js express cpu-usage node-mysql


【解决方案1】:

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

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

【讨论】:

  • 是的,我看到了这个功能,但我需要知道使用的CPU百分比。我找到了这个解决方案,它看起来不错。 gist.github.com/bag-man/5570809
【解决方案2】:

感谢分析,我解决了我的 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/"

我生成了一个已处理的.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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-07
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 2015-10-29
    • 2016-03-22
    • 1970-01-01
    相关资源
    最近更新 更多