Я реализую настраиваемый сервер, который должен поддерживать очень большое количество (100 тыс. Или более) долгоживущих соединений. Сервер просто передает сообщения между сокетами и не выполняет никакой серьезной обработки данных. Сообщения небольшие, но многие из них принимаются/отправляются каждую секунду. Одной из целей является сокращение латентности. Я понимаю, что использование нескольких ядер не улучшит производительность, поэтому я решил запустить сервер в одном потоке, вызвав run_one
или poll
методы объекта io_service
. В любом случае многопоточный сервер будет намного сложнее реализовать.Boost Asio single threaded performance
Каковы возможные узкие места? Syscalls, пропускная способность, завершение очереди/демультиплексирование событий? Я подозреваю, что диспетчерам диспетчеризации может потребоваться блокировка (что делается внутри библиотеки asio). Можно ли отключить даже блокировку очередей (или любую другую блокировку) в boost.asio?
EDIT: родственный вопрос. Улучшена ли производительность системы syscall с несколькими потоками? Я чувствую, что из-за того, что syscalls атомарно/синхронизировано ядром, добавление большего количества потоков не улучшит скорость.
Если вы используете все в одном потоке, вам не нужны никакие (рукописные) блокировки. –
Использование нескольких ядер, вероятно, улучшит производительность - см. Http://cmeerw.org/blog/748.html#748 и http://cmeerw.org/blog/746.html#746 для некоторых тестов, которые я сделал в прошлом году. – cmeerw