NodeJS 100%cpu使用率 - epoll_wait

时间:2014-11-17 14:07:13

标签: node.js

我试图追踪为什么我的nodejs app突然使用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

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

修改

我的节点版本: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

1 个答案:

答案 0 :(得分:2)

看起来像Node JS v0.10.25 错误事件循环,看看here

注意,来自this github pull request:

  

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

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