12

Во-первых, немного фона. Существует множество различных сравнений распределенных систем контроля версий (DVCS), которые сравнивают размер репозитория или скорость тестирования операций. Я не нашел ни одного, который бы оценивал производительность сети различных DVCS, а также различные используемые протоколы ... помимо измерения скорости операций (команд), связанных с сетью типа «клон», «pull»/«fetch» ​​или «push».Как измерить производительность сети (как измерить сетевой протокол)

Хотелось бы узнать, как бы вы сделали такое сравнение; как измерять производительность сети приложения или как оценивать сетевой протокол. Я представляю здесь, среди прочих, также измерение зависимости производительности и пропускной способности сети и времени ожидания (времени пинга) сети; некоторые протоколы жертвуют латентностью в виде более круглых обменов (переговоров) для отправки минимально необходимого окончательного «пакета».

Я бы предпочел решение, включающее только один компьютер, если это возможно. Я хотел бы видеть решения с открытым исходным кодом, работающие в Linux. Но я также хотел бы получить более общие ответы.

Preferred OS: Linux
Предпочтительные языки: C, Perl, сценарий оболочки


Возможные размеры:

  • общее число байтов, переданных от сервера для клиента и от клиента к серверу в одно время ssion; это также может быть использован для измерения накладных расходов протокола (пропускной способности)
  • количество круглых поездок (соединения) в одной транзакции (Задержка)
  • зависимость скорости работы сети (время, необходимое для клонирования/pull/push) от полосы пропускания сети и от задержек сети (время пинга)

Как сделать такие измерения (такие тесты)?


Добавлено 02.06.2009:
Простейший тест (измерение) будет сетевая версия time команды, то команда, которая бежать бы мне число переданных байтов, и количество обходов/сетевых соединений во время выполнения данной команды.


Добавлено 09.06.2009:
Пример мнимая выход для упомянутых выше решения сетевой версии time команды может выглядеть следующим образом:

$ ntime git clone -q git://git.example.com/repo.git 
... 
bytes sent: nnn (nn kiB), bytes received: nnn (nn kiB), avg: nn.nn KB/s 
nn reads, nn writes 

Обратите внимание, что только пример вывода, детализирующий информацию, которую можно было бы получить.


Добавлено 09.06.2009:
Похоже, некоторые из того, что я хочу может быть дружнее с помощью DUMMYNET, инструмент (первоначально) для протоколов тестирования сетей ...

+0

Вы спрашиваете, как получить требуемые данные, чтобы придумать такие тесты для произвольной сетевой программы? – none

+0

Да, я хотел бы получить как минимум количество переданных байтов и, возможно, количество изменений от чтения до записи для данной команды, например время/время для CPU и памяти, и SystemTap iotimes для ввода-вывода. –

+0

Я думаю, что для того, чтобы действительно ответить на ваш вопрос, вы должны в идеале рассказать нам больше о вашей предпочтительной платформе/ОС, а также о вашем предпочитаемом языке программирования. Кроме того, подробный список измерений, который вас интересует, расскажет нам, какой подход наиболее возможен. – none

ответ

15

Если Я правильно понимаю вас, вы в основном заинтересованы в чем-то вроде 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.

5

Возможно ответ будет использовать SystemTap. Среди примеров сценариев есть nettop, который отображает (некоторые из) требуемую сетевую информацию в стиле «сверху», и есть сценарий iotime, который показывает информацию ввода-вывода в требуемой форме.

Смежные вопросы