Максимальное количество одновременно открытых портов Erlang?

Есть ли у библиотеки erlang TCP/IP какие-либо ограничения? Я сделал некоторые поиски, но не могу найти никаких окончательных ответов.

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

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

Я обнаружил, что когда я получаю около 100 клиентов, сервер Yaws перестает принимать больше TCP-соединений, и клиент выдает ошибку с

Error in process  with exit value: {{badmatch,{error,socket_closed_remotely}}

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

Это на 2,16 ГГц Intel Core 2 Duo iMac под управлением Snow Leopard.

Быстрый тест на Vista Machine показывает, что у меня возникают те же проблемы примерно при 300 подключениях.

Является ли мой тест необоснованным? т.е. Глупо открывать более 100 соединений одновременно для проверки параллелизма Yaws?

Спасибо.


person ckovacs    schedule 24.01.2010    source источник
comment
Разве socket_closed_remotely не предполагает, что проблема в клиенте?   -  person Zed    schedule 24.01.2010
comment
Обновил мой ответ после вашего редактирования, возможно, это потому, что вы открываете их все одновременно.   -  person stacker    schedule 24.01.2010
comment
Зед: Сообщение об ошибке исходит от клиента, поэтому Yaws закрывает сокет. Я не вижу ничего зарегистрированного в Yaws.   -  person ckovacs    schedule 25.01.2010
comment
Добавление задержки в 100 мс между созданием клиентов позволяет мне иметь около 900 из 1000 запросов на подключение. Я проведу дополнительные тесты для службы Java Axis, чтобы определить, является ли это ограничением, связанным с ОС или Erlang.   -  person ckovacs    schedule 25.01.2010
comment
ERL_MAX_PORTS афаик не для сетевых портов, а для портов erlang (способ запускать программы как клиенты erlang) - см. port_open().   -  person ZeissS    schedule 09.02.2010
comment
IIRC в прошлом были проблемы со многими портами/сокетами в OSX. Это также может повлиять на эту проблему.   -  person I GIVE CRAP ANSWERS    schedule 18.12.2011


Ответы (3)


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

$ ulimit -n 500

Python на Snow Leopard, как открыть ›255 сокетов?

Сам Эрланг имеет ограничение в 1024:

Из http://www.erlang.org/doc/man/erlang.html

Максимальное количество портов, которые могут быть открыты одновременно, по умолчанию равно 1024, но их можно настроить с помощью переменной среды ERL_MAX_PORTS.

РЕДАКТИРОВАТЬ:

Системный вызов listen() имеет параметр невыполненной работы, который определяет, сколько запросов может быть поставлено в очередь, проверьте, помогает ли задержка между запросами на установление соединений. Это может быть вашей проблемой.

person stacker    schedule 24.01.2010
comment
Если бы максимальное количество портов было исчерпано, ошибка была бы enfile, а не socket_closed_remotely. - person Zed; 24.01.2010
comment
Извините, я забыл упомянуть, что я установил ERL_MAX_PORTS на 12000 как для OS X, так и для Vista. - person ckovacs; 24.01.2010

Все ограничения системы Erlang указаны в Руководстве по эффективности Erlang:

http://erlang.org/doc/efficiency_guide/advanced.html#id2265856

Чтение из раздела открытые порты:

Максимальное количество одновременно открытых портов Erlang по умолчанию равно 1024. Это ограничение может быть увеличено максимум до 268435456 при запуске (см. переменную среды ERL_MAX_PORTS в erlang(3)) битная архитектура недоступна из-за нехватки памяти.

person Roberto Aloi    schedule 28.01.2010

Попробовав все предложения и изучив документы Erlang, я пришел к выводу, что моя проблема в том, что Yaws не справляется с нагрузкой.

На том же компьютере веб-сервер Apache Http Components (неблокирующий ввод-вывод) не имеет таких же проблем с обработкой соединений с теми же пороговыми значениями.

Спасибо за вашу помощь. Я собираюсь перейти к другим веб-серверам на основе erlang, таким как Mochiweb.

person ckovacs    schedule 08.02.2010
comment
Ну, конечно, ваш ответ не является правильным, чтобы проверить его как правильный ответ. - person Farshid Ashouri; 01.09.2017