Zbyt wiele otwartych plików - jak znaleźć winowajcę

69

Podczas pracy tail -f filenameotrzymałem następujący komunikat:

tail: inotify cannot be used, reverting to polling: Too many open files

Czy to potencjalny problem?

Jak zdiagnozować, co odpowiada za wszystkie otwarte pliki? Mam listę podejrzanych procesów, ale jeśli nie okażą się winowajcami, przydatne będą instrukcje, które nie polegają na wiedzy, który proces sprawdzić.

Andrew Grimm
źródło
1
Czy zwiększyłeś liczbę dostępnych deskryptorów plików za pośrednictwem ulimit?
Ignacio Vazquez-Abrams
2
@ IgnacioVazquez-Abrams To może być pomocne dla innych użytkowników, ale dla mnie byłoby to raczej leczenie symptomu niż choroby.
Andrew Grimm,
Chociaż się nie mylisz, czasami aplikacje mają uzasadnione powody, dla których wiele plików jest otwartych.
Ignacio Vazquez-Abrams

Odpowiedzi:

71

Możesz użyć lsof, aby zrozumieć, kto otwiera tak wiele plików. Zwykle jest to serwer (internetowy), który otwiera tak wiele plików, ale lsof z pewnością pomoże ci zidentyfikować przyczynę.

Kiedy zrozumiesz, kto jest złym facetem, możesz

Jeśli dane wyjściowe z lsof są dość duże, spróbuj przekierować je do pliku, a następnie otwórz plik

Przykład (może być konieczne Ctrl+ Cpierwsze polecenie)

lsof > ~/Desktop/lsof.log
cat ~/Desktop/lsof.log | awk '{ print $2 " " $1; }' | sort -rn | uniq -c | sort -rn | head -20
vim ~/Desktop/lsof.log
Andrea Olivato
źródło
37
Dla leniwych:lsof | awk '{ print $2; }' | uniq -c | sort -rn | head
itsadok
1
Wystąpił ten sam błąd i użycie ulimit nie działa. Polecenie tail -F nadal zwraca błąd. Zwiększyłem limit z 1024 do 3000, więc wyobrażam sobie, że do tego czasu mam wystarczająco dużo miejsca ... Chyba musiałbym zrestartować komputer!
Alexis Wilke
15
Uważam, że linia jego adok jest pomocna, ale myślę, że powinieneś najpierw posortować (ponieważ uniqdziała tylko z sąsiednimi liniami), uruchomić uniq, a następnie posortować ponownie. Tak lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head.
Tyler Collier
19
Sortowanie i zliczanie najbardziej otwartych plików jest zdecydowanie najlepszą rzeczą do zrobienia. Pokaż nazwę procesu oraz pid: '' lsof | awk '{print 2 $ "1 $; } „| sort -rn | uniq -c | sort -rn | głowa -20 ''
gaoithe
2
@ gaoithe, jeśli umieścisz to w odpowiedzi, chętnie ją poprę:)
Matt Ball
23

Jeśli ktoś tego potrzebuje ...

ulimit -a

Wyświetli wszystkie aktualne limity. W szczególności ulimit -n 70000ustawi limit deskryptora pliku.

Również...

cat /proc/sys/fs/file-max

Wyświetli / ustawi limit jądra, jeśli będzie edytowany.

sudo echo 200000 > /proc/sys/fs/file-max

Bardziej szczegółowe wyjaśnienie można znaleźć na ...

Jak zwiększyć limit otwartych plików dla użytkownika innego niż root?

Kervin
źródło
3
istnieją limity, dzięki czemu możesz zachować ścisłą kontrolę nad wykorzystaniem zasobów w systemie. Najlepiej jest je zwiększać indywidualnie dla procesów, o których wiesz, że będziesz musiał użyć wielu deskryptorów plików. Utrzymując je w teście podczas testów, znajdziesz procesy, które mogą z czasem wyciekać deskryptory plików. Zauważ również, że uchwyty plików są używane do dowolnego dostępu do urządzenia w unix / linux. np. każde gniazdo sieciowe otwarte przez proces używa uchwytu pliku. To wyjaśnia, dlaczego możesz trafić „zbyt wiele otwartych plików” w przypadku zwykłych plików systemu plików, a także dowolnych plików urządzeń, takich jak połączenia sieciowe.
Gaoithe,