#java #linux #tcp
#java #linux #tcp
Вопрос:
в настоящее время я тестирую сервер с помощью автоматического тестового клиента, который имитирует большое количество пользователей. И сервер, и клиент написаны на Java. Клиент открывает соединение tcp / ip для каждого пользователя. И сервер, и клиент работают на Ubuntu Linux, клиент запускается с 11.04, а сервер с 10.04.
Тестирование прошло успешно вплоть до 27000 одновременно открытых подключений, после этого я решил перейти к 36000 (ресурсы серверов и клиентов на самом деле были израсходованы не полностью при 27000, поэтому я решил сделать немного больший скачок). Когда я попытался запустить тест для 36k, я получил следующее исключение на стороне клиента:
- java.net.BindException: не удается назначить запрошенный адрес
Насколько я знаю, при 36k у меня все еще должны быть свободные порты, поскольку на обоих компьютерах больше ничего не запущено, а tcp ограничивает номер порта 2 ^ 16, который равен 65536. Теперь, поскольку это Linux, я также установил количество открытых файлов для пользователя равным 100 кб с ulimit -n 100000. Но я все еще получаю то же исключение.
Мне интересно, что еще может быть возможной причиной упомянутого исключения, или linux каким-то другим способом ограничивает количество исходящих подключений?
Заранее спасибо,
Danijel
Ответ №1:
По умолчанию Linux выбирает динамически назначаемые порты из диапазона 32768 ..61000. Остальные доступны для статического назначения, если вы привязываетесь к определенному номеру порта. Диапазон может быть изменен, если вы хотите, чтобы для динамического назначения было доступно больше портов, но просто будьте осторожны, чтобы не включать порты, которые используются для определенных служб, которые вам нужны (например, 6000 для X11). Также вы не должны разрешать динамически назначать порты < 1024, поскольку они являются привилегированными. Чтобы проверить или изменить диапазон:
$ cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000
# echo "16384 65535" > /proc/sys/net/ipv4/ip_local_port_range
Комментарии:
1. Спасибо mark4o за объяснение и решение, вы попали в точку.