Phantom Doc - Документация и примеры использования¶
Author: | Gregory Komissarov |
---|---|
Version: | 0.0.1 |
Date: | December 05, 2016 |
Homepage: | Phantom Doc Homepage |
Download: | Phantom Doc on GitHub |
Documentation: | PDF Documentation |
License: | BSD License |
Support: | Google Group |
Issue tracker: | GitHub Issues |
Что такое Phantom¶
Phantom является приложением с открытым исходным кодом, которое может выступать в роли Web сервера, прокси сервера и генератора нагрузки c акцентом на высокую производительность, малое потребление ресурсов и точность выходных данных. Выпускается под лицензией LGPL, работает на операционной системе GNU Linux.
Особенности¶
Точные и прогнозируемые результаты измерений¶
Тестовый сценарий описывает подаваемую нагрузку с точностью до миллисекунды до байта передаваемой информации.
Сложные выходные данные собираются в простом формате¶
План теста и результат представляют собой плоские текстовые файлы, с которыми можно работать любым удобным способом.
Выходной результат содержит следующие данные:
- Размер отправленной и полученной информации
- Время потраченое на соединение, отправку, обработку запроса и получение ответа
- Отслеживание ошибок как на транспортном уровне так и на уровне протоколов приложений.
Распределённость и маштабирование¶
Вы можете сгенерировать выходную нагрузку
~40K HTTP rps
используя одну копию приложения(использующую дочерние процессы) на одном сервереПроцессы генератора нагрузки могут работать параллельно и не зависят друг от друга, что позволяет маштабировать нагрузку горизонтально.
Возможность изменять и дополнять¶
Фантом имеет модульную структуру, что позволяет расширять базовый фукционал новыми протоколами, например таким как SSL.
Предпосылки¶
Аналогичные решения¶
Прямое сравнение нижеперечисленных программных продуктов с Фантомом не имеет смысла т.к. последний не обладает функционалом по работе с сущностями предметной области(протоколы уровня приложений), не занимается представлением данных в удобном для восприятия человеком виде и не решает вопросы централизованного хранения и организации доступа к полученным результатам, но это и не входит в его обязаности т.к. он - I/O Engine.
Свободно распространяемые¶
Проприетарные¶
Предоставляемые в виде сервиса¶
Ограничения¶
- Сценарий теста и входные дынные формируются до начала теста, то есть, невозможно совершить следующие действия: сходить на сайт и получить куку в заголовке HTTP ответа, после чего, в том же тесте отправить запрос с этой кукой в заголовке.
- Phantom не интерпретирует полученый JS код, не рендерит CSS стили, не выполняет запуск Flash приложений, все полученные данные записываются в плоский файл ответов.
Авторы¶
- Евгений Мамчиц
Инсталляция¶
Сборка deb пакета на основе исходного кода¶
На данный момент сборка приложения реализована и протестирована под серверный дистрибутив Ubuntu LTS(GNU Linux), именно о нём и пойдёт речь в дальнейшем.
Устанавливаем необходимые пакеты:
$ apt-get install devscripts debhelper libssl-dev binutils-dev binutils-dev
Копируем последнюю ревизию кода из репозитория:
$ git clone git://github.com/mamchits/phantom.git; cd phantom
Если версия дистрибутива Ubuntu Linux старше чем 12 LTS: 8.04, 10.04, необходимо наложить небольшой патч:
$ cat > phantom_deb_control_ssl_ver.patch <<EOF
7c7
< libssl-dev (>= 0.9.8m-1),
---
> libssl-dev (>= 0.9.8),
EOF
$ patch --ignore-whitespace debian/control < phantom_deb_control_ssl_ver.patch
Собираем и устанавливаем пакет:
$ debuild -us -uc
$ cd ..; dpkg -i phantom-ssl_* phantom_*
Проверяем результат установки пакета:
# В списке установленных пакетов должны быть только что собранные нами
$ dpkg -l | grep -i phantom
# Слинкованые файлы должны быть найдены
$ ldd `which phantom`
# В STDOUT должна быть выведена справка по разделу конфига
$ phantom syntax /usr/lib/phantom/mod_io_benchmark{,_method_stream{,_ipv4,_ipv6,_source_random,_source_log,_proto_http}}.so
Предыдущие команды должны быть выполнены без ошибок. Ожидаемый вывод
На данном этапе мы имеем проинсталированный и готовый к работе Phantom, переходим к выполнению первого пробного теста в разделе Быстрый старт.
Быстрый старт¶
Smoke test¶
Копируем код из репозитория
git clone git://github.com/greggyNapalm/phantom_doc.git
открываем два терминала и в обоих переходим в каталог с тестом
cd phantom_doc/examples/smoke
- В первом терминале
запускаем простой HTTP сервер, он будет возвращать листинг текущей директории в ответ на запрос
$ python -m SimpleHTTPServer
- Во втором терминале
проверяем, что процесс успешно забиндил сокет и слушает его:
$ netstat ntpl | grep 8000
сделаем пробный запрос любой удобной утилитой:
$ curl -v "http://localhost:8000/"
ответ не должен быть пустым, статус код HTTP ответа должен быть
200
.Проверяем на синтаксическую корректность конфиг стрельбы
$ phantom check phantom.conf
Если в STDOUT выводится переформатированное содержимое файла phantom.conf - файл прошёл синтаксическую проверку, в ином случае будут указаны ошибки, которые нужно исправить.
Запускаем тест
$ phantom run phantom.conf
Вывод терминала с запущеной стрельбой должен быть примерно следующим:
2012-04-27 13:48:31.052 +0400 [info] phantom Start
time 2012-04-27 13:48:33 +0400 (total)
** benchmark_io
HTTP 200:2
network 0:2
times 45:2
overall 2008 0 17.91% 168 83 1332 663 2 0
tasks 1
source_log 0
2012-04-27 13:48:33.061 +0400 [error] brief_logger bq_sleep: Operation canceled
2012-04-27 13:48:33.072 +0400 [error] bencmark_logger bq_sleep: Operation canceled
2012-04-27 13:48:33.074 +0400 [info] phantom Exit
Терминала с запущеным Web сервером:
$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
localhost - - [27/Apr/2012 13:27:03] "GET / HTTP/1.1" 200 -
localhost - - [27/Apr/2012 13:27:10] "GET / HTTP/1.1" 200 -
Таким образом оба наших HTTP запроса описанных в файле ammo.stpd
обработаны успешно, результат теста сохранён в файлах: answ.txt
, phout.txt
, phantom_stat.log
.
Для детального разбора результатов можно обратиться к разделу Анализ выходных данных.
Конфигурация Phantom¶
phantom.conf¶
Конфиг можно разбить на несколько секций:
module_setup = setup_module_t¶
Директива определяющая список подгружаемых модулей. В зависимости от решаемой задачи набор модулей должен быть различным, Фантом может работать как в режиме клиента, так и сервера, реализована поддержка различных протоколов сетевого уровня(ipv4, ipv6), транспортного уровня(TCP, SSL).
Имя модуля Назначение io_benchmark модуль клиента io_benchmark_method_stream режим клиента io_benchmark_method_stream_ipv4 поддержка ipv4 io_benchmark_method_stream_ipv6 поддержка ipv6 io_benchmark_method_stream_source_log использование текстового файла с входными данными(запросами) io_benchmark_method_stream_proto_http подключение http протоколлера io_benchmark_method_stream_transport_ssl поддержка SSL
main_scheduler = scheduler_simple_t¶
описание планировщика, сколько и каких ресурсов он будет использовать, дискретность подаваемой нагрузки в миллисекундах.
stat¶
описание статистики собираемой в файлphantom_stat.log
формат и назначение которого нужно уточнить.
benchmark_io = io_benchmark_t¶
описание клиентской части(генератора нагрузки), в рамках данного руководства возможности Фантома как сервера не рассматриваются.
logger_t bencmark_logger¶
куда и как писать ответы тестируемого приложения.
logger_t brief_logger¶
куда и как писать агрегированную статистику ответов тестируемого приложения.
source_t source_log = source_log_t¶
входные данные для теста.
transport¶
какой протокол транспортного уровня использовать, величина таймаута.
Примеры готовых конфигурационных файлов:¶
ammo.stpd¶
Содержит план нагрузки: что и когда будет отправлено во время выполнения теста.
размер фрагмента в байтах
|
| момент времени (кол-во миллисекунд от начала теста) в который данные должны быть отправлены
| |
| | Тег конкретного запроса, можно использовать при агрегации результатов.
| | |
| | |
/\ | |
_ 84 1000 api 1000<LF>
/ GET / HTTP/1.0<CR><LF>
/ User-Agent: phantom_14/1.2.3<CR><LF>
запрос --------| Host: 127.0.0.1<CR><LF>
\ Connection: Close<CR><LF>
\_ <CR><LF>
разделитель ------> <LF>
84 2000<LF>
GET / HTTP/1.0<CR><LF>
User-Agent: phantom_14/1.2.3<CR><LF>
Host: 127.0.0.1<CR><LF>
Connection: Close<CR><LF>
<CR><LF>
разделитель ------> <LF>
конец файла ------> 0
Анализ выходных данных¶
answ.txt¶
Содержит полную информацию о всех запросах и ответах
Рассмотрим лог ответов smoke теста
<CR><LF>
они же \r\n
- разделители полей HTTP протокола, являются частью HTTP запроса и ответа, их Phantom не модифицирует.
<LF>
он же \n
- разделитель запросов и ответов, его вставляет Phantom.
размер запроса в байтах
|
| размер ответа в байтах
| |
| | длительность временного интервала между отправкой запроса и получением ответа(rtt) в микросекундах
| | |
| | | время ожидания ответа в микросекундах
| | | |
| | | | код ошибки C runtime library, он же errno
| | | | |
/\ / \ / \ / \ |
_ 84 666 809 589 0<LF>
/ GET / HTTP/1.0<CR><LF>
/ User-Agent: phantom_14/1.2.3<CR><LF>
запрос --------| Host: 127.0.0.1<CR><LF>
\ Connection: Close<CR><LF>
\_ <CR><LF>
разделитель ------>_ <LF>
/ HTTP/1.0 200 OK<CR><LF>
/ Server: SimpleHTTP/0.6 Python/2.5.2<CR><LF>
/ Date: Fri, 27 Apr 2012 11:07:13 GMT<CR><LF>
/ Content-type: text/html<CR><LF>
/ Content-Length: 527<CR><LF>
/ <CR><LF>
/ <title>Directory listing for /</title>
/ <h2>Directory listing for /</h2>
/ <hr>
/ <ul>
ответ --| <li><a href="1.conf">1.conf</a>
\ <li><a href="ammo.stpd">ammo.stpd</a>
\ <li><a href="answ.txt">answ.txt</a>
\ <li><a href="bootstrap.sh">bootstrap.sh</a>
\ <li><a href="phantom.conf">phantom.conf</a>
\ <li><a href="phantom_current.conf">phantom_current.conf</a>
\ <li><a href="phantom_no_ssl.conf">phantom_no_ssl.conf</a>
\ <li><a href="phantom_stat.log">phantom_stat.log</a>
\ <li><a href="phout.txt">phout.txt</a>
\ <li><a href="trash/">trash/</a>
\ </ul>
\_ <hr>
разделитель ------> <LF>
phout.txt¶
Содержит агрегированные данные по всем ответам
тег, строка, атрибут каждого запроса, берётся из ammo файла
|
| длительность временного интервала между отправкой запроса и получением ответа(rtt) в микросекундах
| |
| | время, потраченное на установление соединения в микросекундах(FIXME: tcp handshake?)
| | |
| | | время отправки запроса в микросекундах
| | | |
| | | | время генерации ответа на стороне сервера в микросекундах
| | | | |
| | | | | время ожидания ответа в микросекундах
| | | | | |
| | | | | | время потраченное на исполнение запроса в микросекундах, позволяет оценить погрешность Phantom'а
| | | | | | |
| | | | | | | размер запроса в байтах
| | | | | | | |
| | | | | | | | размер ответа в байтах
| | | | | | | | |
| | | | | | | | | код ошибки C runtime library, он же errno
| | | | | | | | | |
epoch | | | | | | | | | | статус код HTTP протокола
______|_____ | | | | | | | | | | |
/ \ /\ / \ / \ /\ / \ /\ / \ /\ / \ | / \
1335524833.562 809 140 25 575 69 589 84 666 0 200
1335524834.559 907 75 20 768 44 770 84 666 0 200
phantom_stat.log¶
FIXME: format?