Jetty IOException: слишком много открытых файлов - PullRequest
9 голосов
/ 12 июня 2011

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

java.io.IOException: Too many open files
    at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
    at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:163)
    at org.mortbay.jetty.nio.SelectChannelConnector$1.acceptChannel(SelectChannelConnector.java:75)
    at org.mortbay.io.nio.SelectorManager$SelectSet.doSelect(SelectorManager.java:673)
    at org.mortbay.io.nio.SelectorManager.doSelect(SelectorManager.java:192)
    at org.mortbay.jetty.nio.SelectChannelConnector.accept(SelectChannelConnector.java:124)
    at org.mortbay.jetty.AbstractConnector$Acceptor.run(AbstractConnector.java:708)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

На минуту или две. Я сделал "причал lsof -u" и увидел сотни строк:

java    15892 jetty 1020u  IPv6          298105434        0t0       TCP 192.168.1.100:http-alt->192.168.1.100:60839 (ESTABLISHED)
java    15892 jetty 1021u  IPv6          298105438        0t0       TCP 192.168.1.100:http-alt->192.168.1.100:60841 (ESTABLISHED)
java    15892 jetty 1022u  IPv6          298105441        0t0       TCP 192.168.1.100:http-alt->192.168.1.100:60842 (ESTABLISHED)
java    15892 jetty 1023u  IPv6          298105443        0t0       TCP 192.168.1.100:http-alt->192.168.1.100:60843 (ESTABLISHED)

Где 192.168.1.100 - внутренний IP-адрес сервера.

Как видите, это привело к тому, что число открытых файлов достигло максимального значения по умолчанию, равного 1024. Я мог бы просто увеличить это, но мне интересно, почему это происходит в первую очередь? Он находится в акцепторе сокетов nio Jetty, так что это вызвано штормом запросов на соединение?

1 Ответ

11 голосов
/ 13 июня 2011

Несмотря на то, что в Jetty может быть ошибка, я думаю, что более вероятным объяснением является то, что ваши ограничения открытых файлов слишком малы. Обычно 1024 по умолчанию просто недостаточно для веб-серверов с умеренным использованием.

Хороший способ проверить это - использовать Apache Bench для имитации входящего трафика, который вы видите. Выполнение этого на удаленном хосте будет генерировать 1000 запросов через 10 одновременных подключений.

ab -c 10 -n 1000 [http://]hostname[:port]/path

Теперь посчитайте сокеты на вашем веб-сервере, используя netstat ...

netstat -a | grep -c 192.168.1.100

Надеюсь, вы обнаружите, что ваши сокеты будут иметь плато при некотором значении, не намного превышающем 1024 (у меня 16384).

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

netstat -a | grep -c CLOSE_WAIT

Если вы видите, что это число продолжает расти в течение жизненного цикла вашего приложения, возможно, вам не хватает нескольких вызовов Connection.close ().

...