2010-01-24 2 views
9

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

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

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

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

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

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

Это на 2,16 ГГц Intel Core 2 Duo iMac, работающем на Snow Leopard.

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

Является ли мой тест необоснованным? То есть Неужели глупо открывать одновременно 100 одновременных соединений для проверки параллельности параллельности Yaws?

Спасибо.

+0

Не указывает ли 'socket_closed_remotely', что проблема в клиенте? – Zed

+0

Обновлен мой ответ после редактирования, возможно, это потому, что вы открываете их все одновременно. – stacker

+0

Zed: сообщение об ошибке со стороны клиента, поэтому Yaws закрывает сокет. Я не вижу ничего, что можно было бы зарегистрировать в Yaws. – ckovacs

ответ

0

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

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

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

+0

Ну, конечно, вы не отвечаете на неправильный ответ. – Farsheed

6

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

$ ulimit -n 500 

Python on Snow Leopard, how to open >255 sockets?

самого Erlang имеет предел 1024:

От http://www.erlang.org/doc/man/erlang.html

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

EDIT:

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

+1

Если максимальные порты были исчерпаны, ошибка будет 'enfile', а не' socket_closed_remotely'. – Zed

+0

Извините, я забыл упомянуть, что я установил ERL_MAX_PORTS на 12000 как на OS X, так и на Vista. – ckovacs

+0

Также попробовал установить ulimit с тем же результатом – ckovacs

3

Всех пределов системы Erlang приведен в Руководстве по эффективности Erlang:

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

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

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

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