程序出了点问题,cpu一直占满,但是业务代码基本没执行, profile如图,问下99.9%的program指标是什么?是死循环吗?
- Node.js 是一个JavaScript 运行时环境(JavaScript Runtime Environment)
- Node.js 是基于事件循环(Event Loop)机制
Program 简单讲就是 node 进程,所以你用 node index.js
执行就相当于开启了一个 node 进程。然后 node 是基于事件循环机制,因此 node 进程简单点做的事情就是:
main() {
while(event_queue.length > 0) {
event = event_queue.pop();
event.run();
}
}
上面的代码是 native code,event.run 执行的是 js code,但是这里的 (program)
只计算了 native code 的时间,不包含 js code 的时间,所以 99% 说明一直在循环没怎么执行 event 或 event 的执行时间很短。如果你的代码是一个 web server,那在没有请求的时候 node 进程就是在不停地循环,这时 (program)就会占用大部分时间(因为没事情做)。如果你不停地请求网站,这时 (program) 就会降低了,相当于很多时间用来执行 js code 了。另外可以看出 program 也是函数调用树的最顶层。
赞1楼,学习了。
楼主可以这样理解:idle
也是native
在执行(program)
的一种
另外,1楼提到的循环机制,请楼主不要误解成while(true){}
。node并没有忙等待(一直在Running状态
占OS资源)。没事干的时候,主线程是Blocked
状态,他在等待重新就绪运行的事件或信号。
所以Profiler的统计时间,是你点Start到Stop的时间间隔。与cpu占用时间不完全一致。
@helloyou2012 谢谢解答
@soda-wy 谢谢解答
(program) 通常就是指的是采样时间里,没有在 JavaScript 的堆栈上。也就是说您的 99.9%的时间里,都没有执行 JavaScript。