Node.js 节点js cpu 100%
我们的节点应用程序每隔一段时间就会有一个环境在100%CPU上运行。服务器不是很活跃,通常在0%-2%的CPU上运行。 我想知道可能导致此问题的常见问题是什么,以及找出导致此问题的原因的最佳方法是什么 服务器规格: 节点版本0.8.14Node.js 节点js cpu 100%,node.js,Node.js,我们的节点应用程序每隔一段时间就会有一个环境在100%CPU上运行。服务器不是很活跃,通常在0%-2%的CPU上运行。 我想知道可能导致此问题的常见问题是什么,以及找出导致此问题的原因的最佳方法是什么 服务器规格: 节点版本0.8.14 ubuntu 11.10 英特尔(R)至强(R)CPU E5645@2.40GHz 使用的节点包: "express" : 2.5.x, "log" : "1.2.x", "redis" : "0.8.x", "socket.io" : "0.9.x", "mo
ubuntu 11.10
英特尔(R)至强(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",
您可以使用配置文件配置您的应用程序
node tick
bynpm-g安装tick
节点运行应用程序--prof./app.js
节点勾选处理器
并解释结果 #!/usr/bin/env node
require(__dirname+"/processor-usage.js").startWatching();
var shouldRun = true;
var desiredLoadFactor = .5;
function blockCpuFor(ms) {
var now = new Date().getTime();
var result = 0
while(shouldRun) {
result += Math.random() * Math.random();
if (new Date().getTime() > now +ms)
return;
}
}
function start() {
shouldRun = true;
blockCpuFor(1000*desiredLoadFactor);
setTimeout(start, 1000* (1 - desiredLoadFactor));
}
setInterval(function() {
console.log("current process cpu usage: "+(global.processCpuUsage || 0)+"%");}
, 1000);
if (process.argv[2]) {
var value = parseFloat(process.argv[2]);
if (value < 0 || value > 1) {
console.log("please give desired load value as a range [0..1]");
process.exit(-1);
} else {
desiredLoadFactor = value;
}
}
start();
#/usr/bin/env节点
require(_dirname+“/processor usage.js”).startWatching();
var shouldRun=true;
var desiredLoadFactor=.5;
功能块cpufor(毫秒){
var now=new Date().getTime();
var结果=0
while(应该运行){
结果+=Math.random()*Math.random();
如果(新日期().getTime()>now+ms)
返回;
}
}
函数start(){
shouldRun=true;
块CPufor(1000*所需负载系数);
setTimeout(开始,1000*(1-所需加载因子));
}
setInterval(函数(){
log(“当前进程cpu使用率:+(global.processCpuUsage | | 0)+“%”;}
, 1000);
if(process.argv[2]){
var值=parseFloat(process.argv[2]);
如果(值<0 | |值>1){
log(“请以[0..1]的范围给出所需的负载值”);
进程。退出(-1);
}否则{
期望载荷系数=值;
}
}
start();
在2019年更新强> 您最好使用内置的
--prof进程
来处理v8评测数据,生成的文件不再是v8.log,节点勾号处理器
对您帮助不大,因此,要评测应用程序并读取v8评测数据,您可以按以下步骤进行:
node --prof your_script.js
节点将在当前目录中生成一个名称如下的文件isolate-0x103800000-v8.log
,现在您可以使用此文件生成分析报告
node --prof-process isolate-0x103800000-v8.log > processed.txt
如果您将UI应用程序与网页包一起使用,请注意
查看选项
或查看
对我来说,这可以解决问题
watchOptions: {
poll: false
}
以100%CPU持续运行是无限循环的典型特征。这在单线程NodeJ中是一个真正的问题,但不幸的是,缺少关于它的信息 最终我发现了唯一有用的方法: 如何跟踪nodejs中的死循环: 通过SSH连接到您的服务器。标识nodejs进程id(例如,设为4702)。 现在,让我们告诉进程侦听调试请求。 是的,我们正在使用一个叫做kill的命令。不,我们不会扼杀这个过程。我们发出了一个不同的信号
kill -SIGUSR1 4702
完成此操作后,进程将向调试器连接打开。事实上,它会在控制台日志中打印一个特殊的URL,您可以在Chrome中打开该URL来调试该过程!但是,也许您不想为了建立连接而在防火墙和容器配置上钻一个洞。是的,我也是。
因此,让我们在命令行进行调试:
node inspect -p 4702
您将看到以下提示:
debug>
然后键入:
pause
你回来了:
break in file:///somewhere/something.js:555
>555 for (prop in inputObject) {
510 if (hasOwnProp(inputObject, prop)) {
511 normalizedProp = normalizeUnits(prop);
对!!我们得到了第一个提示。应用程序正在执行文件something.js中的第555行。
这可能足以立即看到错误。但通常我们需要更多的信息。您可以键入backtrace以获得完整的堆栈跟踪:
#0 someFunctionName file:///somewhere/somefile.js:444:22
#1 someFunctionName file:///somewhere/somefile.js:555:33
#2 someFunctionName file:///somewhere/somefile.js:666:44
…等等。使用npm作为根(即sudo npm)时要小心。请阅读此处的讨论:哦,伙计,这帮助我发现我删除了一个模块,同时在服务中也需要它。很好。在现场脚本中查找问题!太棒了,谢谢你:D