Ответ 1
Некоторые предложения:
Вы не упомянули, что ваш сервер будет делать. Будет ли он принимать и закрывать 50 тыс. Новых запросов в секунду или просто обслуживать сообщения (запросы) из установленных TCP-соединений. Поэтому мой совет может быть немного общим.
-
Прочтите проблему C10K: http://www.kegel.com/c10k.html
-
Инвестируйте в использование epoll в качестве решения уведомления о сокетах вместо ASIO. epoll не сложно.
-
Рассмотрим использование фиксированного количества потоков (2-8). Либо балансируйте нагрузки сокетов по этим потокам, либо просто используйте пул рабочих потоков для сообщений запросов на обслуживание, обработанных с помощью резьбы сокета. Создайте несколько потоков, но начните с использования только одного потока. Затем разрешите все проблемы с производительностью. После того, как вы получите однопоточное решение, работающее хорошо, а производительность достигает своего пика, рассмотрите возможность увеличения количества потоков, чтобы можно было обрабатывать несколько операций, в то время как другие потоки блокируются.
-
Шансы очень высоки, что проблемы с производительностью вашего сервера будут за пределами дизайна сокета. Постоянно проверяйте и запускайте такие инструменты, как valgrind, чтобы понять, где код тратит большую часть своего времени. Шансы высоки, там, где вы меньше всего этого ожидаете. Например, на моем сервере я обнаружил, что большую часть времени было потрачено на выделение и освобождение памяти для небольших временных буферов. Я бы никогда не догадался. Затем я изменил дизайн сервера, чтобы выделить память спереди, использовать стек стека и т.д., Так что обработка запроса никогда не требовала, чтобы код выделял память. Производительность легко удваивалась, когда я делал это изменение.