Troppi file aperti su Debian


15

Ho un lungo processo in Debian. Ad un certo punto viene generato un errore:

Troppi file aperti.

In esecuzione:

ulimit -a

Spettacoli:

file aperti (-n) 1024

Vorrei aumentare il numero di file aperti in 2 volte. Dopo l'esecuzione

ulimit -n 2048

il limite è attivo fino alla fine della mia sessione, che non è applicabile per l'attività.

Come posso aumentare in modo permanente il numero di file aperti?

Risposte:


12

Se il processo viene avviato tramite uno script, è possibile effettuare la chiamata a ulimit nello script appena prima dell'esecuzione del daemon.

Se si desidera aumentare l'ulimit per l'utente o per tutti gli utenti, è possibile impostare limiti che vengono applicati tramite pam_limitsl'accesso. Questi sono impostati in /etc/security/limits.conf. Nel tuo caso, potresti fare qualcosa del tipo:

*               hard    nofile             2048

Notare che "difficile" indica un limite rigido, che non può essere superato e non può essere modificato. Un limite soft può essere modificato da un utente (ad es. Qualcuno senza capacità di root), ma non oltre il limite hard.

Leggi limits.confper ulteriori informazioni sull'uso pam_limits.


Al limite conf ho 2 righe: * soft nofile 4096 * hard nofile 8192 che non hanno alcun effetto.
FoxyBOA,

E ti sei disconnesso e riconnesso da quando hai provato questi? Ciò significa disconnettersi da X / GNOME / KDE ecc., Se si sta provando questo su un computer locale
Daniel Lawson,

Sì. /etc/security/limits.conf non funziona per me. Proverò il secondo approccio.
FoxyBOA,

3
/etc/security/limits.conf funziona solo per i servizi che utilizzano pam e il modulo pam pam_limits (vedere /etc/pam.d/ per la configurazione PAM di ciascun servizio e /etc/pam.d/common-* in particolare) . Riguarda quindi tutte le sessioni utente create da sshd, gdm, login, ecc. Non riguarda tutti i programmi avviati al momento dell'avvio ...
Raphaël Hertzog,

Ho detto qualcosa in tal senso, ma grazie per averlo chiarito. L'OP non ha chiarito se si tratta di un servizio o di un processo in esecuzione nel suo utente.
Daniel Lawson,

13

Esiste anche un "totale massimo" di file aperti impostati nel kernel, è possibile controllare l'impostazione corrente con:

cat /proc/sys/fs/file-max 

E imposta un nuovo valore con:

echo "104854" > /proc/sys/fs/file-max

Se si desidera mantenere la configurazione tra i riavvii aggiungere

sys.fs.file-max=104854

per

/etc/sysctl.conf

Per verificare l'utilizzo massimo del file corrente:

[root@srv-4 proc]# cat /proc/sys/fs/file-nr
3391    969     52427
|        |       |
|        |       |
|        |       maximum open file descriptors
|        total free allocated file descriptors
total allocated file descriptors
(the number of file descriptors allocated since boot)


La mia mostra alcuni numeri osceni qui: 49152 0 18446744073709551615 . Non capisco perché le prime due colonne non si sommino alla terza. E se ho 1,8 trilioni di miliardi disponibili, non vedo come li ho usati tutti.
mlissner,

4

Come altri hanno già detto, puoi applicare limiti specifici per utente o gruppo in /etc/security/limits.conf.

Nota: ulimit -n mostra il limite soft.

ulimit -H -n 

ti mostrerà il limite massimo.

Questo rende ulimit -a e ulimit -n l'output abbastanza confuso se, ad esempio, aumentassi il numero di file da 1024 a 4096, come ti aspetteresti di vedere l'output del limite rigido, ma stai ancora vedendo 1024 che è il soft limite.

Inoltre, ricorda che questi limiti vengono applicati per accesso, quindi esegui nuovamente l'accesso in una nuova shell e controlla le modifiche, non aspettarti che vengano propagate agli accessi esistenti.


2

Tenere presente che se si esegue il processo impostando ulmits in /etc/security/limits.conf start-stop-daemon non funziona. Se ad esempio si desidera aumentare il limite di file aperto per Tomcat a 20000, è necessario aggiungerli alle righe per /etc/default/tomcat:

ulimit -Hn 32768
ulimit -Sn 32768

Ho riscontrato questo problema su debian 6.0.4 Per altri processi le risposte fornite dovrebbero aiutare.


1

Dipende da come inizi il tuo processo di lunga durata. Se è avviato al momento dell'avvio (tramite script /etc/rcX.d/*), è necessario inserire una chiamata ulimit nello script di avvio poiché il limite predefinito è impostato dal kernel e non è sintonizzabile senza ricompilarlo.

L'uso /etc/security/limits.confpotrebbe funzionare se lo usi cronper avviarlo ad esempio con una voce come questa:

@reboot $HOME/bin/my-program

Dovrebbe funzionare perché /etc/pam.d/cron abilita pam_limits.so.


-1

Puoi aggiungerlo in /etc/security/limits.conf

root soft nofile 100000
root hard nofile 100000

salva quindi riavvia.


3
C'è qualcosa di nuovo qui che non è nella risposta accettata a questa domanda di 5 anni?
Andrew Schulman,

-2

Un ottimo comando è ulimit -nma c'è un problema con troppe connessioni e troppi file aperti:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 519357
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Ho provato a ripulire la tua risposta, ma non sono ancora chiaro cosa stai cercando di dire alla domanda sui poster originali. Puoi provare a ripulirlo ulteriormente?
slm

Anche questo è l'output di ulimit -a, non ulimit -n.
Yvan
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.