2014-02-18 4 views
5

Я создал тест с JMeter для тестирования производительности платформы Google Ghost. Ghost написан в Node.js и был установлен на облачном сервере с 1 Гб оперативной памяти, 1 процессор.Node.js Балансировка нагрузки процессора

Я заметил, что после 400 одновременных пользователей JMeter получает ошибки. До 400 одновременных загрузок пользователей в норме. Я решил увеличить процессор и добавил 1 процессор.

Но ошибки воспроизведены и добавлены 2 процессора, всего 4 процессора. Проблема возникает после 400 одновременных пользователей.

Я не понимаю, почему 1 процессор может обрабатывать 400 пользователей и те же результаты с 4 процессорами.

Во время мониторинга я заметил, что только один процессор занят, а еще 3 процессора простаивают. Когда я проверяю сводку JMeter на консоли, были ошибки, около 5% запроса. См. Снимок экрана.

CPU Utilisation

Я хотел бы знать, можно ли сбалансировать нагрузку между процессорами?

+4

вы также можете проверить лимит открытого файла на 'ulimit -n'. Это ограничивает количество узлов параллельных запросов. Вы можете увеличить его (для локальной сессии) с помощью 'ulimit -n 10000'. Чтобы создать кластер ваших процессов призрачного сервера, вы можете попробовать pm2. Просто установите pm2 с 'npm install pm2 -g' и' pm2 start .js' –

+0

Проблема частично решена. Вот шаги и результаты, которые я получил: 1. Изменен ulimit до 10000. Результат: никаких изменений. 2. Включен модуль кластера узлов. Результат: +200 одновременных пользователей 3. Подстроенный рабочий процесс Nginx.Результат: + 2k одновременных пользователей Я могу предположить, что проблема была с Nginx. Когда я тестировал сервер без кластерного модуля, сервер обрабатывал 2000 пользователей. Я попытаюсь включить кластерный модуль, когда достиг предела. – Bob

ответ

4

Вы используете модуль cluster для балансировки нагрузки и узла 0.10.x?

Если это так, пожалуйста, обновите свой node.js до 0.11.x.

Узел 0.10.x использовал алгоритм балансировки, предоставляемый операционной системой. В 0.11.x алгоритм was changed, поэтому он будет более равномерно распределен с этого момента.

2

Node.js классно однопоточен (см. this answer): процесс с одним узлом будет использовать только одно ядро ​​(см. this answer для более углубленного изучения), поэтому вы видите, что ваша программа полностью использует одно ядро , и что все остальные ядра простаивают.

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

Однако вы не можете использовать это без фиксации кода Ghost. Опция заключается в использовании pm2, который может обернуть программу узла, используя для этого модуль кластера. Например, с четырьмя ядрами:

$ pm2 start app.js -i 4 

В теории это должно работать, если только Дух полагается на некоторых глобальных переменных (которые не могут быть разделены каждым процессом).

+0

Альтернатива pm2 для автоматического использования большего количества ядер запускает приложение узла через Phusion Passenger - https://github.com/phusion/passenger/wiki/Phusion-Passenger%3A-Node.js-tutorial#wiki-maximum-number -процессы – Karolis

+0

является пассажиром бесплатно или оплачивается? –

1

Используйте кластерное ядро ​​и для балансировки нагрузки nginx. Thats плохая часть about node.js. Фантастическая структура, но разработчик должен войти в беспорядок балансировки нагрузки. В то время как java и другие промежутки времени делают без проблем. Во всяком случае, ничто не идеально.

Смежные вопросы