20 декабря 2013

Tsung. Нагрузочное тестирование сервера MongooseIM.

Попробую привести очень краткую инструкцию по использованию инструмента tsung для тестирования

Ос клиенткой стороны, на которой запускаются тесты - Ubuntu 12.04. Сервер - неважно какой, лиш бы на нем был запущен и настроен MnongooseIM и к нему был правильно настроенный доступ.

Порядок действий:

Скачать дистрибутив tsung-1.5.0.tar.gz (последняя на данный момент версия) с сайта производителя: http://tsung.erlang-projects.org/dist/

Распаковать.
cd в папку с распакованным tsung
./configure
скорее всего будет ошибка о том, что  не установлен erlang:
configure: error: test Erlang program execution failed
sudo apt-get install erlang
вводим пароль суперпользователя.
соглашаемся на установку, нажав Y и ввод.
ждем.
./configure
теперь должно пройти без ошибок
make
ждем пока все скомпилируется
sudo make install
без sudo будет ошибка

после установки набираем в консоли tsung и видим, что приложение установлено:

По умолчанию путь к конфигурационному файлу и папка для логов: ~/.tsung/
Можем использовать его или задать пути через параметры -f и -l (см скриншот)
Если используем путь по умолчанию, то эту самую папку .tsung нужно создать.

Для запуска тестов все готово. Осталось только создать сценарий. Имя по умолчанию - tsung.xml

Сразу нужно сказать, что для графического представления результатов тестирования нужно установить дополнительные шаблоны perl:

sudo apt-get install gnuplot-nox libtemplate-perl libhtml-template-perl libhtml-template-expr-perl

Рассмотрим такой пример (это слегка отредактированный пример jabber.xml, который идет вместе с tsung в папке examples):

здесь:
строка 5 - клиент, с которого производятся запросы
строка 8 - сервер, на котором установлен MongooseIM, тип подключения - websocket. (На некоторых машинах tsung ругается и я ставил тип tcp - все работает так же ...)

и клиентов и серверов может быть несколько. В данном случае по одному. ip адрес для имени сервера должен быть прописан в /etc/hosts.

строка 11 - адрес того же сервера для мониторинга его нагрузки (память, нагрузка на CPU) и тип монитора. В данном случае это Erlang. Это значит, что на сервере должен быть установлен Erlang (и к серверу должен быть обеспечен доступ по ssh без паролей).

строка 15 - настройки "заселения" пользователей на сервер. Фаз заселения может быть несколько и они могут иметь разные скорость\поведение. В данном случае это значит, что в течении 20 секунд каждую секунду будет подключаться 1 пользователь.

строка 19 - число, которое будет подставляться в конец значений логина и пароля из строк 21 и 22. Имея такую комбинацию из строк 19, 21 и 22 мы получим 20 пользователей с логином от user001 до user0020 и соответствующими паролями. (Такие пользователи должны быть зарегистрированы на сервере. Можно руками через Spark, а можно попросить того, кто умеет делать это с помощью Erlang :))

строка 20 - адрес jabber сервера.
строка 23 - путь к вебсокету (относительно сервера). Часто путь к нему - это "/chat"

строка 26 - сессия. Probability - это вероятность или "вес" сессии. В данном случае сессия одна и это значение равно 100. Когда сессий несколько, то сумма их весов должна быть равна 100.

в строке 27 происходит подключение

строка 28 и все остальные thinktime - это время паузы (простоя) в секундах. Паузы иногда нужны, чтобы дать серверу время обработать запрос а иногда просто, чтобы подключенные пользователи "покурили". (поправьте меня кто-то. если я не прав ...)

строки 30 - 33 авторизация.  (По умолчанию в примере указан метод авторизации plain и я долго не мог подключиться, пока не поменял тип на  sasl plain, за что отдельное спасибо товарищу Piotr Nosek, который ответил на мой вопрос в stackoverflow)

строка 36 - запрос списка контактов

строка 40 - переход  в состояние online (до этого пользователь  в состоянии connected)

строка 45 - отправка сообщения случайному пользователю, который выбирается из списка тезх, чье состояние "online". Данное событие зациклено и повторяется 10 раз (строка 43). Длинна сообщения - 56 символов.

строка 50 - отправка сообщения, но уже случайному пользователю, который в состоянии offline.

строка 55 - отправка приглашения "в друзья" случайному online пользователю. В строке 58 происходит  отправка сообщения presence:subscribe, на которое приглашаемый должен ответить presence:subscribed

строка 62 - отключение от сервера.

Таким образом, каждую секунду к серверу подключается 1 пользователь, авторизируется, запрашивает список контактов, переходит в статус "online", 10 раз посылает случайному online пользователю сообщение из случайных 56 символов, 1 раз посылает случайному offline пользователю сообщение длинной 16 символов, приглашает случайного пользователя в друзья и отключается. Между всеми этими действиями пользователь "ждет" по паре секунд.

У всех запросов есть параметр - ack. Что это такое и как работает - отлично описано здесь. И вообще, документация в целом написана хорошо, но бывают частные случаи, в которых сложно разобраться, имея только документацию.

Итак, сценарий готов. Запускаем тест командой tsung start и ... и никакого чуда. В консоли просто появилось сообщение о пути в папке с логами.

Следить за процессом можно запустив в отдельном терминале команду

watch -n1 tsung status

По завершению теста увидим тут строку Tsung is not started.

Теперь можно посмотреть на результаты. Вот тут нам и пригодятся установленные ранее шаблоны. Переходим в папку с полученными логами:

cd /home/имя_пользователя/.tsung/log/папка_с_логами

и запускаем perl скрипт для генерации html отчета:

perl /usr/lib/tsung/bin/tsung_stats.pl

В результате в папке с логами появится файл и другие связанные с его существованием файлы. Открыв файл в браузере увидим несколько таблиц и графиков с результатами тестирования:



Для проведения простых тестов этого достаточно. Для разных вариантов сценариев, нагрузки и мониторинга нужно читать документацию.





Комментариев нет:

Отправить комментарий