Я использую настраиваемый сервер, который должен поддерживать очень большое число (100 тыс. или более) долгоживущих соединений. Сервер просто передает сообщения между сокетами и не выполняет никакой серьезной обработки данных. Сообщения небольшие, но многие из них принимаются/отправляются каждую секунду. Одной из целей является сокращение латентности. Я понимаю, что использование нескольких ядер не улучшит производительность, поэтому я решил запустить сервер в одном потоке, вызвав методы run_one
или poll
объекта io_service
. В любом случае многопоточный сервер будет намного сложнее реализовать.
Каковы возможные узкие места? Syscalls, пропускная способность, завершение очереди/демультиплексирование событий? Я подозреваю, что диспетчерам диспетчеризации может потребоваться блокировка (что делается внутри библиотеки asio). Можно ли отключить даже блокировку очереди (или любую другую блокировку) в boost.asio?
EDIT: связанный вопрос. Улучшена ли производительность системы syscall с несколькими потоками? Я чувствую, что из-за того, что syscalls атомарно/синхронизировано ядром, добавление большего количества потоков не улучшит скорость.