node js cpu 100%

dor*_*zur 30 node.js

我们遇到的问题是,我们的节点应用程序每隔一段时间就会在100%CPU上运行.服务器不是非常活跃,通常在0%-2%CPU上运行.我想知道可能导致此问题的常见问题是什么,以及找出导致此问题的原因的最佳方法是什么.

服务器规格:

node version 0.8.14
ubuntu 11.10
Intel(R)Xeon(R)CPU E5645 @ 2.40GHz

使用的节点包:

"express" : 2.5.x,
"log" : "1.2.x",
"redis" : "0.8.x",
"socket.io" : "0.9.x",
"mongodb": ">= 0.9.6-7",
"passport" : "0.x.x",
"passport-local" : "0.x.x",
Run Code Online (Sandbox Code Playgroud)

Vad*_*hev 33

您可以使用node-tick对您的应用进行分析.

  1. 安装node-tick方式sudo npm -g install tick
  2. 使用启用的配置文件运行您的应 node --prof ./app.js
  3. 使用CPU 100%使用一段时间后停止您的应用程序
  4. 您可以在app目录中看到v8.log,现在可以使用node-tick-processor读取它
  5. 运行node-tick-processor并解释结果


Ze *_*eus 14

2019 年更新!!

您最好使用内置--prof-process来处理 v8 分析数据,生成的文件不再是 v8.log 并且node-tick-processor对您没有太大帮助,因此要分析您的应用程序并读取 v8 分析数据,您可以按以下步骤操作:

node --prof your_script.js
Run Code Online (Sandbox Code Playgroud)

Node 会isolate-0x103800000-v8.log在你当前的目录中生成一个名字像这样的文件,现在你使用这个文件来生成一个分析报告

node --prof-process isolate-0x103800000-v8.log > processed.txt
Run Code Online (Sandbox Code Playgroud)

简单的分析


Dmi*_*hin 7

持续以 100% CPU 运行是无限循环的典型特征。这是单线程 Nodejs 中的一个真正问题,但不幸的是缺乏相关信息。

\n

最终我找到了唯一有用的文章:\nHow to track the deadloop in nodejs:

\n

通过 SSH 连接到您的服务器。识别nodejs进程ID(例如,让它为4702)。\n现在,让\xe2\x80\x99s告诉进程监听调试请求。\n是的,我们\xe2\x80\x99正在使用一个名为kill的命令。不,我们\xe2\x80\x99不会终止该进程。我们\xe2\x80\x99正在向它发送不同的信号。

\n
kill -SIGUSR1 4702\n
Run Code Online (Sandbox Code Playgroud)\n

执行此操作后,该进程将打开调试器连接。事实上,它会在其控制台日志中打印一个特殊的 URL,您可以在 Chrome 中打开该 URL 来调试该过程!但是,也许您不想\xe2\x80\x99 只想在防火墙和容器配置中钻一个洞来建立连接。是的,我也一样。\n所以让\xe2\x80\x99s 在命令行进行调试:

\n
node inspect -p 4702\n
Run Code Online (Sandbox Code Playgroud)\n

您\xe2\x80\x99将看到以下提示:

\n
debug>\n
Run Code Online (Sandbox Code Playgroud)\n

然后输入:

\n
pause\n
Run Code Online (Sandbox Code Playgroud)\n

然后你回来:

\n
break in file:///somewhere/something.js:555\n>555         for (prop in inputObject) {\n510             if (hasOwnProp(inputObject, prop)) {\n511                 normalizedProp = normalizeUnits(prop);\n
Run Code Online (Sandbox Code Playgroud)\n

是的!我们有了第一个提示。该应用程序正在执行文件 Something.js 中的第 555 行。\n这可能足以立即看到该错误。但通常我们需要更多的信息。您可以输入 backtrace 来获取完整的堆栈跟踪:

\n
#0 someFunctionName file:///somewhere/somefile.js:444:22\n#1 someFunctionName file:///somewhere/somefile.js:555:33\n#2 someFunctionName file:///somewhere/somefile.js:666:44\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x80\xa6 等等。

\n