Самый эффективный высокопроизводительный серверный разъем/дизайн резьбы - программирование
Подтвердить что ты не робот

Самый эффективный высокопроизводительный серверный разъем/дизайн резьбы

Я создаю чрезвычайно высокопроизводительное корпоративное программное обеспечение, которое будет получать, обрабатывать и отвечать на более чем 50 000 запросов TCP в секунду. Это будет распространено на нескольких серверах Amazon EC2, но я хотел бы получить один сервер, способный обрабатывать как можно больше тысяч запросов в секунду (съемка на 5 к/сек). Я, скорее всего, буду использовать экземпляр m1.xlarge, запускающий Amazon Linux.

Я создаю это программное обеспечение на С++ с помощью Boost ASIO, и я пытаюсь выяснить наиболее эффективный способ архивирования обработки сокетов. В примерах (http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/examples.html) я склоняюсь к эмуляции "HTTP Server 2", так как у нас будет несколько vCPU для сотрудника.

Может ли кто-то действительно описать плюсы и минусы каждого примера HTTP-сервера там, и имея дело с этим множеством подключений, я бы очень хотел получить дополнительную информацию (относительно сокетов Boost и/или конфигурации с высокой пропускной способностью EC2).

Большое спасибо!

4b9b3361

Ответ 1

Некоторые предложения:

Вы не упомянули, что ваш сервер будет делать. Будет ли он принимать и закрывать 50 тыс. Новых запросов в секунду или просто обслуживать сообщения (запросы) из установленных TCP-соединений. Поэтому мой совет может быть немного общим.

  • Прочтите проблему C10K: http://www.kegel.com/c10k.html

  • Инвестируйте в использование epoll в качестве решения уведомления о сокетах вместо ASIO. epoll не сложно.

  • Рассмотрим использование фиксированного количества потоков (2-8). Либо балансируйте нагрузки сокетов по этим потокам, либо просто используйте пул рабочих потоков для сообщений запросов на обслуживание, обработанных с помощью резьбы сокета. Создайте несколько потоков, но начните с использования только одного потока. Затем разрешите все проблемы с производительностью. После того, как вы получите однопоточное решение, работающее хорошо, а производительность достигает своего пика, рассмотрите возможность увеличения количества потоков, чтобы можно было обрабатывать несколько операций, в то время как другие потоки блокируются.

  • Шансы очень высоки, что проблемы с производительностью вашего сервера будут за пределами дизайна сокета. Постоянно проверяйте и запускайте такие инструменты, как valgrind, чтобы понять, где код тратит большую часть своего времени. Шансы высоки, там, где вы меньше всего этого ожидаете. Например, на моем сервере я обнаружил, что большую часть времени было потрачено на выделение и освобождение памяти для небольших временных буферов. Я бы никогда не догадался. Затем я изменил дизайн сервера, чтобы выделить память спереди, использовать стек стека и т.д., Так что обработка запроса никогда не требовала, чтобы код выделял память. Производительность легко удваивалась, когда я делал это изменение.

Ответ 2

Возможно, вы захотите изучить неблокирующие сокеты и распространить обработку ввода/вывода/обработки на отдельные потоки. Создайте 3 новых потока ввода/вывода/обработки на тысячу подключений, возможно?

Надеюсь, что это поможет.