Вопрос

Я пишу тестовую программу для сервера.В тестовом приложении я пытаюсь подключить большое количество клиентов к серверу, но через некоторое время получаю всевозможные ошибки, подобные этим :

Connection reset by peer: socket write error                   

или

java.net.SocketException: Connection reset                     

или

java.net.ConnectException: Connection refused: connect

Я использую новый сокет для каждого клиента, которого я подключаю к серверу.

Может ли кто-нибудь просветить меня по поводу этого странного поведения?

Это было полезно?

Решение

К сожалению, вы не предоставили подробных сведений о характере вашего сервера.Я полагаю, вы пишете типичный TCP-сервер.В этом ответе я буду не обсудите любые детали, связанные с Java.

Краткий совет таков:вставьте задержку между подключениями клиентов.Без этого вы активно имитируете DoS-атаку на ваш сервер.

О более длинном из них читайте ниже.

Обычно TCP-сервер создает только 1 слушающий подключается путем вызова (в прекрасном интерфейсе C) int sockfd = socket(...) функция и передача результата (sockfd в нашем случае) к bind() и listen() функции.После этой подготовки сервер вызовет accept() который переведет сервер в спящий режим (если сокет был помечен как блокирующий), и если клиент на другой стороне Земли начнет вызывать connect() функция, чем accept() (на стороне сервера) при поддержке ядра ОС создаст подключенный разъем.

Фактическое количество возможных ожидающие подключения можно узнать, взглянув на listen() функция. listen() имеет отставание в работе параметр, который определяет максимальное количество подключений к Ядро ОПЕРАЦИОННОЙ системы должен стоять в очереди к сокету (это в основном сумма всех подключений в SYN_RCVD и ESTABLISHED государства).Исторически рекомендуемое значение для отставание в работе в 1980-х было что-то вроде 5, что в наши дни явно убого.Во FreeBSD 7.2, например, a жесткий лимит для отставание в работе можно догадаться, набрав:

% sysctl kern.ipc.somaxconn
kern.ipc.somaxconn: 128

и в Fedora 10:

% cat /proc/sys/net/core/somaxconn
128

P.S.
Извините за мой ужасный английский.

Другие советы

Ваш веб-сервер / сервер приложений может обслуживать только ограниченное количество клиентов одновременно.

При достижении этого предела вы получите сообщение об отказе в подключении / сбросе.

Надеюсь, это ответ на ваш вопрос.

Ваше здоровье

Существуют ограничения операционной системы и веб-сервера на скорость и количество подключений, которые вы можете запустить / принять.Если вы хотите провести тестирование производительности на сервере, попробуйте Apache JMeter, поскольку у него есть решения для этих ограничений.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top