程序出了点问题,cpu一直占满,但是业务代码基本没执行, profile如图,问下99.9%的program指标是什么?是死循环吗?
Program 简单讲就是 node 进程,所以你用 node index.js 执行就相当于开启了一个 node 进程。然后 node 是基于事件循环机制,因此 node 进程简单点做的事情就是:
node index.js
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 也是函数调用树的最顶层。
(program)
赞1楼,学习了。
楼主可以这样理解:idle也是native在执行(program)的一种
idle
native
另外,1楼提到的循环机制,请楼主不要误解成while(true){}。node并没有忙等待(一直在Running状态占OS资源)。没事干的时候,主线程是Blocked状态,他在等待重新就绪运行的事件或信号。
while(true){}
Running状态
Blocked
所以Profiler的统计时间,是你点Start到Stop的时间间隔。与cpu占用时间不完全一致。
@helloyou2012 谢谢解答
@soda-wy 谢谢解答
(program) 通常就是指的是采样时间里,没有在 JavaScript 的堆栈上。也就是说您的 99.9%的时间里,都没有执行 JavaScript。
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
Program 简单讲就是 node 进程,所以你用
node index.js执行就相当于开启了一个 node 进程。然后 node 是基于事件循环机制,因此 node 进程简单点做的事情就是:上面的代码是 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。