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 приложений, все полученные данные записываются в плоский файл ответов.

Авторы

  • Евгений Мамчиц

Лицензия

Исходный код приложения распространяется под открытой лицензией LGPL.

Инсталляция

Сборка 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?

Расширение функционала

Примеры использования

Бинарные данные в текстовом протоколе

SSL транспорт

Изменения