Новый поток на клиентское соединение в сокет-сервере? - PullRequest
8 голосов
/ 24 марта 2010

Я пытаюсь оптимизировать несколько соединений одновременно с сервером сокетов TCP.

Считается ли хорошей практикой или даже рациональным инициировать новый поток на сервере прослушивания каждый раз, когда я получаю запрос на соединение?

В какое время я должен начать беспокоиться о сервере, основанном на этой инфраструктуре? Какое максимальное количество фоновых потоков я могу работать, пока это больше не имеет смысла?

Платформа - C #, платформа - Mono, целевая ОС - CentOS, оперативная память - 2,4 ГБ, сервер - в облаках, и я ожидаю около 200 запросов на подключение в секунду.

1 Ответ

8 голосов
/ 24 марта 2010

Нет, у вас не должно быть одного потока на соединение. Вместо этого вы должны использовать асинхронные методы (BeginAccept / EndAccept, BeginSend / EndSend и т. Д.). Это позволит более эффективно использовать системные ресурсы.

В частности, каждый создаваемый вами поток добавляет издержки с точки зрения переключения контекста, места в стеке, отсутствия кеша и так далее. Linux лучше справляется с этой задачей, чем, например, Windows, но это не должно быть оправданием для того, чтобы вы могли свободно создавать столько потоков, сколько хотите;)

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