Использование процессора Node.js на Amazon EC2

Видно, как node является однопоточным. Если у меня есть сервер node, запущенный на экземпляре EC2 Amazon с 4 вычислительными модулями EC2, будет ли он работать быстрее или обрабатывать больше нагрузки, чем если бы у меня было 2 EC2 Compute units?

Используется ли загрузка процессора на амазонке, чтобы программа была многопотоковой, чтобы полностью использовать все ресурсы?

+19
источник поделиться
5 ответов

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

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

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

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

+10
источник

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

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

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

На практике это простая и простая в использовании защита. Назад в Node.JS v0.6.X модуль "cluster" был интегрирован в стандартный дистрибутив, что упростило настройку нескольких рабочих node, которые могут прослушивать один порт. Обратите внимание, что этот "кластерный" модуль не совпадает с модулем "cluster" для обучения, который имеет другой 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);
}
+15
источник

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

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

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

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

+4
источник

Если у меня есть сервер node, запущенный на экземпляре EC2 Amazon с 4 EC2 Compute, будет ли он работать быстрее/обрабатывать больше нагрузки, чем если бы у меня было 2 EC2 Compute units?

Нет, если вы используете 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 нарушает обычную мысль таким образом. Событие Loop не будет блокировать соединения, если вы неправильно кода. Этот пост помогает объяснить цикл событий и насколько важно это понимать. Потребовал мне время, чтобы действительно "понять" последствия.

Используется ли загрузка процессора на амазонке, чтобы программа была многопотоковой, чтобы полностью использовать все ресурсы?

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

+2
источник

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

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

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

+2
источник

Посмотрите другие вопросы по меткам или Задайте вопрос