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.
- 2745 megtekintés
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
- A hozzászóláshoz be kell jelentkezni
Köszi!
Esetleg Apache2 worker + Fast CGI?
- A hozzászóláshoz be kell jelentkezni
az is jó.
Ekkora terhelésnél a fastcgi használata rengeteg memóriát tud spórolni....
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
Memória mindig jól jön, tudsz több apache process-t is belerakni. Bár mod_php-vel elég sokat zabál 1-1 darabja (amiatt jó a fastcgi-s megoldás workerrel).
Az tuti, hogy 256 process csak 3G-t foglalna a levelezőszerverrel, mindennel együtt? (nekem elég kevésnek tűnik)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
á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.
- A hozzászóláshoz be kell jelentkezni
subscribe
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
szerintem nginx + pfp-fpm lenne a nyerő
--------------
Sok ember hord Superman-pizsamát. Superman Chuck Norris-pizsamát hord.
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
É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/
- A hozzászóláshoz be kell jelentkezni
Ezt mekkora memória mellett?
- A hozzászóláshoz be kell jelentkezni
Erre én is kiváncsi vagyok.
- A hozzászóláshoz be kell jelentkezni
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/
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni