Как использовать ApacheBench для нагрузочного тестирования на Ubuntu 13.10 VPS
Введение
Нагрузочное тестирование — хорошая идея перед любым развертыванием. Приятно быстро определить наилучший сценарий для проекта, прежде чем запускать более подробные тесты в будущем.
Инструмент ApacheBench (ab) может загружать тестовые серверы, отправляя произвольное количество одновременных запросов. Хотя ab был разработан для тестирования установок Apache, его можно использовать для тестирования любого HTTP-сервера.
В этом уроке мы увидим, как интерпретатор Ruby с разными серверами работает под нагрузкой. Шаги руководства предполагают свежий образ Ubuntu 13.10 x32. Результаты были получены из капли размером 512 МБ.
Монтаж
Обновите базу данных пакетов.
apt-get update
Установите пакет apache2-utils, чтобы получить доступ к ApacheBench.
apt-get install apache2-utils
Пользователь с ограниченными правами
Затем создайте пользователя, который будет управлять Ruby. Не рекомендуется запускать некоторые команды из следующего раздела от имени пользователя root.
useradd -m -d /home/test -s /bin/bash -g sudo test
Что делает эта команда:
- useradd - создать нового пользователя
- -m - создать домашний каталог
- -d /home/test — установить домашний каталог пользователя в /home/test
- -s /bin/bash — сделать bash оболочкой пользователя по умолчанию (Ubuntu по умолчанию использует тире)
- -g sudo — добавить пользователя в группу sudo (для запуска команд с помощью sudo)
- test - имя нового пользователя
Установите пароль для нового пользователя.
passwd test
Переключитесь на нового пользователя.
su test
РВМ
Менеджер версий Ruby упрощает работу с различными средами Ruby. Он заботится об установке определенных версий Ruby и изоляции гемсетов. В настоящее время он устанавливается путем запуска скрипта bash с их веб-сайта.
\curl -L https://get.rvm.io | bash -s stable
Чтобы использовать команду rvm, вам нужно сначала запустить скрипт rvm.
source ~/.rvm/scripts/rvm
Если вы хотите, вы можете поместить его в свой .bashrc, чтобы rvm был доступен в любое время, когда вы входите в систему как пользователь.
echo "source ~/.rvm/scripts/rvm" >> ~./bashrc
Вы можете убедиться, что сценарий rvm используется, проверив заголовок типа. Это должна быть функция, а не хэш.
type rvm | head -1
rvm is a function
Затем установите Ruby 2.0.0. RVM запросит пароль пользователя, потому что ему необходимо установить ряд зависимостей, прежде чем он сможет создать Ruby. Поскольку RVM собирает Ruby из исходного кода, этот шаг может занять некоторое время.
rvm install 2.0.0
Переключитесь на новый Ruby. Это может произойти по умолчанию после установки, но проверка не помешает.
rvm use 2.0.0
Тестирование
Теперь, когда Ruby установлен, вы можете создать простой сайт и посмотреть, сколько запросов он может обработать.
Установите Синатру. Это микрофреймворк/DSL для создания веб-приложений Ruby. Флаги --no-* пропускают документацию.
gem install sinatra --no-rdoc --no-ri
Создайте пример приложения Sinatra, которое просто повторяет \hello world.
cd ~
vim app.rb
# app.rb
require 'sinatra'
get '/' do
'hello world'
end
Запустите сервер.
ruby app.rb
Когда сервер, наконец, запущен, вы можете начать нагрузочное тестирование. Вызов ab выглядит так:
ab -n <num_requests> -c <concurrency> <addr>:<port><path>
Откройте другой терминал и снова подключитесь к серверу по ssh. Запустите тест с ApacheBench. Я использовал 1000 запросов с параллелизмом 100. Не забудьте последний «/» для пути.
ab -n 1000 -c 100 http://localhost:4567/
Server Software: WEBrick/1.3.1
Server Hostname: localhost
Server Port: 4567
Document Path: /
Document Length: 11 bytes
Concurrency Level: 100
Time taken for tests: 3.410 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 288000 bytes
HTML transferred: 11000 bytes
Requests per second: 293.23 [#/sec] (mean)
Time per request: 341.034 [ms] (mean)
Time per request: 3.410 [ms] (mean, across all concurrent requests)
Transfer rate: 82.47 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 2.0 0 11
Processing: 185 332 90.3 311 578
Waiting: 28 280 83.2 267 574
Total: 193 333 89.7 311 578
Percentage of the requests served within a certain time (ms)
50% 311
66% 357
75% 423
80% 446
90% 467
95% 480
98% 490
99% 501
100% 578 (longest request)
Мои результаты сошлись около 300 запросов в секунду. WEBrick не известен своей скоростью. Продолжайте и прервите сервер с помощью Ctrl-c.
Установить тонкий
Thin — популярный рубиновый веб-сервер, который использует Mongrel для синтаксического анализа и EventMachine для неблокирующего ввода-вывода. Установите Thin и снова запустите сервер. Синатра должен автоматически загрузить Thin и сообщить вам об этом («…с резервной копией от Thin»).
gem install thin
ruby app.rb
Теперь повторите нагрузочный тест. На этот раз должно быть немного быстрее.
Server Software: thin
Server Hostname: localhost
Server Port: 4567
Document Path: /
Document Length: 11 bytes
Concurrency Level: 100
Time taken for tests: 1.339 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 244000 bytes
HTML transferred: 11000 bytes
Requests per second: 747.00 [#/sec] (mean)
Time per request: 133.870 [ms] (mean)
Time per request: 1.339 [ms] (mean, across all concurrent requests)
Transfer rate: 178.00 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 1.8 0 8
Processing: 55 128 19.9 132 155
Waiting: 42 116 19.7 121 144
Total: 62 129 18.5 132 156
Percentage of the requests served within a certain time (ms)
50% 132
66% 135
75% 137
80% 139
90% 144
95% 149
98% 152
99% 155
100% 156 (longest request)
По крайней мере, в этом случае похоже, что Thin обеспечивает заметно более быстрый сервер, чем WEBrick, со скоростью более 700 запросов в секунду (вы можете попробовать увеличить общее количество запросов, но для меня это не стало намного выше).
Примечание. Мне удалось получить 1000 запросов в секунду на дроплете Arch Linux.
Заключение
Очевидно, что эти результаты не отражают реальную производительность сервера. HTTP — это всего лишь одна часть головоломки. Медленный механизм шаблонов и/или база данных значительно уменьшат эти цифры. Тем не менее, это дает вам быструю приблизительную цифру для сравнения.
Другие инструменты повышения производительности, которые могут вас заинтересовать:
- httpperf
- вес
- httpпресс
- осада
- JMeter
- турбус