2017-02-08 45 views
4

My Node.js (мы используем v6.9.5), приложение часто использует> 80% использования ЦП (также на V4). После выполнения некоторых основных профилирование, кажется, что она порождая много дочерних процессов:Приложение Node.js имеет высокую загрузку процессора из-за `spawn`, как я могу регистрировать все вызовы?

[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 вызовов, но ни один из них не объясняет, почему CPU тратит на это столько времени.

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

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

Вопрос:

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

В случае, если я уезжаю полностью:

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

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

ответ

0

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

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

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