Newsgroup: it.comp.os.linux.sys
Titolo: [Apache] Too many open files

Ciao a tutti.
Poco fa mi è scappato fuori questo errore nei log di apache:
Too many open files.
Ho una slack 2.4 e ulimit impostato a unlimited.
ovviamente nel kernel 2.4 il limite è impostato a 1024
--
# cat /usr/src/linux/include/linux/posix_types.h | grep "#define
__FD_SETSIZE"
#define __FD_SETSIZE    1024
---
Come si può bypassare questo problema? sul server ho pressapoco 600
domini, con i relativi awstats........Poichè facciamo hosting i domini
aumenteranno sempre (si spera).
Il kernel 2.6 che limite ha?
Ci sono soluzioni piu 'leggere' o devo per forza patchare il tutto ed
alzare manualmente il limite? a quanto lo posso mettere?

 alzare manualmente il limite? a quanto lo posso mettere?
se non sbaglio il limite è per processo , ci dovrebbe essere un opzione per
farlo forkare di piu'.
ciao.
-- 
Vivere nel ricordo di chi ci ama non e' morire.
                -- Muro di un gabinetto di Ingegneria.

 farlo forkare di piu'.
Al momento non mi viene in mente....La cosa è abbastanza urgente, se
sai qual'è l'opzioni me la dici? (sto risolvendo con un apachectl
stop/start in crontab ogni 30 minuti)
Ho notato che un particolare dominio apre ALMENO 80/100 access log e
error...
E' normale?
httpd     19235  nobody  124w      REG        9,4           0
196733 /var/log/apache/www.xxxxxxxx-error.log
httpd     19235  nobody  125w      REG        9,4       54832
200108 /var/log/apache/www.xxxxxxxx-error.log
httpd     19235  nobody  627w      REG        9,4           0
196734 /var/log/apache/www.xxxxxxxx-access.log
httpd     19235  nobody  628w      REG        9,4      484380
200106 /var/log/apache/www.xxxxxxxx-access.log
httpd     19236  nobody  124w      REG        9,4           0
196733 /var/log/apache/www.xxxxxxxx.net-error.log
httpd     19236  nobody  125w      REG        9,4       54832
200108 /var/log/apache/www.xxxxxxxx-error.log
httpd     19236  nobody  627w      REG        9,4           0
196734 /var/log/apache/www.xxxxxxxx.guest.net-access.log
httpd     19236  nobody  628w      REG        9,4      484380
200106 /var/log/apache/www.xxxxxxxx.net-access.log
httpd     19237  nobody  124w      REG        9,4           0
196733 /var/log/apache/www.xxxxxxxx.net-error.log
httpd     19237  nobody  125w      REG        9,4       54832
200108 /var/log/apache/www.xxxxxxxx-error.log
httpd     19237  nobody  627w      REG        9,4           0
196734 /var/log/apache/www.xxxxxxxx-access.log
httpd     19237  nobody  628w      REG        9,4      484380
200106 /var/log/apache/www.xxxxxxxx-access.log

 stop/start in crontab ogni 30 minuti)
prova a mettere:
MinSpareServers 30
MaxSpareServers 300
StartServers 30
MaxRequestsPerChild 10
ma ti avverto è un po' estremo......
-- 
Non preoccuparti del fatto che la gente non ti conosce, preoccupati del
fatto che forse non meriti di essere conosciuto.
                -- Confucio

Apre 1 access log + 1 error log (+ ogni file di log aggiuntivo messo
manualmente) per ogni dominio presente per ogni processo httpd in
esecuzione.
Facendo 2 conti io ho:
50 httpd in esecuzione (sinceramente credo di aver esagerato)
600 domini circa
2 log per ogni dominio (vado a memoria)
viene fuori
1200 log * 50 httpd
credo di aver esagerato con i processi httpd in esecuzione, però è un
server web dedicato, fa solo questo.
Se uno si ritrova con 1000 domini, come fa a gestirli in un unico
server? io con 600 ho già problemi.

 ma ti avverto è un po' estremo......
Estremo in che senso? troppo alto o troppo basso?
E' un web dedicato, deve andare il piu veloce possibile......
Al momento ho
MinSpareServers 5
MaxSpareServers 10
StartServers 50
MaxClients 256
MaxRequestsPerChild 10000

 
Per numeri molto grandi si evita di far fare al singolo vhost un log 
separato, in modo da limitare il numero di FH, e si logga in altro modo[1]
Non capisco comunque perchè dici che hai 50 httpd che aprono ognuno i 
suoi log... Mi spieghi?
[1] tutto insieme separando *dopo*, se applicabile (ovvero i log non 
raggiungono giornalmente dimensioni folli), oppure sparando i log in 
syslog e separandoli altrove...


echo 16384 >/proc/sys/fs/file-max
ed ho quei file apribili
(un 500 domini web, 2000 caselle email, av, statistiche, dns ecc ecc)
-- 
Roberto Tagliaferri-Linux user #30785 <-> r.tagliaferri@(forse)
tosnet.it
Era una ragazza molto strana: continuava a dire che avevo una bella
cravatta...  Ed ero nudo!
		-- Francesco Salvi

 syslog e separandoli altrove...
oppure alcuni usano syslog-ng e li caricano su un db.
ciao.
-- 
E' scappato quel matto che credeva di essere un sapone.  "E come e'
scappato?".  "Mi e' scivolato fra le mani!".

 suoi log... Mi spieghi?
Nel senso che ho attualmente 53 processi aperti e 120 accesslog aperti.
I numeri li ho presi da lsof ma non capisco come mai un dominio ha 600
log aperti (access ed error insieme).....
Supponiamo di avere 2 virtualhost: pippo, ciccio
se entrambi loggano in /log/pippo.log, apache apre un solo log?
potrebbe tornami utile raggruppare i file di log però devo trovare il
modo di configurare awstat per le statistiche in modo che legga un
unico file di log e 'filtri' il dominio giusto (ogni cliente qui vuole
awstat).
Puoi spiegarmi meglio cosa intendi per buttare i log in syslog?
Vantaggi? Svantaggi?
Vantaggi nel mettere una macchina log esterna? Cosi butto tutti i log
di tutte le macchine in un unico posto..... in questo caso, serve un
processore potente o basta un celeron 2.9?Non credo che debba fare
tanti calcoli. *Dovrebbe* scrivere semplicemente sul disco.........
(Ma poi come si configura awstats?)

 (un 500 domini web, 2000 caselle email, av, statistiche, dns ecc ecc)
Eh Eh........guarda qua ;-)
root@xxx:/# cat /proc/sys/fs/file-max
104851

 MaxRequestsPerChild 10000
Prova ad abbassare questo a meno di 100.
Sara` un po' piu` lento, ma ogni figlio forse apre meno log.
La mia ipotesi e` che ogni figlio apra 1200 file (i log). Se abbassi il
numero di MaxRequestsPerChild a 100 ne apre al massimo 200 (100*2, error
e access), piu` i file richiesti dai client (altri 100) ed eventuali
robe sue (stderr o simili), quindi arrivi al max a 3-400 file aperti per
processo, poi muore.
Ma e` una stima molto a occhio e non avvallata da verifiche al codice.
E` successo anche a me, comunque, e sto vedendo se tiene botta
modificando un po' alla volta questi parametri.
Al momento ho:
StartServers      100
MinSpareServers   100
MaxSpareServers   250
MaxClients        512
MaxRequestsPerChild  500
E tiene botta da 3 settimane. Spero di aver trovato il compromesso
giusto. Prima con 10000 su MaxRequestsPerChild mi teneva 5-8 giorni e
poi dava problemi.
/proc/sys/fs/file-max e` a 209712, quindi piu` che sufficienti, in
teoria.
Questo su un server RedHat ES con Apache 2.
Su un server con piu` o meno gli stessi accessi, ma su Debian Sarge e
sempre Apache 2, con /proc/sys/fs/file-max a 104855, ho
StartServers            30
ServerLimit             1024
MinSpareServers         20
MaxSpareServers         50
MaxClients              512
MaxRequestsPerChild     1000
E non mi ha mai dato problemi (acceso da 2-3 mesi).
Bye.

 Sara` un po' piu` lento, ma ogni figlio forse apre meno log.
[Cuttone pazzesco]
Grazie, mi hai fatto chiarire tutto. Ho abbassato quel valore e guardo
cosa succede.
Non so se hai letto il mio post su che vantaggi si possono ottenere
loggando via syslog o addirittura su una macchina esterna. Riesci a
delucidarmi?
Comunque regolare questi valori credo sia sempre una cosa temporanea.
Adesso troviamo il compromesso con 10 virtualhost (per esempio), ma tra
1 anno, con 100 virtualhost teoricamente dovremmo diminuire di 10 volte
gli altri valori..... A lungo andare ritorniamo sempre al punto di
prima...
E quando arriviamo a 1 e non dovesse bastare?
Ci deve pur essere una soluzione al problema anziche posticiparlo....


ma in file-nr cosa c'è?
Io ho 4065    0       16384
-- 
Roberto Tagliaferri-Linux user #30785 <-> r.tagliaferri@(forse)
tosnet.it
- Signor Andreotti, come fa ad avere la coscienza sempre pulita?
- Basta non usarla mai.
		-- Chiappori

ale@xxx:/home/ale# cat /proc/sys/fs/file-nr
4395    2788    104851

 
quindi problemi non ne dovresti avere :-(
-- 
Roberto Tagliaferri-Linux user #30785 <-> r.tagliaferri@(forse)
tosnet.it
Io ho un amico cosi' pigro, cosi' pigro, ma cosi' pigro, che ha sposato
una donna incinta.
		-- Gino Bramieri

 
inode-nr ?
-- 
Roberto Tagliaferri-Linux user #30785 <-> r.tagliaferri@(forse)
tosnet.it
- Che lusso, avete anche il caviale...
- Veramente e' una fettina di torta...  ma cosa vuole, con tutte
   queste mosche...
		-- Anonimo

> inode-nr ?
root@xxx:/home/ale# cat /proc/sys/fs/inode-nr
646029  0
Invece di problemi ne ho...anche ora non funziona.....
Startserver = 10
max = 30
min = 5
max richieste per server = 5
eppure da lo stesso problemi.........AIUTOOOOOOOOOOOOOOOOOOOOO

 ---
sembra che sia un superamento del limite nel kernel. In altri sistemi 
unix il parametro si chiama 'nfile' ... prova a cercare in /proc o su 
google.
-- 
il capitano dei carabinieri chiede a un appuntato: "quanto fa 1+1"
l'appuntato: "3"
I colleghi in coro "gli dia un'altra chance. Gli dia un'altra chance!"
Il capitano ci riprova. Quanto fa "2+1".
l'appuntato: "3"
I colleghi in coro "gli dia un'altra chance, gli dia un'altra chance!"


Se non fosse che è del 2003 penserei che hai una versione di apache 
inferiore a questa:
http://www.apacheweek.com/features/apache2044
guarda nei bugs cosa vieniva corretto.
In ogni caso un limata ai paremetri KeepAlive potrebbe essere utile.
ciao
michele
PS
Per quanto riguarda la tua domanda fatta in un altro messaggio:
"Cosa faccio all'aumentare dei domini da gestire?"
Compri una seconda macchina, prima o poi raggiungerai il limite delle 
capacità della macchina, e allora ...

 capacità della macchina, e allora ...
Ma pressapoco quanti domini ci possono stare su una singola macchina?
600 mi sembrano pochini.....
Se utilizzassi syslog (o syslog remoto su un server dedicato) risolvo
questi problemi? preferirei aggiungere una macchina dedicata per i log
(sicuramente meno costosa e meno esosa di potenza di calcolo rispetto
ad un apache) che mettere in piedi un altro server.......

Ho piazzato un bel
ulimit -n 200000
e sembra tenere....
due domande:
- bisogna ridarlo ad ogni reboot o se lo ricorda? (non vorrei che tra 1
mese, dopo un bel reboot del server mi ritrovassi con lo stesso errore)
- come faccio a contare il numero di file aperti da un dato processo?
del tipo
httpd: 3340
o anche il num di file aperti in generale nel sistema...in modo da
poter monitorare la situazione con qualche script. se il num > X allora
manda email..(tanto per prevenire)