Как открыть 20000 клиентов в Java без увеличения лимита файлов? - PullRequest
1 голос
/ 29 апреля 2009

Всякий раз, когда я открываю канал сокета. Если клиент принимает, то внутри создается 1 файловый дескриптор, поэтому я могу создать максимум 1024 клиента в Linux. Но я хочу создать больше клиентов без увеличения лимита дескриптора файла в Linux (ulimit -n 20000) Итак, как я могу создать больше сокетов в Java?

Ответы [ 6 ]

2 голосов
/ 29 апреля 2009

Ограничение RLIMIT_NOFILE применяется операционной системой и ограничивает максимальное значение fd, которое может создать процесс. Один fd используется для каждого открытого файла, канала и сокета.

Существуют жесткие и мягкие ограничения. Любому процессу (например, вашей оболочке или jvm) разрешено изменять значение soft, но только привилегированный процесс (например, оболочка, запускаемая пользователем root) может изменить значение hard.

a) Если вам не разрешено изменять лимит на машине, найдите кого-то, кто является

b) Если вы по какой-то причине не можете ввести ulimit, я думаю, вы можете вызвать базовый системный вызов с помощью JNA: man setrlimit (2) . (.exec () не будет работать, поскольку это встроенная команда)

См. Также Работа с Ulimit

2 голосов
/ 29 апреля 2009

Почему вы не можете увеличить предел? Это похоже на искусственное ограничение. В Java-коде (afaik) нет способа, позволяющего получить доступ к системе для сброса ulimit - его необходимо установить до запуска процесса - в сценарии запуска или в чем-то подобном.

Скрипты запуска JBoss формируют ulimit -n $ MAX_FD перед запуском Jboss ...

Len

2 голосов
/ 29 апреля 2009

Если вы используете UDP, можете ли вы мультиплексировать один локальный сокет самостоятельно? Вы сможете разделять входящие пакеты по их исходному адресу и порту.

Если это TCP, вам не повезло, и период TIME_WAIT после закрытия каждого сокета ухудшит ситуацию.

2 голосов
/ 29 апреля 2009

Если ваша сессия ограничена 1024 дескрипторами файлов, вы не можете использовать больше, чем с одной JVM.

Но поскольку ulimit является ограничением для каждого процесса, вы, вероятно, можете обойти его, запустив больше JVM (то есть, чтобы получить 2048 соединений, запустите две JVM, каждая из которых использует 1024).

1 голос
/ 29 апреля 2009

Мы недавно увеличили наш ulimit, потому что наш java-процесс выдавал множество исключений «слишком много файлов открыто».

Сейчас 65536, и у нас не было никаких проблем.

0 голосов
/ 29 апреля 2009

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

Таким образом, когда каждый сервер данных насыщается, вы просто создаете новый экземпляр, чтобы дать себе еще 1024 соединения. Вы даже можете иметь их на отдельных машинах, если это необходимо.

...