Come aggirare "Troppi file aperti" in debian


8

Se voglio vedere tutti i file di registro rilevanti del mio server apache2 in una volta, lo uso

tail -f /var/kunden/logs/*log /var/kunden/logs/*log /var/log/apache2/*log |grep -v robots|grep -v favicon

Ma dato che ormai sono troppi file, vorrei aumentare questo limite.

Come posso aumentarlo per una sessione ssh? E come potrei aumentarlo a livello globale a livello di sistema?

Vedo che il limite di file aperti è 1024 sul mio computer:

ulimit -n
1024

Il superamento del limite del file è spesso indice di un problema. Come già notato, potresti avere un problema con la rotazione del registro. (Il registro ruotato potrebbe annullare il comando.) Al di fuori di / var / log / apache2 non dovrebbero esserci molti (eventuali) registri relativi al server Apache. In base al tuo modello grep, probabilmente desideri limitare l'accesso ai log di accesso.
BillThor,

grazie per il suggerimento, ma il mio logrotaion funziona bene. Ho così tanti registri, perché tutti i 1025 domini sul mio server hanno il proprio file di registro;)
rubo77

1
I tuoi modelli sembrano raccogliere anche i log degli errori e i log di accesso. Questo dovrebbe essere un problema minore se si dispone di un singolo registro errori. Se si lascia questo in esecuzione in una shell, è possibile che si desideri utilizzare -Finvece di -friaprire i registri quando vengono ruotati.
BillThor,

Risposte:


15

È importante sapere che esistono due tipi di limiti:

  • Un limite rigido è configurabile solo da root. Questo è il valore più alto possibile (limite) per il limite soft.
  • Un limite soft può essere impostato da un utente normale. Questo è il limite effettivo in vigore.

Soluzione per una singola sessione

Nella shell impostare il limite soft:

ulimit -Sn 2048

In questo esempio il limite effettivo verrà aumentato a 2048 ma il comando avrà esito positivo solo se il limite rigido (controllo:) ulimit -Hnè uguale o superiore. Se hai bisogno di valori più alti, aumenta il limite rigido usando uno dei metodi seguenti. I limiti sono impostati per processo e sono ereditati da processi appena generati, quindi qualsiasi cosa tu esegua dopo questo comando nella stessa shell avrà i nuovi limiti.

Modifica del limite rigido in una singola sessione

Questo non è facile perché solo root può cambiare un limite rigido e dopo il passaggio a root devi tornare all'utente originale. Ecco la soluzione con sudo:

sudo sh -c "ulimit -Hn 9000 ; exec su \"$USER\""

Soluzione a livello di sistema

In Debian e in molti altri sistemi usando pam_limitspuoi impostare i limiti a livello di sistema in /etc/security/limits.confe nei file in /etc/security/limits.d. Il file conf contiene una descrizione. Linee di esempio:

@webadmins       hard     nofile     16384
@webadmins       soft     nofile      8192

Ciò imposterà il limite rigido e il limite flessibile predefinito per gli utenti del gruppo webadminsdopo l'accesso.

Altri limiti

Il valore limite rigido è limitato dal limite globale del valore dei descrittori di file aperti in /proc/sys/fs/file-maxcui è piuttosto elevato per impostazione predefinita nelle moderne distribuzioni Linux. Questo valore è limitato dal NR_OPENvalore utilizzato durante la compilazione del kernel.

Non esiste una soluzione migliore?

Forse potresti verificare se tutti i *logfile a cui ti alleni tail -fsono file realmente attivi che devono essere monitorati. È possibile che alcuni di essi siano già chiusi per la registrazione e che sia possibile aprire un numero inferiore di file.


ulimit -Sn 4096 -bash: ulimit: file aperti: Kann die Grenze nicht ändern: Das Argument is ungültig - significa che l'argomento non è valido
rubo77

@ rubo77: ho aggiunto informazioni sul limite rigido che è probabilmente la causa del problema.
pabouk,

@ rubo77: è anche possibile impostare il limite massimo in una sessione di shell, ma è complicato in quanto è necessario sueseguire il root e sutornare all'utente:su -c "ulimit -Hn 6000 ; su $USER"
pabouk

OK, quindi per una modifica temporanea del limite userò ulimit -Hn 6000; ulimit -Sn 6000come root allora
rubo77

1
@amenthes Immagino che intendi i file di configurazione in /etc/limits.*. Questi limiti vengono applicati ogni volta che pam_limits.soviene chiamato il modulo PAM . Normalmente è all'inizio di una sessione. Per esempio in Ubuntu 14.04 è in questi strumenti / comandi: cron, login(console di testo di login), lightdm(il login GUI), su. È possibile impostare dove viene pam_limitsutilizzato /etc/pam.*. Vedi ad esempio: faqs.org/docs/securing/chap5sec44.html
pabouk,

0

Ho avuto l'avviso PHP nel mio error.log di Apache:

failed to open stream: Too many open files in ...

Quindi ho scoperto che apache imposta questo valore singolarmente all'avvio (sul mio Ubuntu 14.04). È configurato in /etc/apache2/envvars. Dice:

## If you need a higher file descriptor limit, uncomment and adjust the
## following line (default is 8192):
#APACHE_ULIMIT_MAX_FILES='ulimit -n 65536'

quindi ho dovuto regolare la terza riga.

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.