Масштабируемый UDP-сервер - PullRequest
       8

Масштабируемый UDP-сервер

3 голосов
/ 12 февраля 2011

Мне нужно сделать сервер, который будет слушать и отвечать на UDP-пакеты, Будет прослушивать 10 портов.

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

Но он должен обрабатывать 15 тыс. Пакетов в секунду.

Я могу развиваться в c, c ++ или qt.

Есть какие-то особые рекомендации, которые должны соответствовать этим требованиям? Какой основной дизайн использовать? Нужна ли многопоточность?

Ответы [ 2 ]

5 голосов
/ 12 февраля 2011

Для такого рода производительности я бы рассмотрел основанный на select() «цикл коммутатора»:

  • Откройте прослушивающие сокеты UDP
  • Вызовите select() для определения сокетовс читаемыми данными
  • Для каждого читаемого сокета читайте байты (неблокирующее чтение)
  • Когда вы получите полный пакет, обработайте (и запишите, если необходимо)

Вы можете построить простую таблицу, которая отправляет результаты select().

Этот подход даст вам наилучшую возможную производительность, потому что она максимально приближена к вызовам операционной системы с минимальными издержками.Он работает как единый процесс, сводя к минимуму переключение контекста и получая лучшую локальность кэша.

Далее, если вы обнаружите, что вещи связаны с процессором, рассмотрите способы использования нескольких ядер ЦП с несколькими потоками или процессами.Например, может ли каждый процессор обрабатывать N из ваших 10 сокетов с хеш-таблицей в разделяемой памяти.

Наконец, я бы позаботился об использовании большого количества потоков (например, большого рабочего пула потоков, так далее.).При экстремальных уровнях производительности издержки потоков могут быть значительными.

4 голосов
/ 12 февраля 2011

Boost.Asio - идеальный выбор для масштабируемого UDP-сервера.Его использование имеет несколько преимуществ по сравнению с непосредственным программированием API-интерфейсов сокетов :

  1. Библиотека является зрелой и проверенной, и в ней реализован собственный реактор select, poll, или epoll.Скорее всего, возникнут ошибки.
  2. Использование int для представления всех типов сокетов лишено безопасности типов, asio использует такие типы, как boost::asio::ip::tcp::socket и boost::asio::ip::udp::socket.
  3. Масштабируется до тысяч одновременных подключений путем внедрения асинхронных шаблонов проектирования вместо потока для каждого подключения.
  4. Добавление поддержки многопоточности для расширенной масштабируемости тривиально.
...