#1 19. 1. 2009 16:45

Wosonj
Člen
Místo: Brno
Registrovaný: 22. 12. 2008
Příspěvky: 63
Web

Jak zjistit paměťově náročné skrpity

Nějaký PHP skript na serveru mi žere velké množství paměti – existuje nějaký způsob, jak jednoduše zjistit, který to je?

Apache 2, PHP 5.2.6. Mam tam prefork s limitem 20 serveru, PHP memory limit je 48M.

Cas od casu, bez souvislosti se zvysenou zatezi serveru, se najednou vysplhaji pametove naroky Apache na 700MB i vice…


hledáme zkušené programátory v PHP / Nette: http://www.twobits.cz/volna-mista/

Offline

 

#2 19. 1. 2009 17:51

vrtak-cz
NDP guru
Místo: Praha/Ústí nad Orlicí
Registrovaný: 8. 3. 2008
Příspěvky: 981
Web

Re: Jak zjistit paměťově náročné skrpity

Není možné spíš to že ti nějáké scripty zůstanou „vyset“(běžet)? Nebo máš dostatečně malí time limit? Většinou když se mi tohle stávalo tak to bylo právě tím že běžel třeba 40× coronový script který zpracovával nějáká data a tak měl větší time limit a já si toho něják nevšimnul…


„Nastala chyba která neměla nastat“ aneb „Když se chce všechno jde.“

Offline

 

#3 19. 1. 2009 18:43

Wosonj
Člen
Místo: Brno
Registrovaný: 22. 12. 2008
Příspěvky: 63
Web

Re: Jak zjistit paměťově náročné skrpity

To uz jsem proveroval – cron skriptu je tam hodne, ale z tech, ktere by to mohly delat, pouzivaji vsechny zamek, takze se pri pokusu o soubezne spusteni okamzite ukonci.

Time limit je tam nastaveny myslim na 6 min, bohuzel je tam spousta (legitimnich) narocnych skriptu, ktere jinak timeoutuji. Kdyby se tam nahromadily dlouho trvajici skripty, tak to poznam bud na zatezi nebo na dlouhe fronte na httpd – jenze to se presne nestava. Mam pusteny ssh, kde vidim celkovou pamet httpd spolecne se zatezi a pres server-status se divam na vytizeni apache. Kdyz nastane ten problem, tak je zatez treba 0.4 (coz je normal), server-status mi ukazuje vzdy nejake workers ve stavu „Waiting for connection“, ale pamet pro httpd najednou vyleti na 700MB.

Podle mne to delaji nejake PHP skripty, problem je, ze nevim jake a nechci na to prichazet metodou pokus omyl, kdy nastavim maly limit na memory…

Spis jestli neexistuje neco jako Apachetop, ale aby to zobrazovalo pamet alokovanou pro jednotliva vlakna httpd – nebo nejaky zpusob, jak to logovat…


hledáme zkušené programátory v PHP / Nette: http://www.twobits.cz/volna-mista/

Offline

 

#4 19. 1. 2009 20:00

simon
Člen
Registrovaný: 7. 10. 2008
Příspěvky: 173

Re: Jak zjistit paměťově náročné skrpity

muzes zkusit http://freshmeat.net/…/apache-top/ ale zadne zkusenosti s tim nemam, jen jsem do adresniho radku napasal apache top a tohle mi vylezlo

Offline

 

#5 20. 1. 2009 8:39

Wosonj
Člen
Místo: Brno
Registrovaný: 22. 12. 2008
Příspěvky: 63
Web

Re: Jak zjistit paměťově náročné skrpity

apachetop pouzivam, ale ten to zobrazit neumi. Myslel jsem, jestli nevite o necem podobnem, co ale bere info primo z httpd serveru. Apachetop jen zobrazuje informace ze serverovych logu, kde se pamet neuvadi.


hledáme zkušené programátory v PHP / Nette: http://www.twobits.cz/volna-mista/

Offline

 

#6 20. 1. 2009 9:30

simon
Člen
Registrovaný: 7. 10. 2008
Příspěvky: 173

Re: Jak zjistit paměťově náročné skrpity

Aha tak to jsem nevedel

Offline

 

#7 21. 1. 2009 11:04

danaketh
Člen
Místo: Praha
Registrovaný: 27. 12. 2008
Příspěvky: 23
Web

Re: Jak zjistit paměťově náročné skrpity

http://in.php.net/pcntl

Možná tohle by mohlo pomoct.

Jinak ale stačí „ps -al“ do terminálu (pokud máte tu možnost) a mrknout co za scripty běží a jak vytěžují CPU a paměť.

Editoval danaketh (21. 1. 2009 11:11)


Saying that Java is nice because it works on all OS's is like saying that anal sex is nice because it works on all genders.

Offline

 

#8 21. 1. 2009 15:14

Wosonj
Člen
Místo: Brno
Registrovaný: 22. 12. 2008
Příspěvky: 63
Web

Re: Jak zjistit paměťově náročné skrpity

ps je mi na nic, tam vidim jen, ze tam jsou nejake procesy „/usr/sbin/httpd -k start“ – nezjistim, jakemu skriptu to odpovida.

Resim to nakonec velmi neelegantne tak, ze postupne do jednotlivych projektu inkluduju test, ktery loguje skripty se spotrebou vic jak 8M a dobou trvani vic jak 5s. Pak z toho doufam vyfiltruju skripty, ktery jsou legitimni…

Porad mi ale prijde, ze jsem narazil na nejakou diru v Apache nebo PHP, ktera tu pamet proste zere…


hledáme zkušené programátory v PHP / Nette: http://www.twobits.cz/volna-mista/

Offline

 

#9 21. 1. 2009 18:05

danaketh
Člen
Místo: Praha
Registrovaný: 27. 12. 2008
Příspěvky: 23
Web

Re: Jak zjistit paměťově náročné skrpity

Hmm, nebo logovat PID a jméno scriptu při jeho spuštění, potom přes ps mrknout který PID tolik papá a konzultovat tento s logem ;)

Možná spíš než ps použít top ale to už je fuk.

Editoval danaketh (21. 1. 2009 18:08)


Saying that Java is nice because it works on all OS's is like saying that anal sex is nice because it works on all genders.

Offline

 

#10 21. 1. 2009 19:10

simon
Člen
Registrovaný: 7. 10. 2008
Příspěvky: 173

Re: Jak zjistit paměťově náročné skrpity

kazdopadne bych se ani nedivil kdyby to byla nejaka dira v apachi nebo php urcite pak napis az bug objevis!

Offline

 

#11 22. 1. 2009 10:13

Wosonj
Člen
Místo: Brno
Registrovaný: 22. 12. 2008
Příspěvky: 63
Web

Re: Jak zjistit paměťově náročné skrpity

Část problému by mohly být circular references v PHP, což by mělo opravit PHP 5.3. Pokud se vytvoří dva objekty, které na sebe vzájemně ukazují, může to způsobit memory leak.

Zatím jsem nastavil natvrdo ServerLimit na 20 a snížil MaxRequestsPerChild na 200 – zatím to jede, ale otázka je, jak dlouho a jakou to zvládne zátěž – naštěstí tam zrovna teď moc velká není. Když to nepomůže, asi začnu experimentovat s worker.c místo prefork.c. Prý je to paměťově podstatně méně náročné, ale zase to nese jiné problémy.


hledáme zkušené programátory v PHP / Nette: http://www.twobits.cz/volna-mista/

Offline

 

#12 21. 2. 2009 0:04

Koubas
Člen
Registrovaný: 20. 2. 2009
Příspěvky: 8

Re: Jak zjistit paměťově náročné skrpity

Memory leaky v PHP nejsou nic neobvyklýho, od toho je konfigurační direktiva apache MaxRequestsPerChild. Normálně apache procesy recyklujou pořád do kola, takže každý běžící proces apache vyřizuje requesty, dokaď ho někdo nesestřelí, nebo dokud v něm (většinou v mod_php) nenastane nějaká kritická chyba a neslítne, to se teprve uvolní paměť a rodičovský apache proces si forkne nového childa do počtu. Bohužel php v některých případech docela teče, takže proces bobtná a bobtná… Volba MaxRequestsPerChild 100 zaručí, že se chid zrecykluje jen 100× a pak spáchá sebevraždu a paměť se uvolní… Časté forkování nových childů je ale na vytíženějším stroji docela drahá operace, tak není dobré nastavit třeba MaxRequestsPerChild 1, chce to najít optimální hodnotu.

Offline

 

#13 21. 2. 2009 12:08

petrs
Člen
Registrovaný: 18. 2. 2009
Příspěvky: 5

Re: Jak zjistit paměťově náročné skrpity

Apache modul mod_status viníka přímo neukáže, ale při zapnutém ExtendedStatus by mohl alespoň mezi běžícími skripty napovědět

Offline

 

#14 9. 8. 2009 23:09

Poky
Člen
Registrovaný: 9. 8. 2009
Příspěvky: 1

Re: Jak zjistit paměťově náročné skrpity

No nevím… Snad by mohlo pomoci si ti zapisovat… Tedy, do těch souborů vložit nějaký kód ve stylu:

<?php if(memory_get_usage()>10000000)mysql_query(‚insert into…‘);?>

a potom by bylo v celku jednoduché to najít ;-)

Offline

 

Zápatí