Нагрузочное тестирование на скорую руку
Если у вас в команде нет тестировщиков, или вы сами тестировщик и очень ленивы, чтобы организовать нормальные тесты через jMeter или ab, но протестировать под нагрузкой свой любимый проект вам очень хочется, то это статья для вас =).
Подготовка
Все производимые далее действия идут с предположением, что у вас стоит один из дистрибутивов Linux Тестирование мы будем проводить с помощью программы siege. В ubuntu ее установить можно командой:
sudo apt-get install siege
Если у вас не ubuntu, попробуйте установить из репозитория вашего дистрибутива с помощью штатных программ (yum, emerge), или скачать отсюда
Siege обладает достаточной функциональностью, чтобы определить максимальную пропускную способность вашего сервера.
$ siege --help
SIEGE 2.68
Usage: siege [options]
siege [options] URL
siege -g URL
Options:
-V, --version VERSION, prints version number to screen.
-h, --help HELP, prints this section.
-C, --config CONFIGURATION, show the current configuration.
-v, --verbose VERBOSE, prints notification to screen.
-g, --get GET, pull down headers from the server and display HTTP
transaction. Great for web application debugging.
-c, --concurrent=NUM CONCURRENT users, default is 10
-u, --url="URL" Deprecated. Set URL as the last argument.
-i, --internet INTERNET user simulation, hits the URLs randomly.
-b, --benchmark BENCHMARK, signifies no delay for time testing.
-t, --time=NUMm TIME based testing where "m" is the modifier S, M, or H
no space between NUM and "m", ex: --time=1H, one hour test.
-r, --reps=NUM REPS, number of times to run the test, default is 25
-f, --file=FILE FILE, change the configuration file to file.
-R, --rc=FILE RC, change the siegerc file to file. Overrides
the SIEGERC environmental variable.
-l, --log LOG, logs the transaction to PREFIX/var/siege.log
-m, --mark="text" MARK, mark the log file with a string separator.
-d, --delay=NUM Time DELAY, random delay between 1 and num designed
to simulate human activity. Default value is 3
-H, --header="text" Add a header to request (can be many)
-A, --user-agent="text" Sets User-Agent in request
Если у вас проблемы с языком Шекспира, то могу рекомендовать статью перевод "Siege — утилита для нагрузочного тестирования веб-серверов"
Что бы увидеть ее в работе сделаем первый тест. Будем симулировать 5 пользователей, которые безостановочно загружают главную страницу в течении одной минуты.
siege -c 5 -b -t 1m http://example.com/
На забудьте изменить url! Незачем ддосить ни в чем не повинный сайт =)
Результат работы будет примерно такой:
** SIEGE 2.68
** Preparing 5 concurrent users for battle.
The server is now under siege...
Lifting the server siege.. done.
Transactions: 20721 hits
Availability: 100.00 %
Elapsed time: 59.72 secs
Data transferred: 131.69 MB
Response time: 0.01 secs
Transaction rate: 346.97 trans/sec
Throughput: 2.21 MB/sec
Concurrency: 4.99
Successful transactions: 20721
Failed transactions: 0
Longest transaction: 0.08
Shortest transaction: 0.02
Наиболее важным параметром является Transaction rate, который показывает, сколько страниц в секунду способен отдавать сервер.
Приближение к реальности
Такое тестирование мягко сказать однобоко и на самом деле мало что показывает. Для того чтобы приблизить к реальной ситуации брожения по страничкам, мы воспользуемся логом сервера. И выдернем из него все url запросов. У меня получился такой вот скрип на bash:
cat access.log | grep -o -P '(GET|POST) .* HTTP'| awk '{print "http://example.com"$2}'| sort -u | grep -v -P -i '(admin)' >> /tmp/urls.txt
Разберем его поподробнее:
**cat access.log** - выводит лог, где на месте access.log должен быть путь к логу доступа apache
**grep -o -P '(GET|POST) .* HTTP'** - ищем с помощью регулярного выражения url
**awk '{print "http://example.com"$2}'** - удаляем шум, добавляем имя хоста (**http://example.com замените на свое**)
**sort -u** - сортируем, удаляем дубликаты
**grep -v -P -i '(admin)'** - фильтруем url, по которым ходить не надо с помощью регулярных выражений
Для фильтрации статики, можно применить: **grep -v -P -i '\.(css|js|jpg|png|gif|txt)$' **
**>> /tmp/urls.txt** - отправляем результат в файл
В результате получаем файл, содержащий множество реальных url. По которым можно побродить. Приводим нашу команду к такому виду:
siege -c 5 -b -t 1m -f /tmp/urls.txt
Выполняем и радуемся результату (или огорчаемся и идем ковырять исходники). О том как прикрутить авторизацию, поговорим в следующий раз