Не хватает дескрипторов файлов для файлов mmaped, несмотря на высокие ограничения в многопоточном веб-приложении - PullRequest
1 голос
/ 10 марта 2011

У меня есть приложение, которое отображает большое количество файлов.3000+ или около того.Он также использует около 75 рабочих потоков.Приложение написано на смеси Java и C ++, при этом код Java-сервера вызывается в C ++ через JNI.

В нем часто, хотя и не предсказуемо, заканчиваются файловые дескрипторы.Я поднял ограничения в /etc/security/limits.conf до:

* hard nofile 131072

/ proc / sys / fs / file-max - 101752. Система представляет собой Linode VPS с Ubuntu 8.04 LTS с ядром2.6.35.4.

Сбой открытия из битов Java и C ++ кода после определенной точки.Netstat не показывает большое количество открытых сокетов («netstat -n | wc -l» меньше 500).Количество открытых файлов в lsof или / proc / {pid} / fd составляет примерно ожидаемое 2000-5000.

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

Есть пара других свободных тем, которые заставляют меня задуматься, предлагают ли они какую-либо информацию:

  • Поскольку процесс имеет около 75 потоков, если файлы mmaped каким-то образом занимают один файловый дескриптор на поток, номера суммируются.Тем не менее, при рекурсивном подсчете вещей в / proc / {pid} / tasks / * / fd в настоящее время перечисляется 215575 fds, поэтому может показаться, что он уже выходит за пределы, а это не так, что кажется маловероятным.1016 *

  • Apache + Passenger также работает в том же боксе и занимает второе место по количеству дескрипторов файлов, но даже с дочерними процессами ни один из этих процессов не весит более 10 тыс. Дескрипторов.

Я не уверен, куда идти дальше.Очевидно, что-то заставляет приложение выйти за пределы, но я совершенно не знаю, что делать дальше.Есть мысли?

Ответы [ 2 ]

1 голос
/ 20 мая 2011

Итак, насколько я могу судить, похоже, это проблема, специфичная для Ubuntu 8.04. После обновления до 10.04 через месяц не было ни одного случая этой проблемы. Конфигурация не изменилась, поэтому я уверен, что это ошибка ядра.

0 голосов
/ 01 апреля 2011

ваша установка использует огромный кусок кода, который может быть также виновен в утечке; JVM. Возможно, вы можете переключиться между солнцем и jvms с открытым исходным кодом, чтобы проверить, не является ли этот код невиновным. Также существуют различные стратегии сборщика мусора, доступные для jvm. Использование другого или другого размера приведет к большему или меньшему количеству сборщиков мусора (что в Java включает закрытие дескриптора).

Я знаю, что это немного надумано, но похоже, что все другие варианты, которые вы уже использовали;)

...