Создание супер UDP-сервера с использованием как можно большего количества процессорных ядер - PullRequest
2 голосов
/ 06 июля 2011

Я обнаружил серьезные ограничения в коде, который пишу.

Я пытаюсь сделать так, чтобы мой код работал на машине smp xeon с 24 аппаратными потоками максимально эффективно.

Для такой задачи я использую commoncpp оболочки вокруг собственных потоков и сокетов posix, а также библиотеку libev для обнаружения событий чтения в дескрипторах файлов сокетов.Цель, которую я хочу получить, состоит в том, чтобы не допустить потери данных на соединениях через сокет UDP, которые должны занимать около 600 Мбит / с данных каждое.

Я обнаружил, что установив более двух соединений, я получил потерянные данные.

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

Конечно (я не могу это скрыть). Я - фиктивный разработчик smp, который действительно нуждается в некоторой помощи при попытке установить «аппаратные потоки».

Я буду так рад понять,есть какая-то возможность / функция posix для форсирования аппаратных потоков или какое-то руководство (для чайников вроде меня :)), которое объясняет, как использовать ядра процессора для специальных нужд.

Как вы, возможно, поняли, яхотел бы иметь одно выделенное ядро ​​процессора на соединение.

Спасибо всем!

Ответы [ 2 ]

3 голосов
/ 06 июля 2011

Могу порекомендовать простой в реализации подход, который должен обеспечить довольно хорошую производительность.Используйте Boost.Asio с Boost.Thread .Boost.Asio обеспечивает асинхронную работу в сети и может использоваться в многопоточной среде без особых дополнительных усилий (хороший пример прирученной многопоточности).Исследуйте эти ссылки:

Первый раз, когда Asio может кого-то напугать.Но затем вы становитесь зависимыми от него.

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

1 голос
/ 06 июля 2011

Для такой высокоскоростной сети вам, возможно, придется покопаться в настройках оборудования и ОС.

Проверьте, поддерживает ли сетевая карта несколько входных очередей и может ли она использовать MSI вместо обычных прерываний. Посмотрите, можете ли вы установить одну входную очередь на ядро ​​ЦП. Посмотрите, есть ли варианты для разделения входящих пакетов в каждой очереди.

Проверьте размеры входного буфера ОС. Возможно, вам придется увеличить их, чтобы не пропустить UDP.

...