2010-11-16 2 views
3

Мы попали в странный вопрос на одном из серверов клиентов, где Java сталкивается «Слишком много файлов»,Охота на «слишком много файлов» вызывают

Проверка дескрипторов с помощью LSOF производит большой список «носка» дескрипторы с «невозможно определить протокол».

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

Есть ли хороший способ определить, какие потоки точно открывают эти сокеты?

Спасибо.

ответ

2

Есть ли хороший способ определить, какие нити точно открывают эти сокеты?

Не теги per se.

Один из подходов - запустить приложение с использованием профилировщика. Это может найти проблему, даже если вы не можете точно воспроизвести проблему клиента. (@SyBer сообщает, что YourKit профайлер имеет конкретную поддержку для поиска утечек сокетов ... см комментария.)

Второго подхода заключается в настройках тестовой платформы с помощью ulimit, чтобы уменьшить число открытых файлов, разрешенных. Это может облегчить воспроизведение сценария «слишком много файлов» в тестовой среде.

Наконец, я бы рекомендовал «grepping» ваш код, чтобы найти все места, где создаются объекты сокета. Затем изучите их все, чтобы убедиться, что они правильно используют блоки try/finally, чтобы гарантировать, что сокеты всегда закрыты.

+0

«Один из подходов - запустить приложение с использованием профилировщика. Это может найти проблему, даже если вы не можете точно воспроизвести проблему клиента». Может ли профайлер поймать такие проблемы? – SyBer

+0

Соответствующее использование профилировщика может обнаружить наличие утечки ресурса (например, Socket), которая в противном случае не может быть замечена. –

+0

Мы выяснили, что профилировщик MyKit имеет встроенный мониторинг сокетов, что очень полезно для поиска открытых сокетов, и это в конечном итоге решило все наши дескрипторы утечек. – SyBer

1

Вы попробовали ulimit, чтобы увеличить количество открытых файлов? Кроме того, возможно, что вы не закрываете свои сокеты должным образом, поэтому у вас есть утечка.

+0

Я могу это сделать, но это будет действительно временное решение, пока оно не вырастет снова.Мы пытаемся закрыть сокеты, но, похоже, действительно забыто. – SyBer

0

Единственный «хороший» метод обнаружения утечек сокетов - это очень подробный журнал или профилировщик. Сделайте дамп памяти и проанализируйте объекты.

2

Начинают

netstat -ano | grep $YOUR_PROCESS_ID - для UNIX

netstat -ano | find "$YOUR_PROCESS_ID" - для окон

По крайней мере, вы будете видеть, действительно ли существует связь.

+0

На Ubununtu вам может потребоваться передать опцию '--program' в netstat, чтобы вывести идентификатор процесса (т. Е. PID). – rudolph9

0

Valgrind будет идентифицировать утечку дескриптора файла, если вы пройдете --track-fds=yes. Valgrind генерирует короткие следы стека в точке «получения» ресурсов, которые он отслеживает. Когда вы находите исходные строки, происходит утечка, вы можете комбинировать это значение с возвращаемым значением pthread_self в вашей системе ведения журнала (я уверен вы бы использовали его!), Или поместите breakpoints в gdb.

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

+1

Valgrind для C/C++, а не для Java. –

+0

«На небесах и на земле есть еще вещи, Горацио» :). Спасибо, в любом случае. – SyBer

+0

Нет ничего плохого в использовании сочетаний 'java' и' linux'. –

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