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, разобраться как оно работает внутре, отпилить ненужное, заюзать. В процессе.

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

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

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

Архив записей в блогах:
окончание. Начало: https://uborshizzza.livejournal.com/5716945.html Пять сезонов Дин и Сэм Винчестеры пытались предотвратить Апокалипсис. Отец их погиб. Но Апокалипсис все приближался. Братья узнали, что должны сражаться друг с другом. Для них это было невозможно, так как они очень ...
За незаконную тонировку будут снимать номера С 1 июля 2012 года за эксплуатацию автомобилей с тонированными стеклами, не соответствующими установленным нормативам, помимо штрафа в 500 рублей будет предусмотрено снятие номерных знаков. Такое ...
Температура за окном скачет: то +19, то +8 и заморозки по ночам. Вчера и сегодня по +19, завтра уже +13, в воскресенье +5. Поэтому на свой традиционный апрельский рассвет я выбралась сегодня утром. Еще не все зацвело, но миндаль и сакура - по полной! Место - конечно, Петршинские ...
Сегодня поступило несколько важных сигналов: 1. Поступает информация о том, что готовится так называемая "точечная частичная мобилизация" с уклоном в милитаризацию "сектора предприятий". В соответствии с планом мобилизации предприятия должны будут условно "гарантировать" путь ...
Демократия, это народовластие. Народовластие, это прежде всего власть законов, потому как народу прежде всего нужен закон и порядок, во всей его деятельности. Но так как в государстве существует денежная система народовластие невозможно, потому как там где деньги, там и власть. Конечно, ...