Soluzione 1:
Ti ho dato la risposta nei commenti su Server che non risponde a SSH e HTTP ma il ping funziona, ma a quanto pare non mi credi. Davvero, è vero!
Devi dimensionare MaxClients
/ ServerLimit
al tuo sistema. Le "5-10 impostazioni per i server Min/Max" che menzioni sono sostanzialmente irrilevanti:si tratta solo del numero di extra i server in giro non fanno nulla che Apache manterrà.
Per impostare MaxClients in modo appropriato, osserva il tipico limite massimo per il tuo httpd
(o apache2
) processi, quindi dividere la memoria disponibile per quella. Meglio abbassarsi un po' per dare respiro al resto del sistema. Dato che hai 4 GB di RAM e 185 MB di processi, ciò significa che il tuo ServerLimit
dovrebbe essere al massimo 21 — probabilmente 20 o 19.
Ora, potrebbe essere che 190 MB siano atipici. Puoi impostare ServerLimit più in alto, in base a una stima diversa dell'utilizzo tipico, ma in pratica stai scommettendo che non avrai mai un picco. In tal caso, la memoria del tuo sistema sarà esaurita.
Se riesci a trovare un modo per limitare l'utilizzo della memoria per lavoratore, sarà una vittoria. Scommetto che questo è un caso di PHP Ate My RAM. Puoi codificare la tua app per vivere all'interno di un memory_limit
inferiore ? Se non puoi farlo, hai bisogno di un modello diverso con cui eseguire il tuo PHP. Se non puoi farlo, devi acquistare più RAM.
Soluzione 2:
L'MPM prefork di Apache gestisce autonomamente i server. Inizierà sempre con StartServers
demoni e non eseguirà mai meno di MinSpareServers
una volta che si avvia. Alla fine ritirerà/ucciderà anche i server in eccesso di MaxSpareServers
se sono inattivi abbastanza a lungo (non ricordo cosa sia "Long Enough" in questo contesto, né se/come possa essere modificato).
ServerLimit
imposta il numero massimo di demoni apache che possono essere eseguiti in un dato momento -- Questo è il motivo per cui nella tua situazione puoi avere centinaia di processi apache dormienti (sono stati generati per soddisfare una marea di richieste e non sono rimasti inattivi abbastanza a lungo da essere ancora ucciso dal processo madre).
Personalmente penso che 1250 sia un valore piuttosto alto per ServerLimit
/MaxClients
-- 250 potrebbe essere un numero più ragionevole (sebbene ciò possa comportare l'occasionale errore 503/Server occupato se ricevi un'enorme quantità di richieste:se questo diventa un problema cronico puoi aumentare il numero o aggiungere più server per gestire il carico ).
Mettere in relazione questa domanda con quella precedente Re:un arresto anomalo con memoria insufficiente, seguire assolutamente le indicazioni del Manuale di Apache su questo parametro:
Most important is that MaxClients be big enough to handle as many simultaneous
requests as you expect to receive, but small enough to assure that there is enough
physical RAM for all processes.
…e il mio assioma personale:It's better to give a client a 503 page than knock the server down
. :)
Soluzione 3:
Disattiva Keepalives e imposta MaxClients su 150. Il motivo più probabile per cui hai 260 processi seduti lì è perché Apache tiene diligentemente aperte le connessioni del browser perché KeepAlive è impostato nel tuo file di configurazione di Apache.