Мое приложение 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
звонки?Любая подсказка ценится!
Вы можете начать узел с флагом —trace. Это приведет к включению встроенной трассировки методов, и одна строка на вызов метода будет напечатана в консоли с глубиной вызова, именем вызова, местоположением скрипта, параметрами, информацией о вызывающем абоненте, информацией о вызываемом абоненте и т. Д., Помещенными в контекстную строку вызов.
Таким образом, вы фактически посчитаете количество экземпляров spawn
в след, чтобы определить, сколько звонков было сделано. Во-вторых, перед каждым вызовом spawn вы должны пройти назад в цепочке глубины вызовов, чтобы увидеть иерархию вызовов, чтобы выяснить, как и где в вашем приложении возникли вызовы spawn.
Надеюсь это поможет!
Других решений пока нет …