Почему UDP медленнее, чем TCP на Сервере Ubuntu?

Microsoft удалит поддержку AWE следующая версия SQL Server. Поскольку новая ОС уже системы на 64 бита и обращающийся к намного большему количеству размеров RAM

2
задан 26 September 2012 в 16:50
3 ответа

Каждый кадр проходит через несколько буферов при его отправке: буфер приложения, буфер протокола, буфер программного интерфейса и буфер аппаратного интерфейса. Когда вы начнете загружать стек, отправив высокоскоростные данные, вы заполните эти буферы и либо заблокируете, либо потеряете данные. У вас также есть стратегии своевременности и опроса, которые могут повлиять на вашу производительность. Например, используя больший буфер и реже опрашивая, вы можете получить гораздо лучшую производительность, жертвуя при этом задержкой.

TCP оптимизирован для высокоскоростной массовой передачи, а UDP оптимизирован для малой задержки в ядре Linux. Это влияет на размер буфера, а также на то, как данные опрашиваются и передаются. В дополнение к этому у вас часто бывает разгрузка оборудования для TCP. Я ожидал, что TCP будет работать лучше, чем UDP.

Обратите внимание, что отправка высокоскоростных данных по UDP обычно является плохой идеей, если вы не реализуете свой собственный контроль перегрузки. TCP защищает вашу сеть от перегрузок. Используйте UDP, если у вас небольшой объем данных или высокие требования к своевременности.

9
ответ дан 3 December 2019 в 08:29

Проблема в самом iperf. Когда вы отправляете поток UDP, iperf будет вести внутренний учет для каждой дейтаграммы в потоке. С другой стороны, когда вы отправляете поток TCP, iperf ведет учет только один раз для каждого потока. В моих измерениях выяснилось, что iperf-UDP тратит много времени на измерения для каждой датаграммы, что снижает производительность.

Если вы действительно хотите сравнить производительность TCP и UDP, лучше написать свою собственную тестовую программу. и убедитесь, что количество вычислений одинаково в обоих случаях.

8
ответ дан 3 December 2019 в 08:29

Как сказано выше, iperf ограничивает себя конструктивно. В src / Client.cpp метод

void Client::Run( void )

вызывает

ReportPacket( mSettings->reporthdr, reportstruct );

после записи каждой дейтаграммы UDP.

ReportPacket () работает довольно медленно и замедляет все это.

В iperf3, для UDP вводится пакетная запись, вы можете указать количество пакетных записей в параметре командной строки -b , например -b 10240M / 2000

, в противном случае вы можете использовать netperf с ] -t UDP_STREAM .

9
ответ дан 3 December 2019 в 08:29

Теги

Похожие вопросы