Skąd mam wiedzieć, czy nie mam zegarków Inotify?

47

Korzystam z aplikacji, która zużywa zegarki Inotify. Mam już ustawione

fs.inotify.max_user_watches=32768

w /etc/sysctl.confale ostatniej nocy aplikacja zatrzymana indeksowanie chyba że prowadził ją ręcznie, co skłania mnie do podejrzeń, jestem z zegarków.

Ponieważ nie wiem, na czym polega kompromis, gdy zwiększam tę liczbę (czy zużywa więcej pamięci RAM?), Nie wiem, czy powinienem po prostu zwiększyć tę liczbę, więc chciałbym wiedzieć, czy jest jakiś sposób może stwierdzić, czy używa wszystkich tych zegarków i jakie mogą być kompromisy w jego zwiększaniu.

Jorge Castro
źródło
To pytanie znów stało się dość aktualne, ponieważ okazuje się, że w 18.04 odblokowanie ekranu nie jest możliwe, jeśli zabraknie zegarków i-węzłowych.
kasperd

Odpowiedzi:

64

Skąd wiesz, że nie masz zegarków? ogon powie!

  • Zacznij tailod opcji -f(Follow) w dowolnym starym pliku, np . tail -f /var/log/dmesg:
    • Jeśli wszystko jest w porządku, wyświetli 10 ostatnich linii i pauza; przerwać za pomocą 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

Dla ciekawskich: dlaczego ogon to „gadżet”?

  • W rzeczywistości każda dobrze napisana aplikacja powinna mieć uprzejmość, aby ci powiedzieć, ponieważ interfejs API / połączenia inotify wyraźnie mówi im, o co chodzi.
  • Spróbuj strace tail -f ...zamiast tego, a gdy się powiedzie, kończy się na:
    inotify_add_watch (4, "/ var / log / dmesg", IN_MODIFY ...) = 1
    
  • ale jeśli zawiedzie, tzn. nie masz zegarków , powie:
    inotify_add_watch (4, "/ var / log / dmesg", IN_MODIFY ..)
     = -1 ENOSPC (Brak miejsca na urządzeniu)
    

Czy możesz zwiększyć zegarki? O ile? Jakieś kompromisy?

Krótka odpowiedź: Jasne, nie ma potu. Przejdź bezpośrednio do pół miliona (524288), jeśli chcesz ... dodatkowa pamięć powinna być nieistotna w nowoczesnym systemie z 4 GB + pamięci.

  • 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), użyłbyś 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.
  • Jaka jest maksymalna wartość? Teoretycznie nie sądzę, dopóki masz wystarczającą ilość pamięci RAM. W praktyce 524288 jest oficjalnie zalecane przez aplikacje , a ludzie ustawiają go na 2 miliony , oczywiście przy zużyciu pamięci.

ish
źródło
5
Jeśli chcesz również poznać aktualną aktualną liczbę zegarków inotify (a więc więcej niż tak / nie), idźsudo lsof | grep -i inotify | wc -l
Frank Nocke
2
Uszkodzony link „dobrze napisanej aplikacji”.
Gaurav Sharma
11

Nie wiem, czy powinienem tylko zwiększyć tę liczbę

Najłatwiejszym sposobem sprawdzenia, czy osiągnąłeś swoją max_user_watcheswartość, jest użycie inotifywatchprzez użytkownika z paczki inotify-toolsi sprawdzenie, czy nadal możesz zbierać informacje z pliku.

Na przykład inotifywatch -v /home/bruno/.profiledla mnie zwraca:

Establishing watches...
Total of 1 watches.
Finished establishing watches, now collecting statistics.

Więc inotifynie ma problemów z tworzeniem nowego zegarka, żadnych problemów tutaj.

Jeśli osiągnąłeś maksymalny limit w zegarkach inotify, zwróci coś w rodzaju

Failed to watch /home/bruno/.profile; upper limit on inotify watches reached!

Jeśli zobaczysz coś takiego, oznacza to, że osiągnąłeś limit i musisz zwiększyć dozwolony limit zegarków.

Czy zużywa więcej pamięci RAM?

Tak. Ale według tego starego artykułu ilość zużywana przez użytkownika jest minimalna w porównaniu z innymi aspektami działającego pulpitu.

--ZUŻYCIE PAMIĘCI--

Struktury danych inotify są lekkie:

zegarek inotify ma 40 bajtów urządzenie inotify ma 68 bajtów inotify zdarzenie ma 272 bajty

Zakładając, że urządzenie ma 8192 zegarków, struktury zużyją tylko 320 KB pamięci. Przy maksymalnej liczbie 8 urządzeń, które mogą istnieć jednocześnie, jest to nadal tylko 2,5 MB

Każde urządzenie może mieć jednocześnie 256 zdarzeń w kolejce, co daje 68 KB na urządzenie. I tylko 0,5 MB, jeśli wszystkie urządzenia są otwarte i mają pełną kolejkę zdarzeń.

Tak więc około 3 MB pamięci jest używanych w rzadkim przypadku wszystkiego, co jest otwarte i pełne.

Każdy zegarek inotify przypina i-węzeł katalogu / pliku do pamięci, rozmiar i-węzła jest różny w zależności od systemu plików, ale można założyć, że ma 512 bajtów.

Zakładając, że maksymalna liczba globalnych zegarków jest aktywna, oznaczałoby to 32 MB i-węzłów w pamięci podręcznej i-węzłów. Znowu nie ma problemu w nowoczesnym systemie.

Oczywiście zakładam, że wiele się nie zmieniło od czasu napisania artykułu, ale patrząc na liczby nie martwiłem się, a zwiększenie limitu nie zwiększy znacznie zużycia pamięci RAM.


Powiązane posty na temat inotify

Bruno Pereira
źródło
Przepraszam stary, miałem wczoraj szkic przez kilka godzin i nie widziałem twojej odpowiedzi, zanim opublikowałem mój. Wydaje mi się, że jest OK, ponieważ mają dwa różne podejścia :-) Czy możesz wyjaśnić, że w ostatnich jądrach inotify używa 0,5 KB (na 32-bitach) lub 1 KB (na 64-bitach) pamięci jądra na zegarek, ponieważ stare informacje z 2005 nie wydaje się już prawdą?
ish