Почему моя пропускная способность TCP намного больше пропускной способности UDP?

15

Я не сделал ничего необычного для моего оборудования или конфигураций ядра (все настройки по умолчанию, новая установка ОС, ядро ​​Linux 3.11 стек TCP / IP), и я усредняю ​​около 3,83 миллиона сообщений в секунду через TCP, в то время как я в среднем только 0,75 миллион сообщений в секунду через UDP. Кажется, это полностью противоречит тому, что я ожидаю от двух протоколов.

Какая наиболее вероятная причина такой разницы и как я могу диагностировать ее в Ubuntu 13.10?

#TCP RESULTS
Recv   Send    Send                          Utilization       Service Demand
Socket Socket  Message  Elapsed              Send     Recv     Send    Recv
Size   Size    Size     Time     Throughput  local    remote   local   remote
bytes  bytes   bytes    secs.    10^6bits/s  % S      % S      us/KB   us/KB

87380  65536     64    10.00      1963.43   32.96    17.09    5.500   2.852

#UDP RESULTS
Socket  Message  Elapsed      Messages                   CPU      Service
Size    Size     Time         Okay Errors   Throughput   Util     Demand
bytes   bytes    secs            #      #   10^6bits/sec % SS     us/KB

4194304      64   10.00     7491010      0      383.5     28.97    24.751
212992            10.00     1404941              71.9     25.03    21.381

Для этого теста у меня есть два тестовых сервера, которые идентичны и напрямую подключены через перекрестный кабель 10G. В этом случае используются сетевые адаптеры Intel X520 с готовыми конфигурациями, подключенные к слоту PCIe 3.0 x8 на материнской плате, который обменивается данными с процессором через контроллер NUMA.

elleciel
источник
Как вы отметились? Против того, что вы отправили эти пакеты?
Брайам
Я использовал netperfдля тестов, тестов UDP_STREAM и TCP_STREAM, фиксированных для того же процессора и 64-байтовых размеров сообщений.
elleciel
1
Это не отвечает на вопрос @ Брайама. Топология сети и детальный метод тестирования важны здесь.
Павел Шимерда
1
@ PavelŠimerda Извините, я думал, что он просит только методологию тестирования. Что касается топологии сети, два тестовых сервера идентичны и напрямую подключены через перекрестный кабель 10G. В этом случае используются сетевые карты Intel X520 с готовыми конфигурациями, которые подключены к разъему PCIe 3.0 x8 на материнской плате, который обменивается данными с процессором через контроллер NUMA. Отвечает ли это на ваш вопрос?
elleciel
1
Да, @elleciel, это определенно отвечает на мой вопрос. Хотя в этом случае у меня нет опыта, чтобы дать вам ответ для напрямую подключенных машин. Я вижу, вы исправили сам вопрос, и это здорово. Будет вопрос как сейчас мне тоже интересно.
Павел Шимерда

Ответы:

29

Помимо получения подробной информации о настройках теста, основная проблема заключается в том, что вы используете сообщение размером 64 байта. Это далеко от обычного MTU в 1500 байт и делает UDP крайне неэффективным: хотя TCP объединяет несколько отправок в один пакет на проводе (кроме случаев, когда установлен TCP_NODELAY) для эффективного использования канала, каждое сообщение UDP приведет к отдельный пакет. В цифрах: около 23 сообщений размером 64 байта будут объединены в один TCP-пакет размером MTU, в то время как для UDP понадобится 23 одиночных пакета для UDP для одного и того же объема данных. Каждый из этих пакетов означает накладные расходы при отправке с хоста, передаче по проводному соединению и получении узлом. И, как видно из вашего случая, около 80% пакетов UDP теряются, потому что ваше оборудование недостаточно быстрое, чтобы передавать и принимать все эти пакеты.

Итак, что вы можете узнать из этого теста:

  • UDP ненадежен (потеря пакета 80%)
  • UDP неэффективен, если используется с размерами пакетов намного ниже MTU
  • TCP высоко оптимизирован, чтобы наилучшим образом использовать ссылку

Что касается ваших ожиданий, то UDP должен быть лучше: вы когда-нибудь задумывались, почему все основные передачи файлов (ftp, http, ...) выполняются с помощью протоколов на основе TCP? Тест показывает вам причину.

Так почему люди вообще используют UDP?

  • С данными в реальном времени (например, передачей голоса по IP) вы не заботитесь о старых сообщениях, поэтому вы не хотите, чтобы отправитель объединял сообщения в большие пакеты, чтобы эффективно использовать ссылку. И вы скорее согласитесь с тем, что пакет потерян, чем слишком поздно.
  • При использовании каналов с высокой задержкой (как со спутниками) поведение TCP по умолчанию не является оптимальным для эффективного использования канала. Таким образом, некоторые люди переключаются на UDP в этом случае и повторно внедряют уровень надежности TCP и оптимизируют его для каналов с высокой задержкой, в то время как другие настраивают существующий стек TCP для лучшего использования канала.
  • «выбрасывать» данные: иногда важнее отправить данные и не заботиться о потере пакетов, как в случае сообщений журнала (syslog)
  • Короткие взаимодействия: с TCP вам нужно установить соединение и поддерживать состояние, которое требует времени и ресурсов на клиенте и сервере. Для коротких взаимодействий (таких как короткий запрос и ответ) это может быть слишком много накладных расходов. Из-за этого DNS обычно выполняется с UDP, но имеет встроенные повторы поверх UDP.
Штеффен Ульрих
источник
2
Вы также должны взглянуть на свою 80% потерю пакетов с UDP. Похоже, ваше оборудование недостаточно быстрое, чтобы обрабатывать пакеты с той же скоростью, с которой они отправляются. В то время как TCP адаптируется к этому виду потери пакетов с замедлением, UDP будет просто отправлять с той же скоростью и продолжать терять пакеты. Но, в конце концов, важно не то, как быстро вы можете отправить, а то, что вы получите.
Штеффен Ульрих
1
Еще одним фактором, который может быть фактором, является ускорение / разгрузка TCP на сетевую карту (если она это поддерживает).
cpugeniusmv
1
Отправка пакетов может быть более эффективной, чем прием, особенно если последний из них управляется прерыванием.
Штеффен Ульрих
1
люди также используют UDP для встроенного устройства, чтобы транслировать данные, которые оно собирает, по проводам и не беспокоиться о настройке соединения
ratchet freak
3
Скорее всего, IO связан с шиной PCI Express. Скорее всего, для сетевых карт будет включена разгрузка сегментов TCP. Это означает, что TCP-передачи будут отправляться на карту в виде одного большого блока, затем карта нарезает их и разбивает их на пакеты и помещает в провод. Для UDP нет эквивалента, поэтому в результате получается одна транзакция PCIe (и все связанные с ней издержки) для каждого пакета.
alex.forencich