Узел использует все процессоры без кластеризации. Как так?

У меня есть приложение nodejs, которое получает данные с одного сервера и проталкивает на другой. Для тестирования я отправил 1000 запросов на свой сервер узлов и увидел, что происходит на системном мониторе. Там я мог видеть, что все 4 процессора были заняты на 100%.

Теперь, из того, что я прочитал на nodejs, кажется, что он по умолчанию использует только 1 поток (что означает 1 процессор?). Но почему все процессоры моего компьютера были заняты? Это балансировка нагрузки происходит на уровне ОС (я на Ubuntu 14)

И если балансировка была произведена ОС, то в чем разница между этим автоматическим балансированием нагрузки на уровне ОС и явным использованием кластеров для разделения нагрузки? Каковы преимущества / недостатки каждого?

Любая помощь будет высоко ценится:)

1 ответ

Хотя приложение управляется одним потоком, внутри узла есть вспомогательные потоки, облегчающие выполнение в среде выполнения. Примерами являются потоки компилятора JIT и вспомогательные потоки GC. Хотя они не будут потреблять ресурсы процессора пропорционально загрузке приложения, они будут зависеть от характеристик, характерных для виртуальной машины.

Подключение к живому отладчику показывает, сколько потоков есть, что они делают:

gdb) info threads
  6 Thread 0x7ffff61d8700 (LWP 23181)  0x00000034d080d930 in sem_wait () from /lib64/libpthread.so.0
  5 Thread 0x7ffff6bd9700 (LWP 23180)  0x00000034d080d930 in sem_wait () from /lib64/libpthread.so.0
  4 Thread 0x7ffff75da700 (LWP 23179)  0x00000034d080d930 in sem_wait () from /lib64/libpthread.so.0
  3 Thread 0x7ffff7fdb700 (LWP 23178)  0x00000034d080d930 in sem_wait () from /lib64/libpthread.so.0
  2 Thread 0x7ffff7ffc700 (LWP 23177)  0x00000034d080d930 in sem_wait () from /lib64/libpthread.so.0
* 1 Thread 0x7ffff7fdd720 (LWP 23168)  0x00000034d04e5239 in syscall () from /lib64/libc.so.6
(gdb) 
Другие вопросы по тегам