it-swarm.it

Il kernel ha inotificato il limite di controllo raggiunto

Attualmente sto affrontando un problema su un box Linux dove come root ho comandi che restituiscono errori perché è stato raggiunto il limite di inotify watch.

# 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'.` 

Ho cercato su Google un po 'e ogni soluzione che ho trovato è di aumentare il limite con:

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

Ma non sono riuscito a trovare alcuna informazione sulle conseguenze dell'aumento di tale valore. Immagino che il valore predefinito del kernel sia stato impostato per un motivo, ma sembra essere inadeguato per usi particolari. (ad es. quando si utilizza Dropbox con un numero elevato di cartelle o software che monitora molti file)

Quindi, ecco le mie domande:

  • È sicuro aumentare quel valore e quali sarebbero le conseguenze di un valore troppo elevato?
  • C'è un modo per scoprire quali sono gli orologi attualmente impostati e quale processo li ha impostati per essere in grado di determinare se il limite raggiunto non è causato da un software difettoso?
221
Ultraspider

È sicuro aumentare quel valore e quali sarebbero le conseguenze di un valore troppo alto?

Sì, è sicuro aumentare quel valore e di seguito sono riportati i possibili costi [ fonte ]:

  • Ogni usato inotify watch occupa 540 byte (sistema a 32 bit) o ​​1 kB (doppio - su 64 bit) [fonti: 1 , 2 ]
  • Questo viene fuori da memoria del kernel, che non è sostituibile.
  • Supponendo che tu imposti il ​​massimo a 524288 e tutti fossero usati (improbabile), useresti circa 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.

Per verificare il numero massimo di orologi inotify:

cat /proc/sys/fs/inotify/max_user_watches

Per impostare il numero massimo di orologi inotify

Temporaneamente:

  • Correre Sudo sysctl fs.inotify.max_user_watches= con il tuo valore preferito alla fine.

Permanentemente ( informazioni più dettagliate ):

  • mettere fs.inotify.max_user_watches=524288 nelle tue impostazioni di sistema. A seconda del sistema in uso potrebbero trovarsi in uno dei seguenti luoghi:
    • Debian/RedHat: /etc/sysctl.conf
    • Arch: inserisci un nuovo file in /etc/sysctl.d/, per esempio. /etc/sysctl.d/40-max-user-watches.conf
  • potresti voler ricaricare le impostazioni di sysctl per evitare un riavvio: sysctl -p (Debian/RedHat) o sysctl --system (Arch)

Verifica se è stato raggiunto il numero massimo di orologi inotify:

Usa tail con -f (segui) opzione su qualsiasi vecchio file, ad es. tail -f /var/log/dmesg: - Se tutto va bene, mostrerà le ultime 10 righe e si fermerà; annulla con Ctrl-C - Se non hai più gli orologi , fallirà con questo errore un po 'criptico :

tail: impossibile guardare '/ var/log/dmsg': nessuno spazio lasciato sul dispositivo

Per vedere cosa sta usando inotify watch

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

La prima colonna indica il numero di inotify fds (ma non il numero di watch) e la seconda mostra il PID di quel processo [fonti: 1 , 2 ].

294
tshepang