Я не сделал ничего необычного для моего оборудования или конфигураций ядра (все настройки по умолчанию, новая установка ОС, ядро 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.
источник
netperf
для тестов, тестов UDP_STREAM и TCP_STREAM, фиксированных для того же процессора и 64-байтовых размеров сообщений.Ответы:
Помимо получения подробной информации о настройках теста, основная проблема заключается в том, что вы используете сообщение размером 64 байта. Это далеко от обычного MTU в 1500 байт и делает UDP крайне неэффективным: хотя TCP объединяет несколько отправок в один пакет на проводе (кроме случаев, когда установлен TCP_NODELAY) для эффективного использования канала, каждое сообщение UDP приведет к отдельный пакет. В цифрах: около 23 сообщений размером 64 байта будут объединены в один TCP-пакет размером MTU, в то время как для UDP понадобится 23 одиночных пакета для UDP для одного и того же объема данных. Каждый из этих пакетов означает накладные расходы при отправке с хоста, передаче по проводному соединению и получении узлом. И, как видно из вашего случая, около 80% пакетов UDP теряются, потому что ваше оборудование недостаточно быстрое, чтобы передавать и принимать все эти пакеты.
Итак, что вы можете узнать из этого теста:
Что касается ваших ожиданий, то UDP должен быть лучше: вы когда-нибудь задумывались, почему все основные передачи файлов (ftp, http, ...) выполняются с помощью протоколов на основе TCP? Тест показывает вам причину.
Так почему люди вообще используют UDP?
источник