NodeJS CPU一次只能达到100%的CPU

Kor*_*men 11 cpu socks node.js

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

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

CPU尖峰

这是CPU峰值的7天图表: 在此输入图像描述

我正在使用Cluster来创建实例,例如:

for (let i = 0; i < Os.cpus().length; i++) {
  Cluster.fork();
}
Run Code Online (Sandbox Code Playgroud)

这是strace的输出,而cpu是100%:

% 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
Run Code Online (Sandbox Code Playgroud)

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

[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
Run Code Online (Sandbox Code Playgroud)

由于我只使用本机库,因此我的大多数代码实际上都是在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
Run Code Online (Sandbox Code Playgroud)

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

任何人有类似的问题,并成功调试它?我可以使用任何我能得到的帮助.

Kor*_*men 1

几个月前,我们意识到在同一机器上运行的另一个跟踪开放套接字的服务导致了这个问题。该服务是一个旧版本,一段时间后,它在跟踪套接字时会导致 CPU 峰值。将服务升级到最新版本解决了 cpu 问题。

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