У меня есть однопоточный асинхронный tcp-сервер, написанный с использованием boost asio. Каждый входящий запрос проходит несколько этапов обработки (синхронный и асинхронный) и, наконец, отправляет ответ с помощью асинхронной записи.
При небольших нагрузках с 10 одновременными запросами работает прилично. Однако, когда я тестирую с использованием параллелизма 100, все начинает ухудшаться. Задержка ответа начинает увеличиваться с течением времени. Итак, я хочу попробовать с некоторой многопоточной обработкой запросов.
Я ищу достойный пример / помощь по созданию и запуску нескольких потоков для асинхронного чтения / записи клиентам. У меня есть следующие сомнения:
Спасибо за любую помощь и указатели здесь.





Не видя вашего кода, я могу только догадываться, что пошло не так. Скорее всего, вы выполняете длинные действия внутри обработчиков асинхронного завершения. Обработчики завершения должны быть быстрыми - получить данные, передать их для дальнейшей обработки, готово.
В качестве первого приоритета я бы стал полностью асинхронным и выполнял всю обработку в пуле потоков. Вы можете найти пример здесь, где новый поток запускается для каждого нового клиента, который вы можете заменить пулом потоков.
Используйте один io_service. Один io_service может обрабатывать много параллелизма при условии, что ты не задерживает его внутри обработчиков завершения. Это упрощает реализацию, поскольку вам не нужно беспокоиться о параллельной работе обработчиков завершения, что произойдет, если вы запустите несколько IOS в нескольких потоках.
Вопрос 1. Должен ли я использовать один объект IOS и вызывать его метод выполнения во всех потоках пула потоков или мне следует использовать отдельную IOS для каждого потока?
Либо ты можешь
Q2: Если я использую одну ОС IOS, существует ли вероятность того, что часть данных TCP перейдет в один поток, а другая часть - в другой и так далее .. Верно ли это понимание?
Да, есть состояние гонки, но boost.asio поддерживает прядь, чтобы избежать этого.
Q3: Есть ли другой способ лучше?
Для меня не найти лучшего способа, если найдешь, скажи мне или мимо здесь, спасибо.
Кстати, как сказал @rustyx, ваша программа блокируется при вызовах синхронизации, вам поможет переход на полностью асинхронные вызовы.