Kernel inotify raggiunto limite di controllo raggiunto


206

Attualmente sto affrontando un problema su un box Linux dove come root ho dei 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 esempio, 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 alto?
  • 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?

Probabilmente lo hai già verificato da quando ha 8 mesi, ma l'unità è piena? "tail: impossibile guardare '/ var / log / messages': spazio libero sul dispositivo"
froggythefrog

Risposte:


273

È 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 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.
  • Supponendo di impostare il massimo su 524288 e tutti fossero usati (improbabile), si utilizzerebbero 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:

  • Esegui sudo sysctl fs.inotify.max_user_watches=con il tuo valore preferito alla fine.

Permanentemente ( informazioni più dettagliate ):

  • metti fs.inotify.max_user_watches=524288nelle tue impostazioni sysctl. A seconda del sistema in uso potrebbero trovarsi in uno dei seguenti luoghi:
    • Debian / RedHat: /etc/sysctl.conf
    • Arch: inserire un nuovo file /etc/sysctl.d/, ad es/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:

Utilizzare tailcon l' -fopzione (follow) su qualsiasi vecchio file, ad es . tail -f /var/log/dmesg: - Se tutto va bene, mostrerà le ultime 10 righe e si metterà in pausa; interrompi con Ctrl-C - Se sei fuori controllo , fallirà con questo errore un po 'criptico :

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

Per vedere cosa sta usando, inotifica gli orologi

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 indify fds (ma non il numero di watch) e la seconda mostra il PID di quel processo [fonti: 1 , 2 ].


3
I guess very few codes need the values higher than the defaultDropbox potrebbe richiedere un limite superiore, a seconda del numero di file che hai. Iv'e ha sollevato il mio senza problemi. infatti, la notifica dropbox (che si verifica quando raggiunge il suo limite) ti dice esplicitamente di aumentarla.
Falmarri,

1
@ ultrasawblade- inotify sostituito dnotify. dnotify era lento e pieno di errori. inotify può essere usato su directory e una directory verrà "cambiata" quando uno dei file in quella directory (a un livello di profondità) viene modificato. Le directory sono comunque solo file.
Beatgammit,

6
"Permanentemente: sostituisci il valore in / proc / sys / fs / inotify / max_user_watches" <- questo non è corretto. Per renderlo permanente devi cambiare/etc/sysctl.conf
Merc

3
sysctl! = systemd, nella tua spiegazione. E /etc/sysctl.dfunziona anche con i nuovi sistemi basati su RedHat.
aairey,

1
@stackexchanger se sei sicuro che siano simili (ad esempio, hai testato), invia e modifica la domanda. Io stesso non ho verificato e so che le distribuzioni tendono a correggere i pacchetti, quindi il comportamento potrebbe essere diverso per gli stessi pacchetti. Questo per non parlare delle differenze anche nelle versioni dei pacchetti.
Tshepang,
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.