Ydelsen på din webserver har rigtigt meget at gøre med hvor meget RAM den får lov at bruge, Apache har forskellige måder at styre hukommelsen på men Debian (som jeg for det meste altid tager udgangspunkt i) bruger den metode som hedder mpm_prefork, og den virker simpelthen ved at starte et bestemt antal Apache processer til at håndtere indkommende forbindelser, og skrue op og ned for antallet eftersom behovet er til det.
Indstillingerne er i /etc/apache2/apache2.conf
<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0 </IfModule>
Og det der sker med denne konfiguration er at der ved Apache’s opstart startes 5 processer, som står og venter på indkomne forespørgsler. Derudover angiver vi et min- og et maxantal ubenyttede processer der må være på maskinen. Det vil sige hvis der er 10 processer og kun 1 af dem er i brug, så lukker den yderligere 4 ned sådan at der kun er 5 ubenyttede.
Ligeledes, hvis der er 4 processer i brug så startes der automatisk 5 mere fordi der er en regel om at der altid skal stå 5 processer klar i tilfælde af at der kommer et peak i indgående forbindelser.
Tricket er efterfølgende at finde ud af hvor meget din typiske Apache process fylder i hukommelsen og dividere det med mængden af ledig ram (eller den mængde du ønsker Apache skal ha lov at konsumere) i maskinen, og tilpasse indstillingerne herefter. Så nu er spørgsmålet bare hvordan man finder ud af hvor meget ram Apache bruger pr. process, her tager jeg udgangspunkt i at du bruger mod_php i modsætning til f.eks. fast_cgi der spawner yderligere processer, mens mod_php som udgangspunkt kun starter en:
root@lab1:~# ps aux | grep 'apache2\|COMMAND' USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 365 0.0 0.2 178856 11656 ? Ss Feb10 42:25 /usr/sbin/apache2 -k start www-data 5463 0.1 0.3 183580 14140 ? S 21:31 0:03 /usr/sbin/apache2 -k start www-data 5472 0.2 0.2 182836 11960 ? S 21:31 0:06 /usr/sbin/apache2 -k start www-data 5937 0.1 0.2 180768 11428 ? S 21:32 0:03 /usr/sbin/apache2 -k start www-data 5999 0.1 0.3 185892 14860 ? S 21:33 0:03 /usr/sbin/apache2 -k start www-data 6102 0.2 0.2 180748 11392 ? S 21:35 0:06 /usr/sbin/apache2 -k start ....
Løb listen igennem og find den apache process med det højeste real-memory forbrug (RSS) og læg lidt buffer til, i ovenstående eksempel ville jeg afsætte 16.000kb til hver process, altså 16MB.
Serveren har 16GB ram, Linux og MySQL bruger ca. 4GB så vi har 12GB tilbage til Apache:
12288 / 16 = 768
Jeg laver derfor config fil der ser cirka sådan her ud :
<IfModule mpm_prefork_module> StartServers 500 MinSpareServers 5 MaxSpareServers 10 ServerLimit 500 MaxClients 500 MaxRequestsPerChild 0 </IfModule>
Efterfølgende kan du overvåge serveren med Apache-Status, det er her du ser det hvis du har oprettet for mange servere der ikke bliver brugt. Man kan argumentere for at hvis serveren ikke laver andet end webhosting så sker der ikke noget ved at binde en masse ram til passive apache processer, men hvis resourcerne kan bruges bedre til f.eks. en mail- eller filserver bør du sætte den op således at den frigiver de resourcer den ikke bruger.
Hvis du har oprettet og bruger for mange servere vil du se det ved at serveren bliver enormt langsomt og begynder at bruge store mængder swap-space, generelt bør en webserver være sat op sådan at den ikke bruger swap overhovedet.
Der er ikke nogen one-way-fits-all løsning, du er nødt til at prøve dig frem, lave små ændringer, måle på resultatet, ændre lidt mere og måle igen. Dette er ikke en komplet guide, men et vigtigt første skridt.
Held og lykke 🙂