Recentemente ho avuto problemi con server dove giravano application server Java ed improvvisamente si iniziavano a vedere strani errori del tipo “broken pipe” o risorse esaurite, questo è spesso dovuto all’alto numero di Open Files che un server moderno può impegnare comparato sopratutto al default dei sistemi Linux che è ancora fermo a 1024.
Vediamo come capire quanti Open file il nostro sistema sta utilizzando e come risolvere, o meglio prevenire, questo problema.
Verificare i file aperti da un processo
Passo # 1 Trovare il PID del programma
Cerchiamo il processo Tomcat
# ps aux | grep tomcat
Output:
12390
Passo # 2 Contiamo i file aperti dal pid 12390
E’ possibile usare il comando lsof o il file system /proc/PID per mostrare la lista di FD:
# lsof -p 12390 | wc -l
o
# cd /proc/28290/fd # ls -l | wc -l
A questo punto possiamo vedere il totale degli open file di quel PID, se siamo vicino a 1024 stiamo per avere problemi.
Fare il Tuning dei file descriptor su Linux
Linux limita il numero di descrittori di file che un qualsiasi processo può aprire, i limiti di default è 1024 per processo. Questi limiti possono impedire le prestazione ottimale sia di client per benchmarking (come httperf e apachebench) che dei server web stessi (Apache non è interessato, dato che utilizza un processo per ogni connessione, ma server Web a singolo processo come Zeus usano un descrittore di file per collegamento, e quindi può facilmente cadere in fallo sul limite di default).
Il limite di file aperte è uno dei limiti che possono essere modificati con il comando ulimit. Il comando ulimit -aS mostra il limite di corrente, e ulimit -aH mostra il limite hard (di sopra del quale il limite non può essere aumentato senza modificare i parametri del kernel in /proc).
Il seguente è un esempio di output di ulimit -aH. Si può vedere che la shell corrente (ed i suoi figli) è limitata a 1024 descrittori di file aperti.
core file size (blocks) unlimited data seg size (kbytes) unlimited file size (blocks) unlimited max locked memory (kbytes) unlimited max memory size (kbytes) unlimited open files 1024 pipe size (512 bytes) 8 stack size (kbytes) unlimited cpu time (seconds) unlimited max user processes 4094 virtual memory (kbytes) unlimited
Il limite sui descrittori di file può essere aumentato con la seguente procedura:
Modificare /etc/security/limits.conf aggiungendo le linee:
* soft nofile 1024 * hard nofile 65535
Questo aumenterà i limiti per tutti gli utenti della macchina, nel caso si volesse fare per un utente specifico sostituire il suo username a *
Se si accede a quella macchina via ssh si potrebbe anche essere necessario modificare il file /etc/pam.d/login, aggiungendo la riga:
session required /lib/security/pam_limits.so
Si noti che potrebbe essere necessario uscire e rientrare dalla sessione prima che le modifiche abbiano effetto.
Personalmente suggerisco di alzare questo valore di 10 volte, ovvero portarlo a 10240, tenendo d’occhio la memoria, che è la risorsa che potrebbe essere coinvolta da questo aumento.
Riferimenti:
http://www.cyberciti.biz/tips/linux-procfs-file-descriptors.html
http://www.xenoclast.org/doc/benchmark/HTTP-benchmarking-HOWTO/node7.html
Approfondimenti:
http://stackoverflow.com/questions/1212925/on-linux-set-maximum-open-files-to-unlimited-possible
Popular Posts:
- None Found