tcp/ip connection data play

топ 100 блогов ru_programming01.12.2010 Предыстория
Расширяю тулзу для стресс-тестирования mysql-сервера.
Текущая бета-версия умеет парсить slow-query-log, и проигрывать запросы из него на указанный mysql-сервер.
Чем это может быть полезно?
Допустим, есть у нас production-сервер, что задыхается под нагрузкой. Ложить его нельзя, выключать тоже, случайно заваливать - тем более.t
Задача: оптимизировать mysql/базу, либо протестировать как поведёт себя под нагрузкой сервер на новом железе
Решение: берём тулзу типа mysqldump или xtrabackup, поднимаем клон сервака, берём тулзу, она прогирывает запросы ASAP и выводит статистику, время выполнения.
Играемся с настройками железа, сервака, mysql, наблюдаем за поведением.

Что требуется
Теперь требуется делать тоже самое, но опираясь не на slow-query-log, а на tcpdump/libpcap/аналоги в качестве источника.
Мне требуется:
1) Иметь возможность записать все tcp/ip пакеты, проходящие через определённый интерфейс, отправленные на host:port, при этом host:port - адрес сокета в listen-mode (сокет сервера, которому был сделан socket & bind & listen и accept'ы в цикле), а также пакеты всех tcp/ip сессий, принятых на данный сокет (после accept'а на стороне сервера назначается временный порт на host, через который уже идёт отдельнео клиентское подключение. Вот про такие подключения и идёт речь. Если где заблуждаюсь вдруг - поправьте).
2) Используя (1) мне нужно вычленить отдельные tcp/ip подключения (разбить пакеты по группам, критерий разбиения - tcp/ip сессии - т.е. отдельное подключение)
3) После (2) мне требует разделить сессию на каналы "туда" и канал "обратно". очень важно с привязкой по времени - когда какой пакет проходил (timestamp к каждому ip-пакету)
4) После (3) мне требуется "пересобрать" ip-пакеты в виде списка пакетов с данными + timestamp'ы
in: [timestamp][data length][data buffer], [timestamp][data length][data buffer]
out: ... аналогично ...
В чём отличие от просто записанного tcp/ip дампа - нету системных пакетов типа SYN, ACK, RESET, нету ISN, SN, нету checksum, нету повторной посылки пакетов, в общем, нету системной информации TCP/IP упакованной в IP-пакеты.

Фактически, я хочу получить аргументы команд "send" на стороне клиента и "send" на стороне сервера, с указанием времени вызова.
(timestamp когда вызвали, buffer данные, length длины)
с тем предположением, что "будто бы" эти send всегда отправляли данные целиком.

Требования по памяти и производительности
Мне требутся "на лету" вычленять такие потоки, и потом делать их анализ (параллельно, ясен пень). В tcp/ip подключениях будет mysql binary protocol, мне его нужно парсить, и сразу "проигрывать" на второй сервер (тестовый). Это самый сложный case в данной задаче - фактически, real-time система.
Помимо on-the-fly processing также будет более умеренный case - запись этого счастья в некотором своём формате файл для дальнейшего воспроизведения "проигрывателем".

Надеюсь, не сильно запутал, надеюсь, описал всё корректно .

Неработающие решения
1) Построить tcp-ip прокси. Не выдержит нагрузки - раз, сложно - два, требует интеграции в инфраструктуру - три, начальство отсекло такой вариант - четыре.
2) "просто записать ip-пакеты при помощи tcpdump и не придумывать себе проблемы" - опять не работает. Как минимум, требуется перерабывать данную запись в некоторый формат, для максимально быстрого воспроизведения. Также требуется некоторый анализ, типа указания какие запросы дропать, запросы на какую базу интересует, в сколько подключений запускать (иногда требует "точное" воспроизведение, в том числе с привязкой по каждому подключения и времени - иногда - стессовое, фигачить без разбора ЧЕРЕЗ УКАЗАННОЕ ИЗВНЕ ЧИСЛО ПОДКЛЮЧЕНИЙ). Без пересборки tcp-сессий не обойтись.
3) Написать свой tcp-ip стек (его кусочек) - слишком долго, сложно, и не верю что такого уже нету
4) Взять готовый tcp/ip стек, выдрать кусочек, использовать в задаче. Боюсь, слишком сложно, да ещё и поди привязано к особенностям конкретного стека.
5) Взять PostgreSQL!

Потенциальное решение
Взять tshark, разобраться как оно работает внутре, отпилить ненужное, заюзать. В процессе.

В чём вообще вопрос
Нету ли решения проще? Как решается данная задача? Не верю, что никому не было нужно.

Заранее спасибо.

Оставить комментарий

Архив записей в блогах:
Оберефрейтор 578-го пехотного полка 305-й пехотной дивизии вермахта Ганс Экле. Оберефрейтор 578-го пехотного полка 305-й пехотной дивизии вермахта Ганс Экле на боевой позиции между ...
О, руматы! [Классическим шутерам было свойственно] постоянство игровых объектов. Убитые враги продолжали валяться там, где настигла их смерть. На самом деле, помимо чисто эстетических ("Кровища!" Ромеро (с)) там были и практические соображения. Тот же "Вольфенштейн" был крайне ...
Бродского в моей жизни было мало. В советское время его не печатали, его стихи ходили в самиздате. И как-то так получилось, что до нас с мужем они не дошли. В начале 60-х снесли Зарядье, где мы жили, нас переселили к Речному вокзалу, и все наши литературные связи оборвались. У нас не ...
Ко́декс Американской ассоциации кинокомпаний, также известный как кодекс Хе́йса (англ. Motion Pictures Production Code, Hays Code) — этический кодекс производства фильмов в Голливуде, принятый в 1930 году Ассоциацией производителей и прокатчиков фильмов (ныне Американская ассоциация ...
Одним из известных эпизодов воздушной битвы за Москву является ночной таран немецкого бомбардировщика, который совершил Виктор Талалихин. Этот эпизод, вполне выдающийся, вспоминают часто, так что публикациями он не обделен. Вот и журнал "Военные знания" решил подготовить публикацию, ...