Лучшее решение для клиент-серверной сокет-системы - PullRequest
0 голосов
/ 13 октября 2011

У меня есть Сервер и клиенты (1000), с которыми сервер обменивается данными каждую секунду. Я создаю один поток на сервере для каждого клиента.

Что я хочу знать:

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

Сервер, запрограммированный на Java, и клиенты с C

И характеристики сервера:

64-битный 12-ядерный процессор AMD 2xAMD Opteron ™ 6174,

2,2 ГГц DDR3-RAM до 128 ГБ ECC, рег. (ErrorCorrected)

20 ТБ S-ATA II и 6 ТБ SAS (HotSwap) HDD

Спасибо

Ответы [ 3 ]

1 голос
/ 13 октября 2011

Вы можете использовать неблокирующую NIO для совместного использования соединений между потоками.Минимальное число: 1;) Если вы хотите использовать модель Dispacher, я предлагаю использовать библиотеку, которая обрабатывает детали для вас.например, netty.

В тестах, которые я провел, при использовании 10000 соединений теряется около 1 ядра.Если у вас есть 1000, я ожидаю, что вы тратите около 10% одного ядра.Я хочу сказать, что, хотя это и более эффективно, оно может не стоить значительных изменений в вашем приложении для его поддержки.

1 голос
/ 13 октября 2011

Я бы посоветовал вам взглянуть на Java NIO (New I / O), который вы можете использовать, чтобы сделать ваш сервер однопоточным (по крайней мере, очень мало потоков).

Вот несколько хороших примеров:

http://www.exampledepot.com/egs/java.nio/NbServerSocket.html
http://www.exampledepot.com/egs/java.nio/AcceptSocket.html
http://www.exampledepot.com/egs/java.nio/NbServer.html
1 голос
/ 13 октября 2011

Теоретически у вас должна быть отдельная обработка потоков для каждого запроса клиента. Однако практически это невозможно из-за ограниченности аппаратных ресурсов. Ограничение аппаратных ресурсов не позволяет создавать неограниченное количество потоков, а создание отдельного потока для каждого запроса является дорогостоящей операцией с точки зрения задач, выполняемых ОС для управления этими потоками. Чтобы решить эту проблему, вы должны подумать о thread-pool , с помощью которого вы можете повторно использовать потоки для обслуживания разных клиентов. Если вы используете Java на стороне сервера, тогда пакет Java concurrency (начиная с версии 1.5) предоставляет полную инфраструктуру для создания и использования потоковых пулов. Для получения дополнительной информации см. http://download.oracle.com/javase/tutorial/essential/concurrency/pools.html.

...