Jan 162011
 

tuxrayRecentemente 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:

How Many Open Files?

http://stackoverflow.com/questions/1212925/on-linux-set-maximum-open-files-to-unlimited-possible

Popular Posts:

Flattr this!

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

*