Как измерить издержки TCP / IP без сниффинга? - PullRequest
7 голосов
/ 03 февраля 2010

Мне интересно, существует ли программный способ получения показателя полной пропускной способности, используемой при отправке данных через поток TCP.Так как я не могу знать, как сетевой стек делит поток на пакеты, или когда он отправляет TCP SYN или ACK или многие из тех вещей, которые он делает в фоновом режиме, я могу получить только приблизительную оценку для этого.

Единственное решение, которое я могу придумать, - это на самом деле прослушать интерфейс, но я хотел бы думать, что стек уже может собирать эту статистику для меня.

Это работает на Java под любой Windowsили Linux (конечно, предпочтительнее было бы переносимое решение), но я могу JNI-iize ответить на C / C ++, так что (и вызовы API OS) тоже хороший ответ.Спасибо!

Ответы [ 7 ]

2 голосов
/ 12 апреля 2011

[Специальный ответ для Windows]

В Windows вы можете рассмотреть ETW (Event Tracing for Windows).В целом, ETW - это технология, используемая для предоставления информации о трассировке / ведении журнала в Windows, и большинство программного обеспечения Microsoft уже оснащено поставщиками ETW, которые вы можете использовать.В вашем случае, я думаю, у провайдера Microsoft-Windows-TCPIP есть информация (например, локальный / удаленный адрес и порт, операция, отправленные / полученные байты и т. Д.), Которая может быть полезной для вас.

Например, я смог начать собирать события TCPIP в файл с помощью команды:

logman start MyTcpipLog -p Microsoft-Windows-TCPIP -ets

и остановиться с помощью

logman stop MyTcpipLog -ets

Затем файл MyTcipipLog.etl можно открыть с помощью ряда различных инструментов (например, xperf), но есть API, которые вы можете использовать для самостоятельного анализа этого файла.

Если выЕсли вы хотите сделать это во время выполнения, вы можете создать сеанс ETW "в реальном времени" для обработки событий по мере их поступления.

Если вы новичок в ETW, вот полезная статья о MSDN , которую я использовал.

1 голос
/ 08 марта 2011

Не могу говорить за Windows, но ядро ​​Linux, начиная с 2.6.37, не собирает статистику, которую вы ищете.Статистика для каждого сокета должна быть в struct sock или его потомках, и я не вижу там никаких счетчиков передачи / приема:

http://lxr.linux.no/linux+v2.6.37.3/include/net/sock.h#L224

0 голосов
/ 27 апреля 2011

Вы можете посмотреть на потребление счетчиков Perfmon.Может потребоваться счетчик сетевого интерфейса / текущей полосы пропускания.Вы можете создавать и использовать счетчики производительности из кода .NET.

0 голосов
/ 26 апреля 2011

Должна быть возможность использовать учет контратреков для измерения пакетов и байтов для каждого соединения. Затем информация должна запрашиваться с использованием сокетов netlink. Получите информацию о вашем сокете с помощью getsockname и getpeername и используйте эту информацию для поиска записи отслеживания соединения.

Для этого требуется достаточно свежее ядро, загруженный модуль conntrack и libnetfilter_conntrack.

Кроме того, та же информация доступна в / proc / net / nf_conntrack, но этот файл не следует анализировать слишком часто.

И есть инструмент с именем "conntrack", который дает вам доступ к этой информации из командной строки.

0 голосов
/ 12 апреля 2011

В Linux это довольно тривиальная информация для получения root (просто создайте цепочку сетевого фильтра, соответствующую вашему трафику, вы можете использовать совпадение с идентификатором процесса, например, позже прочитать счетчики, связанные с цепочкой). Делать это с ограниченными разрешениями вполне может быть невозможно.

Не уверен для Windows.

0 голосов
/ 22 октября 2010

Если этот TCP-поток - единственное, что проходит через ваш интерфейс, вы можете просто запросить статистику интерфейса (отправленные / полученные байты) и самостоятельно измерить время (+ выполнить математику).

0 голосов
/ 03 февраля 2010

Ну, TCP - это фиксированный грамм данных, который определяется MTU. Если вы знаете свой MTU, вы можете выяснить, сколько грамм данных вам нужно передать, и TCP следует стандартной модели подтверждения.

Вот хорошая статья , которая поможет определить издержки при передаче данных, включая накладные расходы Ethernet и других уровней стека.

...