Клиентский сервер TCP: блокировка соединения - PullRequest
1 голос
/ 25 марта 2011

Я создаю распределенное приложение, которому для связи нужен TCP. В заключительных экспериментах будут задействованы тысячи серверов, число клиентов которых будет в 10-100 раз больше. Текущий дизайн состоит в том, чтобы устанавливать соединение, связываться и затем закрывать соединение для каждой транзакции.

  1. Поскольку я сделал только несколько простых многопоточных серверов с несколькими клиентами, я выбрал блокирующие сокеты для связи (они звучали легко). Я не уверен, что этот подход будет достаточно масштабным. Может кто-нибудь поделиться своим опытом?

  2. В настоящее время код выполняется на одной машине (48 ядер / локальная петля) с тремя процессами сервера и несколькими клиентами. Клиенты имеют замкнутый цикл, в котором они устанавливают соединение, общаются с любым одним сервером и затем разрывают соединение. Эти первоначальные тесты требуют, чтобы клиенты выполняли где-то миллион итераций цикла for. По сути, это строгие испытания, поскольку мы увеличиваем масштабы экспериментов. Случайным образом некоторые клиенты застревают при попытке подключиться к серверу. В нормальное время этот сервер может нормально взаимодействовать с другими клиентами. Все звонки блокируются. Кто-нибудь может подсказать, что происходит? Очередь прослушивания сервера (многопоточная) составляет 50, и один клиент выполняет около 1500 подключений в секунду. (Это распределенная система для высокопроизводительных рабочих нагрузок :)) Может ли предшествующее неразрывное соединение между этим клиент-сервером быть причиной?

Любой обмен опытом был бы полезен ...

1 Ответ

0 голосов
/ 27 марта 2011

Возможно, не стоит использовать блокирующие сокеты для сценария, который вы упомянули.Прежде всего, вы должны использовать неблокирующие сокеты.И во-вторых;Если вы пишете свой сервер в Microsoft Windows, тогда вы можете рассмотреть возможность использования портов завершения ввода-вывода для этой цели, и если ваш сервер реализован в Linux, тогда переход на «epoll» будет хорошо масштабироваться.здесь по замыслу кажется, что вы управляете одним сокетом / соединением на поток на вашем сервере.И вы исчерпаете свои системные ресурсы, создавая так много потоков и медленнее создавая потоки для каждого соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...