Come posso sapere se sono fuori dagli orologi inotify?


47

Uso un'applicazione che consuma gli orologi inotify. Ho già impostato

fs.inotify.max_user_watches=32768

in /etc/sysctl.confma ieri sera l'applicazione ha smesso di indicizzazione a meno che non ho eseguito manualmente, il che mi porta a sospettare io sono fuori di orologi.

Dal momento che non so quale sia il compromesso quando aumento questo numero (consuma più RAM?), Non so se dovrei semplicemente aumentare questo numero, quindi vorrei sapere se c'è un modo in cui può dire se sta usando tutti questi orologi e quali potrebbero essere i compromessi per aumentarlo.


Questa domanda è tornata di nuovo alquanto rilevante in quanto risulta nel 18.04 che lo sblocco dello schermo non è possibile se uno ha esaurito gli orologi inode.
Kasperd,

Risposte:


64

Come fai a sapere se sei senza orologi? la coda lo dirà!

  • Inizia tailcon l' -fopzione (segui) su qualsiasi vecchio file, ad esempio tail -f /var/log/dmesg:
    • Se tutto va bene, mostrerà le ultime 10 righe e si fermerà; interrompere con Ctrl-C
    • Se sei senza orologi , fallirà con questo errore un po 'criptico :
      tail: impossibile guardare '/ var / log / dmsg': nessuno spazio lasciato sul dispositivo

Per i curiosi: perché tail è un "telltail"?

  • In realtà, qualsiasi app ben scritta dovrebbe avere la cortesia di dirtelo, poiché l' API / le chiamate inotify dicono chiaramente qual è il contratto.
  • Prova strace tail -f ...invece, e quando ha successo, termina con:
    inotify_add_watch (4, "/ var / log / dmesg", IN_MODIFY ...) = 1
    
  • ma se fallisce, cioè sei senza orologi , dirà:
    inotify_add_watch (4, "/ var / log / dmesg", IN_MODIFY ..)
     = -1 ENOSPC (nessuno spazio lasciato sul dispositivo)
    

Puoi aumentare gli orologi? Di quanto? Qualche compromesso?

Risposta breve: certo, niente sudore. Vai direttamente a mezzo milione (524288) se vuoi ... la memoria aggiuntiva utilizzata dovrebbe essere trascurabile su un sistema moderno con 4 GB + di memoria.

  • Ogni orologio inotify utilizzato occupa 540 byte (sistema a 32 bit) o ​​1 kB (doppio - su 64 bit) [fonti: 1 , 2 ]
  • Questo viene fuori dalla memoria del kernel , che non è sostituibile.
  • Quindi, supponendo che tu abbia impostato il massimo a 524288 e che tutti fossero usati (improbabile), useresti ca. 256 MB / 512 MB di memoria del kernel a 32 bit / 64 bit

    • Si noti che l'applicazione utilizzerà anche memoria aggiuntiva per tenere traccia degli handle di inotify, dei percorsi di file / directory, ecc. - quanto dipende dal suo design.
  • Qual è il valore massimo? Immagino che nessuno, in teoria, purché tu abbia abbastanza RAM. In pratica, 524288 è stato ufficialmente raccomandato dalle app e le persone lo hanno impostato su 2 milioni , ovviamente con l'utilizzo della memoria.


5
Se anche tu vuoi conoscere il numero attuale di orologi inotify (quindi più di sì / no), sudo lsof | grep -i inotify | wc -l
scegli

2
link "ben scritto-app" interrotto.
Gaurav Sharma,

11

Non so se dovrei semplicemente aumentare questo numero

Il modo semplice per verificare se hai raggiunto il tuo max_user_watchesvalore è, con il tuo utente, utilizzare inotifywatchdal pacchetto inotify-toolse verificare se puoi ancora raccogliere informazioni da un file.

Ad esempio inotifywatch -v /home/bruno/.profileper me ritorna:

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

Quindi inotifynon ha problemi a creare un nuovo orologio, nessun problema qui.

Se hai raggiunto il limite massimo in inotify watch, ti verrà restituito qualcosa del genere

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

Se vedi qualcosa del genere, hai raggiunto il limite e dovrai aumentare il limite di orologi consentito.

Consuma più RAM?

Sì, lo fa. Ma secondo questo vecchio articolo la quantità che consuma è minima rispetto ad altri aspetti di un desktop in esecuzione.

--UTILIZZO DELLA MEMORIA--

Le strutture dati inotify sono leggere:

inotify watch è 40 byte inotify dispositivo è 68 byte inotify evento è 272 byte

Quindi supponendo che un dispositivo abbia 8192 orologi, le strutture consumeranno solo 320 KB di memoria. Con un numero massimo di 8 dispositivi consentiti per esistere alla volta, questo è ancora solo 2,5 MB

Ogni dispositivo può anche avere 256 eventi in coda alla volta, il che equivale a 68 KB per dispositivo. E solo 0,5 MB se tutti i dispositivi sono aperti e dispongono di una coda eventi completa.

Quindi, nel raro caso di tutto aperto e pieno, vengono utilizzati circa 3 MB di memoria.

Ogni orologio inotify inserisce l'inode di una directory / file in memoria, la dimensione di un inode è diversa per ogni file system, ma supponiamo che sia di 512 byte.

Quindi, supponendo che sia attivo il numero massimo di orologi globali, ciò bloccherebbe 32 MB di inode nella cache degli inode. Ancora una volta non è un problema su un sistema moderno.

Ovviamente suppongo che le cose non siano cambiate molto da quando l'articolo è stato scritto, ma guardando i numeri non mi preoccuperei e aumentare il limite non aumenterà molto il consumo di RAM.


Articoli correlati su inotify


Scusa amico, ieri ho aperto una bozza per alcune ore e non ho visto la tua risposta prima di pubblicare la mia. Immagino sia OK dato che hanno due approcci diversi :-) Potresti semplicemente chiarire che nei kernel recenti, inotify utilizza 0,5 KB (su 32 bit) o ​​1 KB (64 bit) di memoria del kernel per orologio, poiché le vecchie informazioni da Il 2005 non sembra più essere vero?
Ish,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.