Узел использует все процессоры без кластеризации. Как так?
У меня есть приложение 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)