我写了一个Node.js应用(TCP网络服务,不是网站),CPU占用达到类似功能C语言程序的十多倍。
有什么工具可以看到CPU都消耗在什么地方呢?比如说,每个函数调用了多少次、花费多长时间,有多少setTimeout和setInterval等待运行。
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
经过仔细检查,发现是程序内有死循环。调试的方法就是简单的插入console.log。
console.log
// private method entry_expiry Cache.prototype.entry_expiry = function Cache_entry_expiry(key) { var now = Date.now(); var entry = this.T[key]; if (now >= entry._expiry) { delete this.T[key]; } else { setTimeout(this.entry_expiry.bind(this, key), entry._expiry - now); } };
其中的var now = Date.now();之前不慎写成var now = Date.now;。Date.now转换成数字是NaN,造成now >= entry._expiry永远是false。 而setTimeout(fn,NaN)等同于setTimeout(fn,0),导致程序死循环。
var now = Date.now();
var now = Date.now;
Date.now
NaN
now >= entry._expiry
false
setTimeout(fn,NaN)
setTimeout(fn,0)
pm2 可以满足到文件.. https://github.com/Unitech/pm2
至于要到函数的话,就要用的V8Profiler 了,不过这个有点难用...
http://code.google.com/p/v8/wiki/V8Profiler
参考一下这个吧... https://github.com/cnodejs/nodeclub/wiki/入门知识概览
经过仔细检查,发现是程序内有死循环。调试的方法就是简单的插入
console.log
。其中的
var now = Date.now();
之前不慎写成var now = Date.now;
。Date.now
转换成数字是NaN
,造成now >= entry._expiry
永远是false
。而
setTimeout(fn,NaN)
等同于setTimeout(fn,0)
,导致程序死循环。pm2 可以满足到文件.. https://github.com/Unitech/pm2
至于要到函数的话,就要用的V8Profiler 了,不过这个有点难用...
http://code.google.com/p/v8/wiki/V8Profiler
参考一下这个吧... https://github.com/cnodejs/nodeclub/wiki/入门知识概览