Приложение Node.js имеет высокую загрузку ЦП из-за `spawn`, как я могу регистрировать все обращения к нему?

Мое приложение Node.js (мы работаем с v6.9.5) часто использует> 80% загрузки ЦП (также на v4). После выполнения базового профилирования создается впечатление, что он порождает множество дочерних процессов:

[Summary]:
ticks   total  nonlib  name
345    6.7%    6.9%  JavaScript
4451   86.7%   89.1%  C++
82    1.6%    1.6%  GC
136    2.6%          Shared libraries
201    3.9%          Unaccounted

----------

[C++]:
ticks   total  nonlib  name
2606   50.8%   52.2%  node::ProcessWrap::Spawn(v8::FunctionCallbackInfo<v8::Value> const&)
319    6.2%    6.4%  node::ContextifyScript::New(v8::FunctionCallbackInfo<v8::Value> const&)
284    5.5%    5.7%  syscall
111    2.2%    2.2%  write
31    0.6%    0.6%  void node::StreamBase::JSMethod<node::StreamWrap, &(int

Я добавил логирование для всех наших приложений child_process.spawn / exec / execFile звонки, но ни один из них не объясняет, почему процессор тратит на него так много времени.

Я хотел бы теперь регистрировать все звонки child_process во всех node_modules что мы используем, в случае, если есть модуль, который отправляет слишком много вызовов из-за некоторой ошибки, чрезмерного выполнения обратных вызовов или некоторого другого неправильного использования с нашей стороны.

Изначально я думал создать child_process модуль-обертка с добавленной регистрацией, и надеемся, что наши зависимости будут использовать это в пользу нативного модуля Node.js, к сожалению, похоже, что зависимости продолжают использовать нативный модуль.

Вопрос:

  • Как я могу добавить логирование на все spawn вызовы моего процесса? Или есть лучший способ лучше понять, какая часть нашего приложения вызывает появления?

В случае, если я выключен полностью:

  • Может ли быть другая причина node::ProcessWrap::Spawn(v8::FunctionCallbackInfo<v8::Value> const&) потреблять относительно много тактов процессора, кроме child_process звонки?

Любая подсказка ценится!

4

Решение

Вы можете начать узел с флагом —trace. Это приведет к включению встроенной трассировки методов, и одна строка на вызов метода будет напечатана в консоли с глубиной вызова, именем вызова, местоположением скрипта, параметрами, информацией о вызывающем абоненте, информацией о вызываемом абоненте и т. Д., Помещенными в контекстную строку вызов.

Таким образом, вы фактически посчитаете количество экземпляров spawn в след, чтобы определить, сколько звонков было сделано. Во-вторых, перед каждым вызовом spawn вы должны пройти назад в цепочке глубины вызовов, чтобы увидеть иерархию вызовов, чтобы выяснить, как и где в вашем приложении возникли вызовы spawn.

Надеюсь это поможет!

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector