Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

5k сообщений в секунду через один сокет

#highload #сокет #cpp


Доброго времени суток!
Есть некоторое приложение, обрабатывающее данные. К нему приходит клиент/клиенты
и начинают активно слать данные. В среднем на одной ноде должно обрабатываться 5-10к
сообщений в секунду от одного клиента. Средний размер сообщения 700-1100 байт. 
Сталкивались с проблемами переполнения буферов сокета, увеличили. Все равно скорости
не всегда хватает. выше 3к начинает проседать сервер и жрать 100% ( 1 ядра ).
Вопрос: как лучше организовать архитектуру и кто сталкивался с такими вещами? куда
посмотреть? почитать?
P.S. естесственно сервер и клиент linux.    


Ответы

Ответ 1



Если мощности есть - типичное количество одновременно подключённых клиентов существенно меньше, чем количество ядер, то можно сделать, например, так. Поток, работающий с сокетом, вычитывает данные и кладёт их в очередь задач. Несколько других потоков выбирают из этой очереди, обрабатывают эти данные и кладут результаты в очередь результатов. Первый поток берёт всё из очереди результатов и отправляет клиенту. Всё это реализовывать надо аккуратно, иначе будут проблемы с блокировками, конфликты доступа к памяти... Нотификации о появлении новых данных - семафорами. Если будет тормозить из-за них, можно заморочиться с ручной реализацией через переменные (будет сложно и муторно, но слышал о подобной success story от коллеги). Или, в качестве фантазии, можно сделать по очереди заданий на каждый поток-обработчик. Каждый поток, работающий с сокетом, знает 4 потока-обработчика (4 проистекает из 10000/3000), и по очереди кладёт им задания. Но для начала я бы рекомендовал подумать над оптимизацией собственно процесса обработки. Гораздо приятней было бы запихнуть всю обработку данных одного клиента на одно ядро.

Комментариев нет:

Отправить комментарий