Загрузка ЦП Node.js на Amazon EC2 - PullRequest
       5

Загрузка ЦП Node.js на Amazon EC2

20 голосов
/ 21 сентября 2011

Видя, как узел является однопоточным, если у меня будет сервер узлов, работающий на экземпляре amazon EC2 с 4 вычислительными блоками EC2, будет ли он работать быстрее / справится с большей нагрузкой, чем если бы у меня было 2 вычислительных блока EC2?

Требует ли загрузка ЦП на amazon многопоточной программы для полного использования всех ресурсов?

Ответы [ 5 ]

18 голосов
/ 09 июля 2012

Чтобы полностью использовать вычислительные ресурсы N ядер, вам нужно по крайней мере N потоков, готовых сделать полезную работу. Это не имеет ничего общего с EC2;просто так работают компьютеры.Из вашего вопроса я предполагаю, что вы выбираете между типами экземпляров m1.medium и m1.large, которые имеют 1 и 2 выделенных ядра соответственно (m1.small - это половина общего ядра, а m1.xlarge - полноевыделенная 4-х ядерная коробка).Таким образом, вам нужно по крайней мере 2 процесса, выполняющих полезную работу, чтобы использовать больший блок (если только вам не нужен доступ к большему количеству памяти / ввода-вывода).

Каждый процесс Node.js имеет однопотоковую структуру. Это позволяет ему обеспечить чистую парадигму программирования, свободную от семантики блокировки.Это очень много задумано.

Чтобы приложение Node.js использовало несколько ядер, оно должно порождать несколько процессов. Эти процессы будут использовать некоторую форму обмена сообщениями (каналы, сокеты,и т. д.) для обмена данными - в отличие от «разделяемой памяти», где код может напрямую изменять области памяти, видимые для нескольких процессов, что потребует семантики блокировки.

На практике это очень просто установить.В Node.JS v0.6.X модуль «кластер» был интегрирован в стандартный дистрибутив, что облегчает настройку нескольких рабочих узлов, которые могут прослушивать один порт.Обратите внимание, что этот «кластерный» модуль НЕ совпадает с модулем «кластера» learnboost, который имеет другой API и владеет именем «кластера» в реестре NPMjs.

http://nodejs.org/docs/latest/api/cluster.html

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i &lt numCPUs; i++) {
    cluster.fork();
  }
} else {
  http.Server(function(req, res) { ... }).listen(8000);
}
12 голосов
/ 21 сентября 2011

Короткий ответ на ваш вопрос заключается в том, что добавление большего количества ядер для улучшения производительности вашего узла не будет работать, если все, что вы делаете, - это пишите «стандартный» однопоточный JavaScript (вы будете связаны одним процессором).

Причина в том, что node.js использует цикл обработки для обработки, поэтому, если все, что вы делаете, это запускаете один процесс node.js без чего-либо еще, он не будет многопоточным и, следовательно, не используетболее одного ЦП (ядра).

Однако , вы можете использовать API кластера node.js для разветвления процесса узла, чтобы вы могли использовать преимущества нескольких ЦП (ядер): https://nodejs.org/docs/latest/api/cluster.html. Если вы напишите свой код таким образом, то вам поможет наличие большего количества вычислительных единиц.

Существует одно предупреждение, в котором вычислительные единицы EC2 детализированы для экземпляра .В некоторых случаях вы можете получить больше «вычислительных единиц» на виртуальное ядро.Поэтому, если вы выберете экземпляр с 2 вычислительными единицами на виртуальное ядро ​​ по сравнению с экземпляром, у которого по одному на ядро ​​, вы сможете выполнить узел на ЦП с большим количеством вычислительных блоков.Тем не менее, похоже, что после 2 вычислительных блоков вычислительная мощность распределяется на ядро ​​, что означает, что вы не получите никакой пользы от нескольких ядер.

5 голосов
/ 22 сентября 2011

Концепция Amazon «общие вычислительные единицы EC2» для типа экземпляра не отображается напрямую на процессор или ядро. Это количество ядер, умноженное на скорость каждого ядра в вычислительных единицах EC2 (их собственные относительные измерения).

Amazon перечисляет, сколько виртуальных ядер имеет каждый тип экземпляра:

http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/index.html?instance-types.html

Ваш лучший вариант - использовать все ядра, на что указывают другие. Однако, если вы получите однопоточное решение, вам следует сосредоточиться на скорости отдельных ядер, а не на общих вычислительных единицах EC2 всех ядер, добавленных вместе.

2 голосов
/ 29 марта 2012

В Node.js, ваш код является однопоточным, но вызовы, которые, например, обращаются к файловой системе или серверу базы данных, не используют основной поток node.js.Основной поток продолжает выполняться, в то время как другие потоки ожидают чтения 4 ГБ с диска в ОЗУ или для того, чтобы сервер БД возвратил ответ.После завершения действия предоставленный обратный вызов помещается в очередь для выполнения в основном потоке.В любом случае, более или менее.

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

Более того, вы должны сравнить свой конкретный пример использования на EC2 - несколько процессоров могут быть полезны при запуске одного экземпляра узла, если приложение выполняет много операций ввода-вывода.

2 голосов
/ 21 февраля 2012

Если у меня работает сервер узлов на экземпляре amazon EC2 с 4 вычислительными блоками EC2, будет ли он работать быстрее / обрабатывать большую нагрузку, чем если бы у меня было 2 вычислительных блока EC2?

Нет, если вы используете node.js в качестве сервера, у вас будет доступ только к одному ядру.

var http = require('http');
    http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(1337, "127.0.0.1");
console.log('Server running at http://127.0.0.1:1337/');

Создает одного слушателя, но это не означает только одно соединение. Таким образом, Node.js нарушает привычные представления. Цикл событий не будет блокировать соединения, если вы не написали неправильный код. Этот пост помогает объяснить цикл событий и насколько важно его понять. Мне потребовалось некоторое время, чтобы действительно «понять» последствия.

Требует ли загрузка ЦП на amazon многопоточной программы для полного использования всех ресурсов?

Да, правильно настроенный apache / nginx будет использовать преимущества конфигураций с несколькими процессорами. Серверы node.js разрабатываются , которые также будут использовать преимущества таких конфигураций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...