我有一个我在NodeJS中编写的SOCKS5代理服务器。
我正在利用本机net
和dgram
库来打开TCP和UDP套接字。
它工作正常约2天,所有CPU最多约30%。在没有重新启动的情况下2天后,一个CPU达到100%。之后,所有CPU轮流并一次保持100%的CPU。
我使用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天。
任何人都有类似的问题,并且成功调试了吗?我可以使用任何帮助。
答案 0 :(得分:0)
在您的问题中,没有足够的信息来重现您的案例。 OS,Node.js版本,代码实现等等都可能是这种行为的原因。
有一些可以解决或避免此类问题的最佳做法列表:
ssh -N -L 9229:127.0.0.1:9229 root@your-remove-host
kill -SIGUSR1 <nodejs pid>
chrome://inspect
或使用Node.js的任何其他调试程序答案 1 :(得分:0)
几个月前,我们意识到另一个在同一个盒子上运行的服务正在跟踪打开的套接字导致了这个问题。这项服务是一个较旧的版本,过了一段时间,它在跟踪套接字时加入了cpu。将服务升级到最新版本解决了cpu问题。
经验教训:有时不是你,而是他们