Ottimizzazione di Apache2 prefork MaxClients ServerLimit


22

Ho una macchina con 128 GB di RAM che utilizza Apache2 come server Web (in questa macchina non esiste un server di database, la macchina di database è una macchina di RAM da 64 GB in grado di gestire un massimo di 2000 connessioni). Vedo con uno strumento di monitoraggio che al momento ci sono circa 44 lavoratori impegnati e 12 lavoratori inattivi, quali sono i migliori valori teorici per il mio modulo prefork?

a volte ho pagine bianche che caricano siti Web ad alte ore di caricamento e ho riscontrato questo errore nel mio registro errori di Apache

[avviso] segnale di uscita pid 13595 figlio errore di segmentazione (11)

come posso risolvere anche questo problema?

Configurazione del mio modulo Apork2 Prefork:

StartServers          3
MinSpareServers       3
MaxSpareServers       5
ServerLimit           3200
MaxClients            3100
MaxRequestsPerChild   0

Freeh sulla macchina www :

totale: 128 G gratuito: 97GB (con apache2 in esecuzione) buffer 0b condiviso 1.9G cache 23G

Ram utilizzato da Apache2 e altri programmi:

Private  +   Shared  =  RAM used    Program

 96.0 KiB +  61.0 KiB = 157.0 KiB   sh
176.0 KiB +  26.0 KiB = 202.0 KiB   atd
176.0 KiB +  35.5 KiB = 211.5 KiB   acpid
208.0 KiB +  19.5 KiB = 227.5 KiB   mdadm
204.0 KiB +  30.0 KiB = 234.0 KiB   init
248.0 KiB +  62.0 KiB = 310.0 KiB   sendmail
376.0 KiB +  36.0 KiB = 412.0 KiB   dbus-daemon
388.0 KiB + 285.5 KiB = 673.5 KiB   cron (2)
820.0 KiB +  42.0 KiB = 862.0 KiB   gam_server
920.0 KiB + 108.0 KiB =   1.0 MiB   ntpd
968.0 KiB + 243.0 KiB =   1.2 MiB   getty (6)
  1.3 MiB + 351.5 KiB =   1.6 MiB   udevd (3)
  1.5 MiB + 343.0 KiB =   1.8 MiB   sendmail-msp
  2.0 MiB + 910.0 KiB =   2.9 MiB   plugin-localresources2
  3.4 MiB +  50.0 KiB =   3.4 MiB   rsyslogd
  3.6 MiB +  68.5 KiB =   3.7 MiB   bash
  1.9 MiB +   2.1 MiB =   4.0 MiB   sendmail-mta (4)
  3.8 MiB + 556.0 KiB =   4.3 MiB   sshd (2)
  3.7 MiB +   1.2 MiB =   4.8 MiB   plugin-apache2
  5.1 MiB +   1.2 MiB =   6.3 MiB   agent-service
  7.0 MiB + 654.0 KiB =   7.6 MiB   fail2ban-server
  9.6 MiB +   2.6 MiB =  12.2 MiB   proftpd (8)
 59.2 MiB +  70.0 KiB =  59.3 MiB   miniserv.pl
 96.8 MiB +   3.6 MiB = 100.4 MiB   php5-cgi (2)
196.4 MiB +  35.9 MiB = 232.3 MiB   apache2 (40)
---------------------------------
                     tot 450.0 MiB

2
Qual è il codice dell'applicazione in esecuzione all'interno del server Web? Questo è molto probabilmente il colpevole.
Shane Madden

inviare alcuni esempi di stato apache2ctl; c'è forse qualcosa in error_log?
Hrvoje Špoljar,

Risposte:


63

Impostazioni di prefork di Apache, per le linee guida di ottimizzazione delle prestazioni di Apache

citazione:

The single biggest hardware issue affecting webserver performance is RAM.
A webserver should never ever have to swap, as swapping increases the latency
of each request beyond a point that users consider "fast enough". 
This causes users to hit stop and reload, further increasing the load.
You can, and should, control the MaxClients setting so that your server does
not spawn so many children it starts swapping. This procedure for doing this
is simple: determine the size of your average Apache process, by looking at
your process list via a tool such as top, and divide this into your total 
available memory, leaving some room for other processes.

dovresti configurarlo in questo modo in base al tuo input per:

  • Memoria totale: 128 GB
  • -10% di memoria per tutto tranne apache: 115 GB
  • Ora dobbiamo capire quanto singolo processo apache sta usando.

Per calcolare questo è possibile utilizzare il seguente script:

pgrep apache2 | xargs -n1 -I{} cat /proc/{}/smaps | \
  awk '{if ($0 ~ /stack/) {pids+=1} else if ($0 ~/^Shared_/) 
    {shared+=$2} else if ($0 ~ /^Pss:/) {priv+=$2}} END {
      printf "%.2f MB\n",(priv+shared/(pids*pids))/1024}'

Questa è la migliore stima di quanto singolo processo apache sta usando la memoria mentre si tenta di dividere proporzionalmente l'utilizzo condiviso per numero di processi apache attivi e di aggiungerlo sopra Pss (dimensione set proporzionale)

Alla fine dividi 115 GB con questa cifra e ottieni MaxClients/ServerLimit. Da qui puoi relativamente calcolare altre cifre come

  • StartServers 30% di MaxClients
  • MinSpareServers 5% di MaxClients
  • MaxSpareServers 10% di MaxClients
  • ServerLimit == MaxClients
  • MaxConnectionsPerChild 10000 (come alternativa conservativa per risolvere possibili problemi con le app che perdono memoria)

2
spero che qualcuno con più punti reputazione di me ti dia il voto per questa risposta, grazie mille!
Utente-N

2
Il tuo script di calcolo mi dà 842.13 MB. Si tratta di un ordine di grandezza superiore a quello che vorrei (apache 2.2 su CentOS 6.7).
Quinn Comendant,

1
È in modalità prefork. Ecco l'output di /server-info: i.imgur.com/SS2gIXI.png
Comandante di Quinn,

1
@QuinnComendant trucco malvagio tuttavia IfModule sarà vero se il modulo prefork è disponibile (quale è), e in realtà entrambe le opzioni sono disponibili worker e MPM ... Ho un server identico e l'utilizzo della memoria sul mio sistema per worker è ~ 850 MB. Non è possibile utilizzare prefork per 1 processo 800 MB di memoria. Hai modificato la riga nello script in cui fa riferimento al nome del processo apache2 a httpd giusto?
Hrvoje Špoljar,

1
@shawn perché dovresti dirlo? come pensi che dovrebbe essere calcolato?
Hrvoje Špoljar,
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.