Каждый кадр проходит через несколько буферов при его отправке: буфер приложения, буфер протокола, буфер программного интерфейса и буфер аппаратного интерфейса. Когда вы начнете загружать стек, отправив высокоскоростные данные, вы заполните эти буферы и либо заблокируете, либо потеряете данные. У вас также есть стратегии своевременности и опроса, которые могут повлиять на вашу производительность. Например, используя больший буфер и реже опрашивая, вы можете получить гораздо лучшую производительность, жертвуя при этом задержкой.
TCP оптимизирован для высокоскоростной массовой передачи, а UDP оптимизирован для малой задержки в ядре Linux. Это влияет на размер буфера, а также на то, как данные опрашиваются и передаются. В дополнение к этому у вас часто бывает разгрузка оборудования для TCP. Я ожидал, что TCP будет работать лучше, чем UDP.
Обратите внимание, что отправка высокоскоростных данных по UDP обычно является плохой идеей, если вы не реализуете свой собственный контроль перегрузки. TCP защищает вашу сеть от перегрузок. Используйте UDP, если у вас небольшой объем данных или высокие требования к своевременности.
Проблема в самом iperf. Когда вы отправляете поток UDP, iperf будет вести внутренний учет для каждой дейтаграммы в потоке. С другой стороны, когда вы отправляете поток TCP, iperf ведет учет только один раз для каждого потока. В моих измерениях выяснилось, что iperf-UDP тратит много времени на измерения для каждой датаграммы, что снижает производительность.
Если вы действительно хотите сравнить производительность TCP и UDP, лучше написать свою собственную тестовую программу. и убедитесь, что количество вычислений одинаково в обоих случаях.
Как сказано выше, iperf ограничивает себя конструктивно. В src / Client.cpp
метод
void Client::Run( void )
вызывает
ReportPacket( mSettings->reporthdr, reportstruct );
после записи каждой дейтаграммы UDP.
ReportPacket ()
работает довольно медленно и замедляет все это.
В iperf3, для UDP вводится пакетная запись, вы можете указать количество пакетных записей в параметре командной строки -b
, например -b 10240M / 2000
, в противном случае вы можете использовать netperf с ] -t UDP_STREAM
.