Osiągnięto limit obserwacji inotify jądra

206

Obecnie mam problem z linuksem, w którym jako root mam polecenia zwracające błąd, ponieważ osiągnięto limit obserwowania inotify.

# tail -f /var/log/messages
[...]
tail: cannot watch '/var/log/messages': No space left on device
# inotifywatch -v /var/log/messages
Establishing watches...
Failed to watch /var/log/messages; upper limit on inotify watches reached!
Please increase the amount of inotify watches allowed per user via '/proc/sys/fs/inotify/max_user_watches'.` 

Trochę googlowałem i każde znalezione przeze mnie rozwiązanie polega na zwiększeniu limitu o:

sudo sysctl fs.inotify.max_user_watches=<some random high number>

Ale nie byłem w stanie znaleźć żadnych informacji na temat konsekwencji podniesienia tej wartości. Domyślam się, że domyślna wartość jądra została ustawiona z jakiegoś powodu, ale wydaje się, że jest nieodpowiednia do określonych zastosowań. (np. w przypadku korzystania z Dropbox z dużą liczbą folderów lub oprogramowania, które monitoruje wiele plików)

Oto moje pytania:

  • Czy podniesienie tej wartości jest bezpieczne i jakie byłyby konsekwencje zbyt wysokiej wartości?
  • Czy istnieje sposób, aby dowiedzieć się, jakie są obecnie ustawione zegarki i który proces ustawia je, aby móc ustalić, czy osiągnięty limit nie jest spowodowany przez wadliwe oprogramowanie?
Ultraspider
źródło
Prawdopodobnie już to sprawdziłeś, ponieważ ma on 8 miesięcy, ale czy Twój dysk jest pełny? „tail: nie można oglądać” / var / log / messages ”: Brak miejsca na urządzeniu”
froggythefrog

Odpowiedzi:

273

Czy podniesienie tej wartości jest bezpieczne i jakie byłyby konsekwencje zbyt wysokiej wartości?

Tak, bezpiecznie jest podnieść tę wartość, a poniżej są możliwe koszty [ źródło ]:

  • Każdy używany zegarek inotify zajmuje 540 bajtów (system 32-bitowy) lub 1 kB (podwójnie - w wersji 64-bitowej) [źródła: 1 , 2 ]
  • Wynika to z pamięci jądra , której nie można zamienić.
  • Zakładając, że ustawiłeś maksimum na 524288 i wszystkie były używane (nieprawdopodobne), będziesz używać około 256 MB / 512 MB 32-bitowej / 64-bitowej pamięci jądra.
    • Zauważ, że twoja aplikacja będzie używać dodatkowej pamięci do śledzenia uchwytów inotify, ścieżek do plików / katalogów itp. - ile zależy od ich projektu.

Aby sprawdzić maksymalną liczbę zegarków inotify:

cat /proc/sys/fs/inotify/max_user_watches

Aby ustawić maksymalną liczbę zegarków inotify

Tymczasowo:

  • Uruchom sudo sysctl fs.inotify.max_user_watches=na końcu z preferowaną wartością.

Na stałe ( bardziej szczegółowe informacje ):

  • wstaw fs.inotify.max_user_watches=524288do ustawień sysctl. W zależności od systemu mogą znajdować się w jednym z następujących miejsc:
    • Debian / RedHat: /etc/sysctl.conf
    • Arch: wstaw nowy plik /etc/sysctl.d/, np/etc/sysctl.d/40-max-user-watches.conf
  • możesz ponownie załadować ustawienia sysctl, aby uniknąć ponownego uruchomienia komputera: sysctl -p(Debian / RedHat) lub sysctl --system(Arch)

Sprawdź, czy osiągnięto maksymalną liczbę zegarków inotify:

Użyj tailz -fopcją (śledź) na dowolnym starym pliku, np . tail -f /var/log/dmesg: - Jeśli wszystko jest w porządku, wyświetli 10 ostatnich linii i pauza; przerwij z Ctrl-C - jeśli nie masz zegarków , zakończy się niepowodzeniem z tym nieco tajemniczym błędem :

tail: nie można oglądać „/ var / log / dmsg”: Brak miejsca na urządzeniu

Aby zobaczyć, co zużywa zegarki inotify

find /proc/*/fd -lname anon_inode:inotify |
   cut -d/ -f3 |
   xargs -I '{}' -- ps --no-headers -o '%p %U %c' -p '{}' |
   uniq -c |
   sort -nr

Pierwsza kolumna wskazuje liczbę niezotwierdzonych fds (ale nie liczbę zegarków), a druga pokazuje PID tego procesu [źródła: 1 , 2 ].

tshepang
źródło
3
I guess very few codes need the values higher than the defaultDropbox może wymagać wyższego limitu, w zależności od liczby posiadanych plików. Iv'e podniosła moją bez żadnych problemów. w rzeczywistości powiadomienie dropbox (które pojawia się, gdy osiągnie limit) wyraźnie mówi o jego podniesieniu.
Falmarri,
1
@ ultrasawblade- inotify zastąpiony dnotify. dnotify było powolne i błędne. Inotify może być używany w katalogach, a katalog zostanie „zmieniony”, gdy jeden z plików w tym katalogu (głębokość jednego poziomu) zostanie zmodyfikowany. Katalogi i tak są tylko plikami.
beatgammit,
6
„Na stałe: zamień wartość w / proc / sys / fs / inotify / max_user_watches” <- to jest niepoprawne. Aby to zmienić na stałe , musisz zmienić/etc/sysctl.conf
Merc
3
sysctl! = systemd, w twoim objaśnieniu. A /etc/sysctl.dtakże działa na nowszych systemach RedHat oparte.
aairey
1
@stackexchanger, jeśli jesteś bardzo pewien, że są one podobne (np. przetestowałeś), prześlij i edytuj pytanie. Sam nie sprawdziłem i wiem, że dystrybucje zwykle łatają pakiety, więc zachowanie może być inne dla tych samych pakietów. Nie wspominając o różnicach w wersjach pakietów.
tshepang