Doba odezvy serveru je příliš dlouhá

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

Zdravím,

právě řeším dobu odezvy nette app. Pohybuje se mezi 1.7 – 2s. Latte cachuje, setAutoRefresh(null). Je tam Doctrine. VPS.

Jiné aplikace (třeba WP) se načítají mnohem rychleji (cca 100ms).
Nějaké tipy, na co se zaměřit?

Díky.

Editoval Landsman (1. 8. 2016 2:19)

ali
Člen | 342
+
0
-

Doctrine:

  • pokud mas vetsi mnozstvi zaznamu v DB, ktere strankujes, tak doporucuju tento postup pro nastaveni paginatoru
$paginator = new Doctrine\ORM\Tools\Pagination\Paginator($qb->getQuery());
$paginator->setUseOutputWalkers(FALSE);
$this["paginator"]->setItemCount($paginator->count());
  • dale bych doporucil u OneToMany a ManyToMany nastavit fetch=„EXTRA_LAZY“, pri velkem objemu dat tak muzes urychlit ukladani novych zaznamu
newPOPE
Člen | 648
+
0
-

Dovodov moze byt vela. Skontroloval by som si nastavenie servera, PHP. Pises ze Nette cachuje ale cachuje aj Doctrine (negenerujes proxy pri kazdom requeste?)

Landsman
Člen | 152
+
0
-

newPOPE napsal(a):

Dovodov moze byt vela. Skontroloval by som si nastavenie servera, PHP. Pises ze Nette cachuje ale cachuje aj Doctrine (negenerujes proxy pri kazdom requeste?)

To by se měnil datum změny u proxies souborů, že? Jak často se to invaliduje?

Jan Tvrdík
Nette guru | 2595
+
+3
-

@Landsman Buď můžeš zkusit náhodně zrychlovat různé částí aplikace a doufat, že to dobře tipneš. Nebo to můžeš změřit přes Blackfire. Volba je na tobě.

Landsman
Člen | 152
+
0
-

Dívám se na ten zápis:

$config->setAutoGenerateProxyClasses(FALSE);

Jak jej zapsat do neonu? Či se tak Kdyby chová defaultně?

David Matějka
Moderator | 6445
+
0
-

Je ten problem pouze na serveru, nebo i na lokalu? Jaky system bezi na VPS?

Zkus si to pripadne spustit na lokalu s dumpem produkcni db (jestli je nejaka vetsi).

Landsman
Člen | 152
+
0
-

@DavidMatějka Debian.
Ten problém je i na lokálu, ale mám pomalejší stroj, tak jsem to sváděl na to.
Bude to tedy opravdu v aplikaci.

iguana007
Člen | 970
+
0
-

@Landsman tak si nad tím pusť nějaký profiler, potom by to už mělo být snadné. Buďto přes Blackfire, jak už ti radil @JanTvrdík nebo si vyber něco tady: http://stackoverflow.com/…a-php-script

Editoval iguana007 (1. 8. 2016 14:14)

Landsman
Člen | 152
+
0
-

Díky, blackfire je super!

Vypadá to na router. Je tam custom eshop a generuje se tam x desítek adres.
Napadá mě to minimálně rozdělit na více routerů a shop přesunout na subdoménu, která by šla lehce detekovat pro onen router.

Editoval Landsman (1. 8. 2016 22:54)

iguana007
Člen | 970
+
0
-

@Landsman Tak jej nám ukaž, třeba ti tam najdeme problém ;)

Jan Tvrdík
Nette guru | 2595
+
0
-

@Landsman Bez konkrétního příkladu jde těžko poradit. Většinou stačí zajistit, že máš všechny informace pro sestavení URL v Application\Request, tj. nemusíš pak pro každý odkaz poslat dotaz do DB.

Pokud to chceš hodně zoptimalizovat, tak zvaž, jestli se ti nevyplatí přidat třeba vlastní makro {productLink $product}, který vygeneruje odkaz na produkt mnohem rychleji než když každý odkaz musí projít přes presenter a router. Alternativně (pokud nechceš měnit kód šablon) můžeš přetížit existují makra link, plink a n:href, aby dělali to samé jako {productLink} na základě statické analýzy v době kompilace.

Landsman
Člen | 152
+
0
-

@JanTvrdík To zní fajn.

Vidím to jednoduše tak, že dám před kategorie a detaily zboží prefix pro router, čímž pozná, o jaký modul, presenter jde a nebude muset probírat to kvantum adres z databáze. 404 pak vytvořím až uvnitř presenteru. Tím by se tomu mělo značně ulevit.

Ještě mě zajímá docela ta optimalizace Doctrine. Také mě láká zkusit Redis.

Jan Tvrdík
Nette guru | 2595
+
0
-

Vidím to jednoduše tak, že dám před kategorie a detaily zboží prefix pro router

To zrychlí jenom volání match, ne? Myslel jsem, že máš problém s generováním hodně odkazů.

Landsman
Člen | 152
+
0
-

Zde je výstup testu: https://blackfire.io/…d84e02/graph

Felix
Nette Core | 1245
+
0
-

6 462 se tam zaklada Route, to mi prijde trochu zvlastni. Jak tam resis routovani?

Jan Tvrdík
Nette guru | 2595
+
0
-

Jn, to bohužel vypadá, že je to routování vyřešeno úplně špatně. Počet route objektů by měl být minimálně 100× menší.

Jiří Nápravník
Člen | 710
+
0
-

Landsman napsal(a):

Zde je výstup testu: https://blackfire.io/…d84e02/graph

Ukaz App\RouterFactory::createCatalogRouter

Landsman
Člen | 152
+
0
-

Souhlas je to úlet. Předělám to na ty prefixy, aby se do routeru nemuseli cpát ty individuální adresy.

Dotaz: lze nějak zapsat pravidlo pro subdoménu? Líbilo by se mi: shop.domena.cz ⇒ router by hned věděl že jde o shop kategorie a už by řešil jen jakou. A nasměroval bych subdoménu jako alias.

Editoval Landsman (2. 8. 2016 17:08)

Jan Tvrdík
Nette guru | 2595
+
0
-

@Landsman Myslíš něco jako https://github.com/…ull/43/files#… ? V určitých situacích může být užitečný i https://github.com/…tatic-router

Landsman
Člen | 152
+
0
-

@JanTvrdík Díky, prostuduji.

Nemáte zkušenost s blackfire a více uživateli? Přidal jsem druhého programátora do Environment, ale přes chrome plugin mu to hlásí, že není autorizován k requestům. Vypadá to, že mohou být zadány vždy jen jedny client credentials nebo ne?

Landsman
Člen | 152
+
0
-

Router poladěný, jsme na cca 474 ms z čehož 68.3% žerou funkce file_get_contents(), které se používají na načtení SVG obrázků, což mě dost zaskočilo.

Nelze je lépe cachovat?

EDIT:

Vyřešil jsem to vytvořením custom makra svg v kterém otevírám ikony přes fopen() a voala, jsme na 158 ms, tedy 86% zlepšení! Ještě tam jsou limity v porovnávání GPS vzdáleností, ale to prostě trvat bude.

Dost mě zaujalo však toto doporučení:

You should dump optimized Composer autoloader
metrics.composer.autoload.find_file.count 242 <= 50

Editoval Landsman (5. 8. 2016 2:54)

Martk
Člen | 661
+
0
-

Composer pro autoloading nepoužívá jen classmapu, ale i jiné autoloadery (psr-0, psr-4), které jsou pomalejší. Řešení je jednoduché převést všechny psr-0 a psr-4 na classmap.

Příkaz pro composer: composer dump-autoload -o

potom je ještě přepínač -a, který implicitně zapíná -o. Rozdíl je v tom, že když je zapnut, tak se načítají třídy jen z classmapy a když není nalezeno, tak se neprovádí další nahrávání v rámci composeru (psr-0, psr-4).

Anglický článek: http://mouf-php.com/…-performance

Editoval Antik (5. 8. 2016 8:37)

Landsman
Člen | 152
+
0
-

Antik napsal(a):

Composer pro autoloading nepoužívá jen classmapu, ale i jiné autoloadery (psr-0, psr-4), které jsou pomalejší. Řešení je jednoduché převést všechny psr-0 a psr-4 na classmap.

Příkaz pro composer: composer dump-autoload -o

potom je ještě přepínač -a, který implicitně zapíná -o. Rozdíl je v tom, že když je zapnut, tak se načítají třídy jen z classmapy a když není nalezeno, tak se neprovádí další nahrávání v rámci composeru (psr-0, psr-4).

Anglický článek: http://mouf-php.com/…-performance

Díky za informace. Zkusil jsem a přihoršilo si to o cca 10 ms, doporučení každopádně zmizlo, tak nevim.

Martk
Člen | 661
+
0
-

@Landsman Příčinu bych hledal jinde, tohle ti nemůže zpomalit aplikaci, jenom zrychlit ;)

Landsman
Člen | 152
+
0
-

@Antik Také mi připadalo divné, jiné změny však neproběhly. Ještě postuduji jak efektivněji porovnávat gps vzdálenosti míst, to tam nyní baští nějaký čas.

Btw: Co ten file_get_contents()? Proč to latte necachuje result, když jde o lokální soubor @DavidGrudl? Hodně lidí doporučuje zobrazovat svg obrázky právě takto.

Martk
Člen | 661
+
0
-

Makro se převede do php kódu a to se zacachuje (nadále se neprovádí převedení makra), tzn. funkce file_get_contents() se vykonává. Řešením může být cachování v šablonách.

{cache svg}
	{svg first}
	{svg second}
{/cache}

Pozor dávej obzvláště na invalidaci.

Landsman
Člen | 152
+
0
-

@Antik Já to právě vyřešil custom makrem, jen mě zaujala nenažranost té funkce + že to latte automaticky nezacachovalo, když je to lokální soubor.

GEpic
Člen | 566
+
0
-

Možná blbý dotaz, ale proč SVG rovnou vykreslujete, a nenecháte jen link k souboru, aby se uživateli vykreslil sám?

Editoval GEpic (5. 8. 2016 21:41)

Landsman
Člen | 152
+
0
-

@GEpic Vkládání kódu samotného se mi osvědčilo nejlépe, dobře se stylují prvky svg, hovery a podobně. A takto ze souboru je to zase snadné na případnou výměnu.

Editoval Landsman (5. 8. 2016 23:50)