#highload #сокет #cpp
Доброго времени суток! Есть некоторое приложение, обрабатывающее данные. К нему приходит клиент/клиенты и начинают активно слать данные. В среднем на одной ноде должно обрабатываться 5-10к сообщений в секунду от одного клиента. Средний размер сообщения 700-1100 байт. Сталкивались с проблемами переполнения буферов сокета, увеличили. Все равно скорости не всегда хватает. выше 3к начинает проседать сервер и жрать 100% ( 1 ядра ). Вопрос: как лучше организовать архитектуру и кто сталкивался с такими вещами? куда посмотреть? почитать? P.S. естесственно сервер и клиент linux.
Ответы
Ответ 1
Если мощности есть - типичное количество одновременно подключённых клиентов существенно меньше, чем количество ядер, то можно сделать, например, так. Поток, работающий с сокетом, вычитывает данные и кладёт их в очередь задач. Несколько других потоков выбирают из этой очереди, обрабатывают эти данные и кладут результаты в очередь результатов. Первый поток берёт всё из очереди результатов и отправляет клиенту. Всё это реализовывать надо аккуратно, иначе будут проблемы с блокировками, конфликты доступа к памяти... Нотификации о появлении новых данных - семафорами. Если будет тормозить из-за них, можно заморочиться с ручной реализацией через переменные (будет сложно и муторно, но слышал о подобной success story от коллеги). Или, в качестве фантазии, можно сделать по очереди заданий на каждый поток-обработчик. Каждый поток, работающий с сокетом, знает 4 потока-обработчика (4 проистекает из 10000/3000), и по очереди кладёт им задания. Но для начала я бы рекомендовал подумать над оптимизацией собственно процесса обработки. Гораздо приятней было бы запихнуть всю обработку данных одного клиента на одно ядро.
Комментариев нет:
Отправить комментарий