Optimering af hukommelsesforbrug i Apache

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 🙂

Dette indlæg blev udgivet i Apache, Knowledge Base, Linux, Old Base. Bogmærk permalinket.

Skriv et svar