У меня есть прокси-сервер SOCKS5, который я написал в NodeJS.
Я использую собственные библиотеки net
и dgram
для открытия сокетов TCP и UDP.
Он работает нормально около 2 дней, а все процессоры составляют около 30%. Через 2 дня без перезагрузки один процессор достигает 100%. После этого все процессоры по очереди и остаются на 100% по одному процессору за раз.
Вот 7-дневный график всплесков CPU:
Я использую Cluster для создания таких экземпляров, как:
for (let i = 0; i < Os.cpus().length; i++) {
Cluster.fork();
}
Это результат работы strace, а процессор - 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
И результат профиля node (тяжелый):
[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
Поскольку я использую только собственные библиотеки, большинство моих кодов фактически работает на С++, а не JS. Поэтому любая отладка, которую я должен сделать, - это двигатель v8. Ниже приведен краткий список профилировщика node (для языка):
[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 дней.
У кого-то была аналогичная проблема и удалось отладить ее? Я могу использовать любую помощь, которую я могу получить.