Если Я правильно понимаю вас, вы в основном заинтересованы в чем-то вроде Linux 'strace' (Introduction) для сетевых вызовов?
Возможно, комбинация профилировщика и отладчика для сетевых приложений (т. Е. «Ntrace»), предоставляя подробный анализ различных необязательных измерений?
В Linux, утилита strace в значительной степени основана на функциональности, предоставляемой в ядре Linux, а именно ptrace (process tracing) API:
Использование ptrace, должно быть возможным, чтобы получить большую часть данных, которые вы заинтересованы в.
В Windows, вы, вероятно, захотите взглянуть на detours, чтобы перехватывать/перенаправлять API Winsock для целей проверки/бенчмаркинга.
Если вам действительно не нужна вся информация о низком уровне, возможно, вы также можете напрямую использовать strace (on linux) и использовать его только для отслеживания определенных системных вызовов, например, рассмотрите следующую строку, которая будет отслеживать только вызовы к открытому (Использование системного вызова дополнительного параметра -o FILE, вы можете перенаправить вывод в выходной файл):
strace -e trace=open -o results.log
передавая дополнительный флаг -v в Трассирование, вы можете увеличить его многословие, чтобы получить Дополнительная информация (при работе с SCM, такими как git, которые состоят из множества небольших утилит оболочки и автономных инструментов, вы, вероятно, также захотите изучить использование -f флаг, чтобы также следить за forked-процессами).
Итак, что вы были бы заинтересованы, это все системные вызовы, которые связаны с sockets, а именно:
- принимают
- связывают
- подключить
- getpeername
- getsockname
- getsockopt
- слушать
- RECV
- recvfrom
- отправить
- SendTo
- setsockopt
- выключение
- гнездо
- socketpair
(в самом начале, вы, вероятно, только хочу изучите вопросы отправки .../recv ... звонков, хотя)
Для упрощения этого, вы можете также использовать «сеть» в качестве параметра для отслеживания, который будет отслеживать все связанные с сетью вызовов:
-e след = сеть: Трассировка все сети, связанные системные вызовы.
Таким образом, соответствующий Трассирование вызов может выглядеть следующим образом:
strace -v -e trace=accept,bind,connect,getpeername,getsockname,getsockopt,listen,recv,recvfrom,send,sendto setsockopt,shutdown,socket,socketpair -o results.log -f git pull
Когда программа закончит работу, вы будете тогда в основном хотят, чтобы просмотреть файл журнала для оценки данных, это может быть легко достигнута с помощью регулярных выражений.
Например, при выполнении следующих действий в Linux-оболочки: strace -v -o wget.log -e trace=connect,recv,recvfrom,send,sendto wget http://www.google.com
Полученный файл журнала содержит сообщения, подобные этим:
- Recv (3, «HTTP/1.0 302 Найдено \ г \ nLocation: htt "..., 511, MSG_PEEK) = 511
- sendto (4," \ 24 \ 0 \ 0 \ 0 \ 26 \ 0 \ 1 \ 3^\ 206 * J \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 "..., 20, 0, {sa_family = AF_NETLINK, pid = 0, groups = 00000000}, 12) = 20
Рассматривая страницы руководства для этих двух системных вызовов, очевидно, что 511 и соответственно 20 - это количество передаваемых байтов.Если вам также необходимы подробная информация синхронизации, вы можете передать флаг -T в Трассировании:
-T - время печати, проведенном в каждом системного вызова
Кроме того, вы можете получить некоторые статистические данные, передавая флага -c:
-c: Рассчитать время, вызовы и ошибки для каждого системного вызова и сообщить сводку по программе выход. В Linux это пытается показать системное время (время работы процессора в ядре) независимо от времени настенных часов. Если -c используется с -f или -F (ниже), сохраняются только совокупные итоговые суммы для всех отслеживаемых процессов.
Если вам также необходимо изучить фактические данные, обработанные, вы можете посмотреть в спецификаторов чтения/записи:
-e чтения = набор: Выполнить полный шестнадцатеричный и ASCII дамп всех данные, считанные из файла дескрипторов, перечисленных в указанном наборе. Например, чтобы увидеть всю активность ввода в файле , дескрипторы 3 и 5 используют -e read = 3,5. Обратите внимание, что это не зависит от обычной трассировки системного вызова read (2), который контролируется опцией -e trace = read. -e write = set: выполнить полный шестнадцатеричный и ASCII дамп всех данных, записанных в файл дескрипторов, перечисленных в указанном наборе. Например, чтобы увидеть всю выходную активность в файле , дескрипторы 3 и 5 используют -e write = 3,5. Обратите внимание, что это не зависит от обычной трассировки системного вызова write (2), который контролируется опцией -e trace = write.
Вы также можете настроить максимальную длину строки:
-s strsize: Укажите максимальный размер строки для печати (по умолчанию 32). Обратите внимание, что имена файлы не считаются строками и всегда печатаются в полном
Или строки архивируются шестнадцатеричным:
-XX: Распечатать все строки в шестнадцатеричном формате строка.
Так что, используя strace для большей части этого, кажется хорошим гибридным подходом, потому что это очень легко сделать, но при этом имеется достаточное количество информации о низком уровне, если вы обнаружите, что вам нужен дополнительный низкий уровень вы можете рассмотреть возможность расширения strace или подачи соответствующих запросов функций с помощью strace project on sourceforge.
Однако, размышляя об этом более менее сложном и более платформенно-агностическом способе реализации довольно простого теста сетевого трафика, было бы использовать некоторую форму промежуточного уровня между клиентом и фактическим сервером: сервер, который в основном замеряет, анализирует и перенаправляет трафик на реальный сервер.
Очень похоже на прокси-сервер (например, SOCKS), так что весь трафик туннелируется через анализатор, который, в свою очередь, может накапливать статистику и другие показатели.
Базовая версия чего-то подобного может быть легко скомбинирована только с использованием netcat и некоторых сценариев оболочки, однако более сложные версии могут использовать использование perl или python.
Для реализации сервера SOCKS на python вы можете посмотреть pysocks.
Кроме того, есть конечно twisted для питона:
Twisted является управляемыми событиями сетевого движка написанного на Python и под лицензией MIT.
Если вам нужна информация более низкого уровня, вы, вероятно, действительно захотите изучить перехватывание системных вызовов.
Если вам также нужны данные эффективности эффективности протокола, вы можете посмотреть в tcpdump.
Вы спрашиваете, как получить требуемые данные, чтобы придумать такие тесты для произвольной сетевой программы? – none
Да, я хотел бы получить как минимум количество переданных байтов и, возможно, количество изменений от чтения до записи для данной команды, например время/время для CPU и памяти, и SystemTap iotimes для ввода-вывода. –
Я думаю, что для того, чтобы действительно ответить на ваш вопрос, вы должны в идеале рассказать нам больше о вашей предпочтительной платформе/ОС, а также о вашем предпочитаемом языке программирования. Кроме того, подробный список измерений, который вас интересует, расскажет нам, какой подход наиболее возможен. – none