NodeJS CPU一次达到100%一个CPU

时间:2018-01-05 21:39:00

标签: node.js cpu socks

我有一个我在NodeJS中编写的SOCKS5代理服务器。 我正在利用本机netdgram库来打开TCP和UDP套接字。

它工作正常约2天,所有CPU最多约30%。在没有重新启动的情况下2天后,一个CPU达到100%。之后,所有CPU轮流并一次保持100%的CPU。

CPU Spikes

以下是CPU峰值的7天图表: enter image description here

我使用Cluster创建实例,例如:

for (let i = 0; i < Os.cpus().length; i++) {
  Cluster.fork();
}

当cpu为100%时,这是strace的输出:

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
99.76    0.294432          79      3733           epoll_pwait
 0.10    0.000299           0      3724        24 futex
 0.08    0.000250           0      3459        15 rt_sigreturn
 0.03    0.000087           0      8699           write
 0.01    0.000023           0       190       190 connect
 0.01    0.000017           0      3212        38 read
 0.00    0.000014           0       420           close
 0.00    0.000008           0       612       180 recvmsg
 0.00    0.000000           0        34           mmap
 0.00    0.000000           0        16           ioctl
 0.00    0.000000           0       190           socket
 0.00    0.000000           0       111           sendmsg
 0.00    0.000000           0       190           bind
 0.00    0.000000           0       482           getsockname
 0.00    0.000000           0       218           getpeername
 0.00    0.000000           0       238           setsockopt
 0.00    0.000000           0       432           getsockopt
 0.00    0.000000           0      3259       104 epoll_ctl
------ ----------- ----------- --------- --------- ----------------
100.00    0.295130                 29219       551 total

节点配置文件结果(重磅):

[Bottom up (heavy) profile]:
Note: percentage shows a share of a particular caller in the total
amount of its parent calls.
Callers occupying less than 1.0% are not shown.

 ticks parent  name
1722861   81.0%  syscall

  28897    1.4%  UNKNOWN

由于我只使用本机库,因此我的大部分代码实际上都是在C ++上运行而不是JS。所以我要做的任何调试都是在v8引擎中。以下是节点分析器(语言)的摘要:

 [Summary]:
   ticks  total  nonlib   name
   92087    4.3%    4.5%  JavaScript
 1937348   91.1%   94.1%  C++
   15594    0.7%    0.8%  GC
   68976    3.2%          Shared libraries
   28897    1.4%          Unaccounted

我怀疑它可能是正在运行的垃圾收集器。但我增加了Node的堆大小,内存似乎在范围内。我不知道如何调试它,因为每次迭代大约需要2天。

任何人都有类似的问题,并且成功调试了吗?我可以使用任何帮助。

2 个答案:

答案 0 :(得分:0)

在您的问题中,没有足够的信息来重现您的案例。 OS,Node.js版本,代码实现等等都可能是这种行为的原因。

有一些可以解决或避免此类问题的最佳做法列表:

  1. 使用pm2作为Node.js应用程序的主管。
  2. 在生产中调试Node.js应用程序。为了那个原因:
    • 检查您与产品服务器的ssh连接
    • 使用ssh -N -L 9229:127.0.0.1:9229 root@your-remove-host
    • 将调试端口绑定到localhost
    • 通过命令kill -SIGUSR1 <nodejs pid>
    • 开始调试
    • 在您的Chrome中打开chrome://inspect或使用Node.js的任何其他调试程序
  3. 在开始制作之前:

答案 1 :(得分:0)

几个月前,我们意识到另一个在同一个盒子上运行的服务正在跟踪打开的套接字导致了这个问题。这项服务是一个较旧的版本,过了一段时间,它在跟踪套接字时加入了cpu。将服务升级到最新版本解决了cpu问题。

经验教训:有时不是你,而是他们