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.