Процессор NodeJS накапливается до 100% за один процессор за раз

У меня есть прокси-сервер SOCKS5, который я написал в NodeJS. Я использую собственные библиотеки net и dgram для открытия сокетов TCP и UDP.

Он работает нормально около 2 дней, а все процессоры составляют около 30%. Через 2 дня без перезагрузки один процессор достигает 100%. После этого все процессоры по очереди и остаются на 100% по одному процессору за раз.

CPU Spikes

Вот 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 дней.

У кого-то была аналогичная проблема и удалось отладить ее? Я могу использовать любую помощь, которую я могу получить.

Ответ 1

В вашем вопросе недостаточно информации для воспроизведения вашего дела. Такие вещи, как ОС, Node.js, ваша реализация кода и т.д. Могут быть причиной такого поведения.

Существует список лучших практик, которые могут решить или избежать такой проблемы:

  • Использование pm2 в качестве супервизора для вашего приложения Node.js.
  • Отладка вашего приложения Node.js в производстве. Для этого:
    • проверьте подключение ssh к серверу продуктов
    • привяжите порт отладки к localhost с помощью ssh -N -L 9229:127.0.0.1:9229 [email protected]
    • начать отладку командой kill -SIGUSR1 <nodejs pid>
    • откройте chrome://inspect в своем Chrome или используйте любой другой отладчик для Node.js
  • Прежде чем перейти к производству, сделайте: