Valori ottimali per le direttive ServerLimit, MaxClients, MaxRequestsPerChild


29

Sto gestendo un sito a traffico intenso con molti contenuti dinamici, per lo più generati dagli utenti.

Il server è dedicato e dispone di un totale di 4 processori Intel (R) Xeon (R) CPU X3210 a 2,13 GHz. Devo conoscere i valori ottimali per le direttive apache ServerLimit e MaxClients, considerando che il server ha 4 GB di RAM e il database MySQL funziona su un server separato. Il pannello è DirectAdmin con CentOS.

Di seguito sono riportate le mie direttive attuali, ma durante le ore di punta con oltre 5k utenti, si nota un ritardo importante - e non è del tutto colpa di MySQL, perché le pagine sembrano essere generate velocemente (ho implementato un contatore del tempo di generazione della pagina), ma c'è un lungo ritardo della connessione fino a quando la pagina non inizia a rispondere e non viene inviata al browser.

<IfModule prefork.c>
    StartServers     800
    MinSpareServers   20
    MaxSpareServers   60
    ServerLimit      900
    MaxClients       900
    MaxRequestsPerChild  2000
</IfModule>
Timeout 90
KeepAlive On
KeepAliveTimeout 5

Dovrei menzionare che il monitoraggio del server utilizzando il comando top, l'utilizzo della CPU non va mai oltre il 20% ~ 30% nelle ore di punta. Il server MySQL ha anche un utilizzo del 30 ~ 50% in quel momento, e lavoro costantemente per risolvere le query lente, ma questo è un problema diverso. So che non è un collo di bottiglia del DB perché anche le pagine statiche impiegano molto tempo a caricarsi nelle ore di punta.

Eventuali suggerimenti per ottimizzare questi valori saranno molto apprezzati, grazie.

Risposte:


24

Il tuo MaxClients è MODO MODO troppo alto. Qual è la dimensione attuale del processo apache? Moltiplica quella x 900. È maggiore di 4 GB? In tal caso, è probabile che la macchina venga scambiata. Di solito inizio con MaxClients = 2x vCPU nella confezione (grep -c processor / proc / cpuinfo). Che in questo caso sarebbe circa 8. Quindi assicurati che la dimensione del processo di MaxClients x apache non sia superiore a 4 GB.

Puoi caricare i tuoi MaxClients da lì, a seconda del tipo di connessione che hanno i tuoi clienti. (Gli utenti dial-up devono essere falsificati, ecc.) Ma assicurati di non trovarti mai in una situazione di scambio.

Quindi impostare i server Min, Max e Start su MaxClients. Non è necessario differenziarli in un ambiente server dedicato.

Quindi esegui alcuni test con ab (come note d'oca).


Per qualche motivo sembra che abbia determinato erroneamente la dimensione del processo ... ora vedo nel comando in alto che i processi apache RESIDENT SIZE vanno da 10 a 15 MB. Ho letto da qualche parte che poiché le librerie condivise sono incluse in questo numero, la dimensione "reale" è la metà di quella. Considerando questo dovrei calcolare che posso accogliere 570 processi di 7 MB di dimensione ciascuno, pensi che sia corretto?
andreszs

Ti suggerisco di utilizzare 15 MB per i calcoli e quindi iniziare a controllare le metriche: processo # http vs. uso della memoria. Questo ti darà un'idea migliore del numero di MaxClients
hdanniel,

1
L'ho abbassato a 400 e anche prima dell'ora di punta il risultato ha avuto l'effetto opposto del desiderato: qualsiasi valore inferiore all'originale crea timeout e lunghi ritardi. In effetti ora l'ho aumentato a 1500 client e l'utilizzo della memoria è ora su 3 GB mentre l'utilizzo medio della CPU è dell'8%. Ovviamente ora c'è più carico sul server SQL e dovrò lavorarci su.
andreszs,

Ecco il mio comando htop ora, 1500 processo apache e quasi 100 processi di sistema. Questo con il 75% di utilizzo della RAM. a.imagehost.org/0011/htop.png Dovresti riconsiderare la tua formula? ;)
andreszs,

1
Questo è il motivo per cui è necessario eseguire test nel proprio ambiente. Abbiamo acceleratori http di fronte ai nostri apache, quindi non sono utenti mobili. Anche la tua applicazione sembra essere molto leggera. Se hai spostato il carico sul tuo DB che mi dice che più di quei processi apache stanno effettivamente servendo dati vs seduti e aspettando una connessione mysql. Che poi mi porta a chiedere quante connessioni stai permettendo al tuo DB? Quel numero supera i tuoi MaxClients? Hai 5.000 connessioni simultanee? In tal caso, potresti voler esaminare qualcosa come Perlbal di fronte.
toppledwagon,

5

È necessario ottenere la dimensione media del processo apache. Con questo numero e la dimensione totale della RAM è possibile calcolare la direttiva MaxClients. Ricorda questo: "Un server web non dovrebbe mai scambiarsi" ( Apache Performance Tuning )

Il monitoraggio con top o htop è ok ma hai bisogno di una visione migliore di tutte le statistiche dei tuoi server (cpu, ram, i / o del disco, richieste di apache, query lente mysql, ecc ...) con alcuni strumenti di monitoraggio come ganglia o munin per trovare possibili colli di bottiglia.


Per il momento ho solo i comandi top e htop e non riesco comunque a comprenderne tutte le informazioni. Questa è l'attività di ieri nelle ore di punta, sembra che non ci siano scambi; per favore dimmi se sbaglio: Compiti: 1043 totali, 2 in esecuzione, 1041 addormentati, 0 fermati, 0 zombie Cpu: 13,8% us, 1,8% sy, 0,0% ni, 82,1% id, 0,8% wa, 0.0% hi, 1.5% si, 0.0% st Mem: 4138360k totali, 3961276k usati, 177084k liberi, buffer 75016k Totale: 2031608k totali, 1484k usati, 2030124k liberi, 1836600k memorizzati nella cache
andreszs

Sì, il tuo server non si sta scambiando. Preferisco le metriche della vita reale, ma se vuoi puoi usare uno strumento di stress come ab o httperf per verificare quanto il tuo server può gestire. Per i test prenditi cura di MaxClients e inizia con un numero basso (basato sul presupposto di 15 MB).
hdanniel,

4

Consiglio di giocare con lo strumento benchmark (ab) di apache. Puoi giocare con i valori per abbinarli al flusso di traffico e vedere che tipo di risposte stai ricevendo per quanto riguarda il tempo di caricamento medio e simili. A quel punto puoi giocare con le impostazioni di cui stai parlando per provare a ottimizzarle. Dovresti essere in grado con ab di ottenere una gestione delle prestazioni ottimali per ogni ottimizzazione delle prestazioni.

Non sarebbe davvero prudente per me parlare delle tue impostazioni, tuttavia devi anche tener conto della tua RAM perché sembra che stai consumando molta RAM con quelle impostazioni. Anche se questa è solo una speculazione senza dati. htop ti dà una buona lettura visiva delle tue risorse.

Anche la tua media di carico potrebbe dire molto. Dubito che il tuo utilizzo sia molto superiore alla quantità totale di core dal 20-30% della CPU, ma è un altro indicatore di quanto il tuo server stia effettivamente lavorando.


Il problema è che non ho abbastanza esperienza nell'amministrazione del server, quindi inizia a giocare con i settign e monitora i risultati .. Non ho mai usato lo strumento ab per essere onesto. Anche la modifica dei valori richiede il riavvio di HTTDP, il che provoca inconvenienti ai miei utenti, quindi preferisco evitarlo. Immagina di inviare un messaggio a un altro utente e dopo aver fatto clic su "Invia", si verifica un problema di connessione al server. Sull'utilizzo della CPU, vedi le informazioni dal mio commento precedente: non va oltre il 15% nelle ore di punta. Penso che sia abbastanza accettabile considerando che ieri ho avuto 6000 utenti online.
andreszs,

Beh, sicuramente non vorrei che tu lo facessi in un ambiente di produzione. Consiglio di farlo nel minor tempo di traffico se un altro server (con hardware molto simile se non identico) da testare. ab è abbastanza facile da usare, ma penso sicuramente che toppledwagon abbia dato una buona istruzione sul calcolo dei tuoi MaxClients. Quando smetti di usare lo spazio di swap, vedrai un netto miglioramento. controlla httpd.apache.org/docs/2.0/programs/ab.html e cyberciti.biz/tips/… per AB
oca,
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.