[Megoldva] Apache memóriakeresés

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

Szerkesztve: 2020. 05. 20., sze – 11:34

Mindezt milyen MPM modullal? Prefork? Worker? Bármimás?

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.

:(

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

An associated question that arises here is, of course, what modules you need, and which ones you don't. The answer here will, of course, vary from one web site to another. However, the minimal list of modules which you can get by with tends to include mod_mime, mod_dir, and mod_log_config. mod_log_config is, of course, optional, as you can run a web site without log files. This is, however, not recommended.

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.

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? :) 

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.