我写了一个Node.js应用(TCP网络服务,不是网站),CPU占用达到类似功能C语言程序的十多倍。
有什么工具可以看到CPU都消耗在什么地方呢?比如说,每个函数调用了多少次、花费多长时间,有多少setTimeout和setInterval等待运行。
解决方案
经过仔细检查,发现是程序内有死循环。调试的方法就是简单的插入console.log
。
// private method entry_expiryCache.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)
,导致程序死循环。