У меня есть приложение, которое отображает большое количество файлов.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 тыс. Дескрипторов.
Я не уверен, куда идти дальше.Очевидно, что-то заставляет приложение выйти за пределы, но я совершенно не знаю, что делать дальше.Есть мысли?