Для такого рода производительности я бы рассмотрел основанный на select()
«цикл коммутатора»:
- Откройте прослушивающие сокеты UDP
- Вызовите
select()
для определения сокетовс читаемыми данными - Для каждого читаемого сокета читайте байты (неблокирующее чтение)
- Когда вы получите полный пакет, обработайте (и запишите, если необходимо)
Вы можете построить простую таблицу, которая отправляет результаты select()
.
Этот подход даст вам наилучшую возможную производительность, потому что она максимально приближена к вызовам операционной системы с минимальными издержками.Он работает как единый процесс, сводя к минимуму переключение контекста и получая лучшую локальность кэша.
Далее, если вы обнаружите, что вещи связаны с процессором, рассмотрите способы использования нескольких ядер ЦП с несколькими потоками или процессами.Например, может ли каждый процессор обрабатывать N из ваших 10 сокетов с хеш-таблицей в разделяемой памяти.
Наконец, я бы позаботился об использовании большого количества потоков (например, большого рабочего пула потоков, так далее.).При экстремальных уровнях производительности издержки потоков могут быть значительными.