09.09 2010

Если у вас в команде нет тестировщиков, или вы сами тестировщик и очень ленивы, чтобы организовать нормальные тесты через 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

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

comments powered by Disqus