2015-06-05 3 views
0

Я разрабатываю java-сервер на виртуальных машинах AWS (ubuntu), который будет использоваться для онлайн-игры для Android. Я провел тест, который показал, что максимум 4080 клиент может подключиться к серверу. Я получаю «SocketException: слишком много файлов открываются», если больше клиентов хотят подключиться. Я проверил количество ограничений: «ulimit -n» дает мне 1024. Изменение его на 4096 не вносило изменений.Максимальное количество соединений TCP на Ubuntu

Новый поток создается для любого принятого сокета, и они ничего не делают в настоящее время и не живут до тех пор, пока я не остановлю сервер.

После того, как все 4080 соединений установлены, я заметил, что используется около 1 гб. У меня всего 2gb.

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

+1

Без просмотра кода я не могу комментировать. Хотя, похоже, вы открываете новый сокет каждый раз при каждом входящем запросе. –

+0

@ bobs_007 Ваша догадка правильная. – user3703595

+0

@ user3703595 Вы задаетесь вопросом о настройке вашей ОС, а не конкретном java-вопросе. Тем не менее, вы можете проверить, например, если вам нужен сокет для любого нового клиента. Вы слышали о java nio? (http://archive.oreilly.com/pub/a/onjava/2004/09/01/nio.html) – GhostCat

ответ

0

Переменные ulimit на самом деле не являются параметрами системы. Они устанавливаются в соответствии с атрибутами процесса и вложены детьми. Убедитесь, что вы запускаете свой Java-сервер из процесса, который уже поднял ulimit.

+0

Как я могу это сделать? Я просто набрал ulimit -n 4096 как root. – user3703595

+0

Поскольку вы можете запустить 4080 клиентов, я думаю, что это не проблема. Вам нужно запустить ulimit __before__, вы начинаете свой JAVA-процесс в той же оболочке –

0

Каждый дочерний процесс в UX наследует все дескрипторы открытых файлов из его родителя. Появление ребенка как клиента для работы в сети немного сложно, так как вам нужно явно закрыть все ненужные дескрипторы в ядре (I.e. 0, 1, 2 для stdin, out и err).

Это также относится к открытым сокетам (от старой политики «все является файлом»), поэтому, если у вас есть слушатель в сокете и порождает ребенка, у него уже открыт этот сокет. Вы можете дублировать этот сокет, но нужно закрыть оригинал у ребенка и т. Д.

Смежные вопросы