NodeJS 100%cpu使用率 – epoll_wait

我试图追查为什么我的nodejs应用程序突然使用100%的CPU。 该应用程序有大约50个并发连接,并在ec2微型实例上运行。

以下是strace -c node server.js的输出

 ^C% time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 87.32 0.924373 8 111657 epoll_wait 6.85 0.072558 3 22762 pread 2.55 0.026965 0 146179 write 0.92 0.009733 0 108434 1 futex 0.44 0.004661 0 82010 7 read 0.44 0.004608 0 223317 clock_gettime 0.31 0.003244 0 172467 gettimeofday 0.31 0.003241 35 93 brk 0.20 0.002075 0 75233 3 epoll_ctl 0.19 0.002052 0 23850 11925 accept4 0.19 0.001997 0 12302 close 0.19 0.001973 7 295 mmap 0.06 0.000617 4 143 munmap 

这里是node-tick-processor的输出

  [Top down (heavy) profile]: Note: callees occupying less than 0.1% are not shown. inclusive self name ticks total ticks total 669160 97.4% 669160 97.4% /lib/x86_64-linux-gnu/libc-2.15.so 4834 0.7% 28 0.0% LazyCompile: *Readable.push _stream_readable.js:116 4750 0.7% 10 0.0% LazyCompile: *emitReadable _stream_readable.js:392 4737 0.7% 19 0.0% LazyCompile: *emitReadable_ _stream_readable.js:407 1751 0.3% 7 0.0% LazyCompile: ~EventEmitter.emit events.js:53 1081 0.2% 2 0.0% LazyCompile: ~<anonymous> _stream_readable.js:741 1045 0.2% 1 0.0% LazyCompile: ~EventEmitter.emit events.js:53 960 0.1% 1 0.0% LazyCompile: *<anonymous> /home/ubuntu/node/node_modules/redis/index.js:101 948 0.1% 11 0.0% LazyCompile: RedisClient.on_data /home/ubuntu/node/node_modules/redis/index.js:541 

这是我第一次debugging一个节点的应用程序。 是否有任何可以从上面的debugging输出中得出的结论? 错误在哪里?

编辑

我的节点版本: v0.10.25

编辑2

将节点更新到: v0.10.33

这是输出

 ^C% time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 91.81 1.894522 8 225505 45 epoll_wait 3.58 0.073830 1 51193 pread 1.59 0.032874 0 235054 2 write 0.98 0.020144 0 1101789 clock_gettime 0.71 0.014658 0 192494 1 futex 0.57 0.011764 0 166704 21 read 

       

网上收集的解决方案 "NodeJS 100%cpu使用率 – epoll_wait"

看起来像事件循环节点JS v0.10.25错误,看看这里 。

请注意,从这个 github拉请求:

如果在两个不同的进程中打开相同的文件描述,那么closures文件描述符不足以从epoll实例中注销它(如epoll(7)中所述),导致虚假事件导致事件循环反复旋转。 所以总是明确注销它。

所以作为解决scheme,您可以尝试更新您的操作系统或更新节点JS