Fórumok
Egy Debianon futót Apache szerver memóriaigényét szeretném megérteni. Az apache processzek memóriafelhasználását a ps segítségével vizsgálom (-o rss).
Teszt környezetben egy-egy kérelem kiszolgálására 16MB memóriát használ, míg éles környezetben 126MB-ot. (Csak statikus kérelem esetén is.) Konfigurációk, modulok azonosak, csak a VirtualHost-ok számában és a gépek teljesítményében van lényeges eltérés.
Mi okozhat ilyen jelentős különbséget egy-egy kérelem kiszolgálásának memóriaigénye között?
Megoldás:
Prefork módban minden kérelmet kiszolgáló processz betölti a saját memóriájába a teljes konfigurációt, így a kérelmenként lefoglalt memória mérete arányosan nő a VirtualHost-ok számával.
Részletek a hozzászólásokban
Hozzászólások
Mindezt milyen MPM modullal? Prefork? Worker? Bármimás?
prefork
Érdekel.
ha van mod_php akkor prefork apache esetén a teljes modul - opcode cache-el együtt- ott van minden egyes apache processzben.
Köszönöm, nagyon jó ötlet volt!
A teszt környezetben a mod_php7 kikapcsolása 15MB-ról 9MB-ra csökkentette a kérelmenkénti memóriaigényt.
Éles környezetben is kikapcsoltam ezért a php7 modult, és átirányítottam php-fpm-re. Azonban továbbra is 123MB memóriát foglal le kérelmenként. Ez néha felmegy akár 140MB-ra is.
A memóriaigény független attól is, hogy http vagy https-e a kérelem.
:(
"A memóriaigény független attól is, hogy http vagy https-e a kérelem. "
huhh. vissza az alapokhoz :(
Ha php-fpm -re váltottál, akkor kapcsold át az Apache-ot prefork-ról worker, vagy event modellre.
Ha bármi egyéb miatt szükség van a prefork modellre, akkor nézd át a többi modult is, és kapcsold ki ami nem kell. (Prefork esetén minden modul benne van minden processzben.)
Ez security szempontból sem rossz lépés.
https://httpd.apache.org/docs/2.4/misc/perf-tuning.html
Egyrészt értem én, másrészt mégsem, hisz minden modul a teszt gépen is benne van minden processzben, mégis már csak 9MB egy-egy processz memóriaigénye.
A teszt környezetben kipróbáltam a worker és event modulokat is, de mindegyikkel több, 10-11MB a processzenkénti meóriaigény.
Ennek ellenére ki fogom próbálni éles környezetben is a modellváltást, de továbbra sem értem, mi eszik annyi memóriát az éles környezetben.
Azert azt is nezd meg, hogy a teszt es eles kornyezetben ugyanolyan modul toltodik-e be, vagy mondjuk elesen a php modul meg maga ala berant-e kismillio mas modult is (php conf).
Szerk: reload vs restart. talakoztam olyan apache modullal, ami a reloadot rosszul viselte, es betoltotte magat megegyszer (valami audit modul volt emlekeim szerint).
Köszönöm a javaslatot, végül ez lett a megoldás.
Ráadásul worker módban, az éles környezetben egy-egy processz amellett, hogy több kérelmet is képes kiszolgálni, még önmagában is kevesebb memóriát foglalt le. A konkrét esetben a 126MB helyett már csak 90MB körül.
Az event modellt nem próbáltam, mivel a worker is lényeges javulást eredményezett.
Azt már csak gyanítom, hogy a mod_php miatt lett az alapértelmezett modell a prefork.
" Azt már csak gyanítom, hogy a mod_php miatt lett az alapértelmezett modell a prefork. "
Ez így van. A mod_php nem thread-safe, worker vagy event modell esetén képes érdekes dolgokat produkálni.
Mi okozhat ilyen jelentős különbséget egy-egy kérelem kiszolgálásának memóriaigénye között?
Az nginx? :)
Igen, .htaccess nélkül az élet gyönyörű!
Lehet hogy nem file-okat kell a netre feltolni gondolkodas nelkul, csak ugy, passiobol hanem... helyette tartalomkezelest csinalni? Hja :/
Jobb híján csinálj egy memory dumpot (gcore) a processről és nézz bele pl strings-szel, hátha rájössz, hogy mi az a sok memória amit megeszik.