MaxExecutionTime u profileru

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Jakub Šulák
Člen | 222
+
0
-

Nešlo by u profileru přidat možnost nastavit nějaký maximální čas běhu skriptu, přičemž by po překročení tohoto času došlo k vyhození vyjímky na úrovni E_NOTICE?

Jedná se mi o to, že testujeme kód na lokálním serveru, kde je logicky vše rychlejší. Na serveru se pak setkáváme někdy s tím, že co bylo rychlé u nás, na serveru je neskutečně pomalé – pustit tam ale profiler logicky nelze. Takže se to musí ukládat do log souboru, nebo posílat mailem – obojí umí již současný Nette\Debug. Takže změna profileru by byla minimální – lepší než přidávat celou vlastní třídu, která by se o to starala.

Ale je to jen návrh…

PetrP
Člen | 587
+
0
-

Jakub Šulák napsal(a):

pustit tam ale profiler logicky nelze.

Proč by nešel pustit profiler? Můžu si přece aplikaci otestovat například na jiné subdoméně. Myslím že je to dokonce lepší než to rovnou pustit do ostrého provozu a modlit se aby tam nebyl nějakej rozdíl oproti serveru doma.

Nešlo by u profileru přidat možnost nastavit nějaký maximální čas běhu skriptu

A proč to neřešit sám pár řádkama kódu?

// začátek scriptu (mohl bych asi použít i defaultní měřič)
Debug::timer('MaxExecutionTime');

// někde na konci
if (Debug::timer('MaxExecutionTime') > MAX_EXECUTION_TIME)
	throw new MaxExecutionTimeException;
	nebo // protože jsem nepochopil zda má být vyhozena vyjímka nebo E_USER_NOTICE
	trigger_error("MaxExecutionTime", E_USER_NOTICE);
Jakub Šulák
Člen | 222
+
0
-

ad 1)
Na subdoméně testuješ stále jen „uměle“ – pokud máš ve špičce během minuty vygenerováno cca 1000 stránek, začíná se skript (z hlediska výkonu) chovat někdy jinak (především například při přístupu k DB, nebo filesystému). Dále se tak dá právě zjistit špičky (a například vyřadit v té době nějaké dávky – CRON).

ad 2) Jelikož je to právě pár řádků, napadlo mě, že by to šlo dát přímo do Nette – něco podobného totiž již nyní v naší aplikaci běží.

phx
Člen | 651
+
0
-

Osobne mam opacny problem. Doma se mi nette pohybuje obcas i pres 1,5 sekundy a na serveru se vejdu do 1 s. Hold lepsi masina. Ale i tak ten cas na localhostu je sileny. Nejake napady krome cache?

o5
Člen | 416
+
0
-

Z grafu zde to tedy u Nette (je to ale staré měření) moc nevypadá, ale jinde je použítí eAccelerator docela přínosem. Ale nezkoušel jsem to.

Jakub Šulák
Člen | 222
+
0
-

to phx: Záleží na aplikaci – někde se projeví to, že skript běží v n instancích.
Ad zrychlení aplikace – záleží co ti tu aplikaci zpomaluje – databáze, algoritmus, příliš velké nepotřebné objekty… Jinak mám aplikaci, která má cca 150 objektů a kolem 5000 řádků kódu (oboje odhad) a nyní jsem například model (cca 70 objektů) sjednotil do jednoho souboru (compressed verze) – nárůst výkonu o cca 30%. Stejně tak je velký rozdíl, zda používám compressed verzi Nette a dibi (případně dalších knihoven).

onge
Člen | 53
+
0
-

Tak ono pokud to bylo v 70 souborech a na vsechny se volal require_once, tak se neni cemu divit :)

PetrP
Člen | 587
+
0
-

Jakub Šulák napsal(a):

ad 1)
Na subdoméně testuješ stále jen „uměle“ – pokud máš ve špičce během minuty vygenerováno cca 1000 stránek, začíná se skript (z hlediska výkonu) chovat někdy jinak (především například při přístupu k DB, nebo filesystému). Dále se tak dá právě zjistit špičky (a například vyřadit v té době nějaké dávky – CRON).

Tak můžeš zátěž generovat. U více navštěvovaného webu zátěžovej test bude asi nutností. A skoušet to na skutečných lidech vidím jako nešťastné ;]

ad 2) Jelikož je to právě pár řádků, napadlo mě, že by to šlo dát přímo do Nette – něco podobného totiž již nyní v naší aplikaci běží.

Otázka je jestli by z toho měl někdo užitek. A hlavně by to nemohlo bejt součástí profileru, protože ten se na produkčním serveru nezapíná. Takže by se pro to musela udělat další udělátko, které by se muselo zapínat a taky nějak nastavovat ten čas při kterým to ‚zařve‘. To zapnutí tohohle udělátka vyjde na stejné množství kódu jako když to rovnou někam zapíšu. A taky funkce register_shutdown_function (předpokládám že přes ní je profiler dělanej) nemůže obsahovat exception, takže by se to muselo dávat jinam. Ale kam?

Jakub Šulák
Člen | 222
+
0
-

ok, nechám to na aplikaci, aby to hlásila…
PS: S tím zátěžovým testem je to fajn základ, ale neodhalíš vše – v reálu je to vždy trochu jinak (především asi tím, že lidé používají aplikaci jinak než vývojáři).

phx
Člen | 651
+
0
-

Ja jsem mel vse pre require, ale nakonec jsem presel na robotloader aby se nacitalo jen to nejnutnejsi.

Doporucil by jste mi nekdo nejaky profiler? Abych zjistil ktera cast aplikace je nejvice problematicka.

David Grudl
Nette Core | 8142
+
0
-

Profiler by měl mít XDEBUG, je také součástí IDE Nusphere PHPEd.

Jinak request trvající 1 s mi připadá hodně moc. To by chtělo zjistit, co to brzdí.

phx
Člen | 651
+
0
-

Nevite nekdo o necem free? (Eclipse PDT to nema a nebo jsem to nenasel:( )

edke
Člen | 198
+
0
-

phx wrote:

Nevite nekdo o necem free? (Eclipse PDT to nema a nebo jsem to nenasel:( )

Ako pisal David, profiler obsahuje xdebug. Len neviem ci na tom servri mas pristup ku konfiguracii webservra.

Potom v zavislosti od linux distribucie, resp. windows konfiguracie musis zmenit xdebug.ini pre php5. Napriklad na ubuntu to je vo /etc/php5/conf.d:

xdebug.profiler_enable=1
xdebug.profiler_output_dir=/tmp/xdebug-profiler
xdebug.profiler_output_name=grind.%s.out

Ci naozaj si profiler zapol je dobre skontrolovat cez phpinfo(). Ked uz profiler bezi, kazdy request vygeneruje do output_dir grind subor, ktory potom analyzujes v programoch ako napriklad KCacheGrind pod linuxom, alebo WinCacheGrind pod win. Viac info aj s linkami ku programom najdes tu.

phx
Člen | 651
+
0
-

Supr… tak na to koukam a profiler mi tvrdi 490ms ale muj merenej cas ukazuje 4.6879s.

Napada mne ze by to mohlo byt zdrzovano necim co profiler nezapocitava. (cekani na systemove fce, parsovani PHP zdrojaku)

Nejake napady?

edke
Člen | 198
+
0
-

phx wrote:

Supr… tak na to koukam a profiler mi tvrdi 490ms ale muj merenej cas ukazuje 4.6879s.

Napada mne ze by to mohlo byt zdrzovano necim co profiler nezapocitava. (cekani na systemove fce, parsovani PHP zdrojaku)

Nejake napady?

Hm, zvlastne a ako si dostal ten tvoj cas ? Meral si to cez profiler ? Potom povedal by som ze ti neostava, ako to pracne pomerat cez Debug::timer(), postupne, cez jednotlive useky aplikacie.

Jod
Člen | 701
+
0
-

Ak to meriaš cez Firebug tak je to jasné x))

Editoval Jod (23. 2. 2009 20:44)

phx
Člen | 651
+
0
-

Mam jeden Debug::timer() na zacatku aplikace a pak v paticce v sablone. Asi mi nic jineho nezbyde. I kdyz je pravda, ze to jede ve Virtualni Masine a jeste na sdilenem disku. (Host sdili data pro Virtualni Masinu)

pmg
Člen | 372
+
0
-

Možná to napojit na $application->onStartup a $application->onShutdown? Ale to je detail.

PetrP
Člen | 587
+
0
-

pmg napsal(a):

Možná to napojit na $application->onStartup a $application->onShutdown? Ale to je detail.

$application->onStartup se volá až v $application->run() a i tam se před tím např nastavujou hlavičky, to nepočítám že v bootstrapu můžu mít bůhvíjak náročnou činnost. Takže je na měření doby běhu skriptu nevhodné.

$application->onShutdown by na toto asi bylo použitelné.

Ale to je taky jen detail ;]

Jod
Člen | 701
+
0
-

phx: takto som to robil aj ja a vyšlo mi menšie číslo než v profileru. Nebude tých 4.68s 468ms? Môžeš eštep oužiť Debug::$timer, ten sa naplní pri Debug::init(). Ten používam teraz v pätičke.

phx
Člen | 651
+
0
-

Jeste to otestuju, ale 4.68s je realny. (Bych poznal hned ze stranka se nacetla za 468ms a ne za 4.68s:)

Pouzivam WinCacheGrind.

Jod
Člen | 701
+
0
-

No keď ti profiler ktorý sa vykreslí po patičke píše menšie číslo ako čas v pätičke =D

phx
Člen | 651
+
0
-

Tak jsem to ten samy soubor otevrel v KCacheGrind a tam uz je cas spravne. Autor WiCacheGrind neumi prevody jednotek:)) (1s = 100ms LOL)

Muzu zverejnit vysledek z profileru pokud ma nekdo zajem.

edke
Člen | 198
+
0
-

phx wrote:

Tak jsem to ten samy soubor otevrel v KCacheGrind a tam uz je cas spravne. Autor WiCacheGrind neumi prevody jednotek:)) (1s = 100ms LOL)

Muzu zverejnit vysledek z profileru pokud ma nekdo zajem.

HA, na linuxe to bezi, tak to ma byt :)