Ok, ik wil nog wel even wat bijdragen.
Ik ga er even vanuit dat je een webserver draait met alleen apache en een kaal OS. Geen MySQL of iets anders.
Eerst moet je gaan kijken, hoe veel ram heeft mijn systeem? Nou, dat weet je meestal wel, ik zeg nu 2GB.
Stel nu je systeem even zo in dat je Apache niet on boot start en reboot je systeem.
Vervolgens doe je: free -m
Dan komt er bij used iets te staan, ik zeg nu even 195MB. Tel daar nog even 75MB voor de veiligheid bij op, dan zit je op ~ 275MB.
Heb je 2GB ram heb je dus 2048MB ram. Haal daar 275MB vanaf, dan zit je op 1773MB aan ram dat over is.
Nu start je Apache en ga je kijken hoe groot je proces is.
Met "ps aux" of "top" kan je nu inzien hoeveel procent geheugen een proces in neemt.
Daar kan van alles uit komen, dat ligt aan:
- Welke modules je in Apache geladen hebt
- Welke modules je in PHP gecompiled hebt (indien je PHP gebruikt).
Ga nu even uit van 0.5% ofwel ~ 10MB.
Je hebt 1773MB aan geheugen over, daar kan je dus 177 httpd processen in kwijt.
Nu kent Apache (2) MaxClients en ServerLimit. Ik ga er vanuit dat je de prefork mpm gebruikt.
Lees ook eerst even:
- http://httpd.apache.org/docs/2.0/mod...tml#maxclients
- http://httpd.apache.org/docs/2.0/mod...ml#serverlimit
Er mogen dus niet meer dan 177 processen gestart worden.
MaxClients en ServerLimit moet je dus niet hoger dan 177 zetten, al raad ik je aan wat veiliger te gaan zitten.
Nu zal je systeem niet meer dan 177 requests tegelijk verwerken, dat is echt al heel veel!
Zo zal je systeem nooit gaan swappen als deze onder maximale belasting ligt, je systeem blijft dus werkbaar.
Maar dat is niet alles, er kan nog veel meer worden getuned.
Veel sysadmins hebben eigenlijk geen idee wat er gebeurd als zij de AllowOverride op All zetten voor /
Wat er dan gebeurd is het volgende:
Je server staat ingesteld dat alle websites staan in /home/gebruiker/domains/domein.tld.
Apache gaat nu voor ieder request kijken of er een .htaccess bestand staat in:
- /
- /home
- /home/gebruiker
- /home/gebruiker/domains/domein.tld
Dat zorgt dus voor 4 I/O's voor elke keer dat er iets geladen wordt van het systeem.
Het beste is daarom om in elke Vhost een <Directory> blok te zetten met daarin de Options en AllowOverride.
Voor / raad ik je aan de AllowOverride op none te zetten en deze alleen aan te zetten waar nodig.
Op kleine schaal zal je de I/O's niet nodig hebben, maar zodra je echt op grote schaal gaat werken scheelt dat echt veel disk I/O's.
Nu moet je ook uitkijken met mod_rewrite. Mensen vinden het maar al te leuk om hun URL's fancy te hebben, maar dat kan echt voor onnodig veel load op een systeem zorgen. De server moet namelijk iedere keer gaan kijken naar alle regels die er in staan en ze gaan parsen, pas daar dus mee op.
Laad verder ook geen modules die je niet nodig hebt, ik strip altijd alles en ga vanaf daar kijken heb ik die module wel of niet nodig? Zo ja, dan laad ik hem, zo niet, dan dus niet.
Het zelfde doe ik met PHP, daar compile ik ook alleen in wat ik nodig hebt.
Dat scheelt namelijk geheugen en hoe kleiner het Apache proces, hoe meer ik er van kan spawnen (MaxClients en ServerLimit), dus hoe meer requests ik kan afhandelen.
Dan hebben we nog KeepAliveTimeout. Deze staat standaard op 15 seconde, ik raad iets van 2 a 3 seconde aan.
Bij KeepAlive blijft het proces wachten op nog extra aanvragen van de bezoeker en dat doet hij zo lang als de KeepAliveTimeout aangeeft. Staat dit dus op 15, dan wacht Apache nog 15 seconde op de bezoeker voor het geval dat hij nog een aanvraag doet.
Bij veel requests zorgt dat dus voor veel threads/workers/childs die niets te doen staan. Daarom wil je dit zo kort mogelijk houden. 2 seconde is vaak zat, de browser gaat geen 2 seconde wachten om het volgende plaatje op te vragen, zo wel? Dan is het best een vreemde browser.
Wat ik eigenlijk eerder had moeten behandelen waren de StartServers, MinSpareServers en MaxSpareServers.
StartServers staat standaard op 5. Indien jij geen 150 concurrent requests doet 24/7, dan zou ik het op 5 laten.
Indien je dus weet dat zodra je Apache gestart er gelijk 150 requests zullen komen, dan kan je StartServers beter op 125 zetten, echter zal het dan wel langer duren voordat je Apache gestart is.
MinSpareServers is het aantal processen dat klaar staat om extra aanvragen te behandelen. Stel er worden 100 requests verwerkt en dit staat op 5, dan zijn er 105 processen. Die 5 kunnen dus direct requests verwerken.
Indien je weet dat je aantal requests gigantisch kan stijgen in een hele korte periode (30 ~ 60 sec), zet dit dan op iets van 25. Gebeurd dit niet? Houdt het dan laag, het kost namelijk alleen maar extra geheugen.
Apache start maar 1 child per seconde, houdt daar rekening mee.
MaxSpareServers is het tegenover gestelde. Stel je server verwerkt 100 requests en ineens verwerkt je server er nog maar 10. Dan zal Apache zijn childs gaan doden totdat het aantal childs kleiner of gelijk is aan: aantalactiechilds + maxspareservers.
Hierbij wordt dan wel weer rekening gehouden met MinSpareServers zodat het aantal childs nooit daar onder komt.
Zet dit dus ook niet heel erg hoog maar wel hoger dan MinSpareServers.
Hier kan je dus wel uit afleiden dat er geen ideale httpd.conf is, het is dus echt een spelletje waar je goed in moet worden.
Zeker op een server die meer doet dan alleen httpd kan het lastig zijn, want daar moet je je geheugen verdelen over alle processen zoals MySQL (en dat is helemaal een kunst!), je mailserver en je controle paneel.
Met Apache bench (staat in de bin directory van apache onder de naam ab) kan je je server goed stressen en hem aan zijn max brengen.
Ga daar mee aan de gang en laat hem even 24 uur lekker stressen, lekker aan zijn MaxClients en kijk wat er gebeurd. Gaat hij swappen? Wordt hij traag?
Succes!

