Apache fine tuning

Fórumok

Sziasztok,

Adott egy Ubuntu 9.10, 4GB RAM, 2 x Intel(R) Pentium(R) D CPU 3.00GHz, Apache2, PHP, MySQL.
Fut rajta több oldal és levelezés. Ezek közül az egyik oldal nagyon látogatott lett, napi 100.000 egyedi látogató (GA szerint) és kb. 300-400 ezer oldalletöltés. Nos, az Apache-t kéne egy picit tuningolni, hogy elviselje ezt a terhelést.

A jelenlegi beállítás szerint prefork mpm-t használok.

#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300

#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On

#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100

#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 5

##
## Server-Pool Size Regulation (MPM specific)
##

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves

StartServers 256
MinSpareServers 30
MaxSpareServers 100
MaxClients 256
MaxRequestsPerChild 1000

Ehhez kérném tapasztaltabb kollégák segítségét. Jelenleg szép lassan elfogy a memória, de valamit biztos én konfiguráltam félre.

Köszi előre is.

Hozzászólások

minimum:

Timeout 30
MaxRequestsPerChild 50000 (de akár 0)
KeepAliveTimeout 2 (vagy 1)

MinSpareServers 5
MaxSpareServers 20
...

De inkább:
Ha most mod_php van, akkor inkább fastcgi használata és apache nginx

Ha nem nagy gond a migráció, akkor ajánlanám én is a worker + fastcgi-t. Apache-t is érdemes amúgy elhagyni idővel (amennyiben nincsenek függőségeid).
Amúgy próbáld ki a zwei által írottakat, mivel ezekkel a paraméterekkel is már jelentősen lehet növelni a teljesítményen, annyit azért hozzátennék, hogy a nagyon magas MaxRequestsPerChild nem túl jó ötlet, főleg ha van valami gány kód, így a 0 bizonyos esetekben szintén nagyon ellenjavalt. Tény, hogy nem szabad nagy forgalmú oldalon alacsonyan tartani, mivel az új processek létrehozása is idő, meg munka a gépnek.

A MaxRequestsPerChild nem nulla értéke esetleges memleak-ek esetén hasznos. Ha hoszabb futás esetén jelentősen megnő az apache processek mérete, az lehet egy esetleges memleak-re utaló jel, ilyenkor lehet kisérletezni a MaxRequestsPerChild kisebbre vételével.

még valami: nagy forgalom esetén a diszk I/O is lehet szűk keresztmetszet.
Erre az esetre alaptrükkök pl.
- a mysql temp tábláit a /dev/shm-re rakni (vigyázat, repair table előtt érdemes visszarakni diszkre, mert felzabálja a memóriát, vagy, ha a /dev/shm méretkorlátos, akkor nem fut le.)
- a php session-okat szintén /dev/shm-re rakni. (és cron-ba rakni 2-3 percenkénti scriptet, ami az inaktívakat törli, különben ez is felfalja a memóriát.)
- Apache BufferedLogs használata. (néha segít, néha nem.) Ekkora forgalomnál meg már számít a logolás is, úgyhogy ha nincs szükség arra, hogy minden szirszart logoljon, akkor érdemes minimalizálni a logokba kerülő információkat.

Köszi mindenkinek.
Jelenleg a 3-as load mellett villámgyors az oldal és van kb. 1 GB szabad memória is stabilan az alábbi beállításokkal.

StartServers 5
MinSpareServers 5
MaxSpareServers 20
MaxClients 256
MaxRequestsPerChild 0

Még biztosan fogok rajta hangolni, pl. a logolást, de egyelőre jónak tűnik nagy terhelés mellett is. Esetleg +4GB még segíthet, nem?


top - 22:49:32 up 15 days, 23:07, 4 users, load average: 1.36, 1.71, 2.12
Tasks: 264 total, 2 running, 262 sleeping, 0 stopped, 0 zombie
Cpu(s): 36.8%us, 50.2%sy, 0.0%ni, 12.5%id, 0.2%wa, 0.0%hi, 0.3%si, 0.0%st
Mem: 4058364k total, 2915536k used, 1142828k free, 167424k buffers
Swap: 7811064k total, 458872k used, 7352192k free, 1413592k cached

Ez az aktuális top-ból van.

állíts be pár mérést munin-al, ha még nem lenne.
Hangoláskor alap dolog a mérés. Ha van másik webszervered, arra rakhatsz egy olyan mérést is, ami a nagy terhelésűnek a http válaszidejét méri. Így a szubjektív "gyors" helyett lesz egy konkrét számod is.

Ekkora terhelésnél tényleg jobb megoldás a fastcgi, mert jóval kevesebb memóriát (kevesebb mint felét, adott esetben akár a harmadát) fog használni az apache, és több jut file-cache nek.

szerintem nginx + pfp-fpm lenne a nyerő
--------------
Sok ember hord Superman-pizsamát. Superman Chuck Norris-pizsamát hord.

Én kb ezt javaslom, ez egy kipróbált conf, az általad leírtnál nagyobb terheléssel ment.

apache2.conf:


Timeout 10 # Max.: 15

KeepAlive Off

<IfModule mpm_prefork_module>
    StartServers           80
    ServerLimit          2400
    MinSpareServers        80
    MaxSpareServers      3600
    MaxClients           1600
    MaxRequestsPerChild  1000
</IfModule>

Header unset ETag
FileETag None

sysctl.conf:


net.ipv4.tcp_keepalive_time = 15
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 5

Ez után, jmeter, vagy http_load segítségével nyaggasd meg a confot és figyeld a válaszidőket.
----
올드보이
http://molnaristvan.eu/

Háááát...
8G RAM + 2db Intel E5410 proci
~720 - 800 req/sec és 1.4 - 1.7 -es load mellett.

4G RAM mellett a load jellemzően 2 alatti volt

Ha megfigyelitek a StartSrvers és a MinSpareServers csak 80 és mivel a tcp keepalive sem jellemző (sysctl beállítások) nem falta a memóriát az apache.
----
올드보이
http://molnaristvan.eu/

S mi történt volna, ha elkezdik DDOS-olni a szervert? Akkor igen gyorsan jött volna egy OOM nem?

A tcp stackben ok, hogy leveszed a timeout-ot, illetve a webszerveren, de ez akkor nem nagyon segít. No meg érdemes a conntracket is tuningolni, mert 700-800 req-nél már az is szeret betelni.

Illetve akkor is gáz van, ha az adatbázis szerver kapcsolattal, diskekkel bármivel gond van, és csak vár, aztán frissít a user, aztán megint jön pár process.

anno én 250 process-t csináltam (120 indított), 15 spare server volt minimum, timeout-okat levettem minimálisra (ahol még lefutottak a hosszabb perl scriptek is cgi-ként, tehát olyan 30 körül volt emlékeim szerint), így sikerült elérni 300-400 req/s-t. Többet nem lehetett anélkül kihozni, hogy ne legyen túl magas a Committed_AS, ami ugye nem túl jó, ha elszáll.

Ja itt a konfig 8 gigánál (ez emlékeim szerint, mivel azután át lett téve nginx+php-fpm alá az egész, ott meg elment 2 giga memóriával is 2 nginx workerrel, meg nem túl sok php processel :) ):

StartServers 120
MinSpareServers 15
MaxSpareServers 30
MaxClients 250
ServerLimit 250
MaxRequestsPerChild 3000