2016-07-20 2 views
0

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

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

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

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

+0

¿Как именно ваша установка ?, Хотя узел использует только 1 поток, некоторые модули, которые вы можете использовать может использовать несколько потоков. Если у вас есть сервер nginx или apache, он может автоматически использовать поток для каждого запроса. Я сомневаюсь, что это имеет какое-либо отношение к ОС – angrykoala

+0

Нет nginx или любого другого сервера .... Я использую простое приложение узла с экспресс-прослушиванием на порте 8000. Я использую следующие модули: Q, момент, выражение, запрос и log4js. – harsh

ответ

0

Хотя приложение управляется одной нитью, есть вспомогательные потоки внутри узла, чтобы облегчить выполнение в пределах среды выполнения. Примерами являются поток компилятора 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) 
+0

Спасибо за ваш ответ Gireesh.Если ресурсы хорошо распределены даже без кластеризации ... тогда в чем смысл использования кластера? – harsh

+0

Кластер в основном балансирует нагрузку на ваше приложение, где однопоточный режим не может управлять всеми параллельными запросами. Однопоточный режим хорошо работает для наиболее распространенных рабочих нагрузок, и в таких сценариях эти дополнительные потоки используются для обеспечения того, чтобы интенсивные работы по хранению процессора (такие как компиляция и GC) не мешали с кодом приложения и не- существенно замедлить путь запроса-ответа. Итак, нижняя строка заключается в том, что если ваше веб-приложение ожидает большое количество одновременных запросов, режим кластера идеален. –

+0

https://github.com/nodejs/node/blob/9beef23b605a0eaaccf9d0ba680f6c5ada3e8c4f/deps/v8/src/libplatform/default-platform.cc#L80 –