NodeJS 100%cpu使用率 - epoll_wait

Alo*_*ius 6 node.js

我试图追查为什么我的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
Run Code Online (Sandbox Code Playgroud)

以下是输出: 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
Run Code Online (Sandbox Code Playgroud)

这是我第一次调试节点应用程序.从上面的调试输出中可以得出任何结论吗?错误在哪里?

编辑

我的节点版本: 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
Run Code Online (Sandbox Code Playgroud)

Mak*_*sym 2

似乎 Node JS v0.10.25的事件循环错误,请看这里

请注意,来自github 拉取请求:

如果在两个不同的进程中打开相同的文件描述,则关闭文件描述符不足以将其从 epoll 实例中注销(如 epoll(7) 中所述),从而导致导致事件循环重复旋转的虚假事件。所以总是明确地取消注册它。

因此,作为解决方案,您可以尝试更新操作系统或更新 Node JS。