Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2308 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4  5  6  7  8  9  10  11  12
Auteur Sujet :

Symfony : questions

n°1978439
flo850
moi je
Posté le 29-03-2010 à 15:40:02  profilanswer
 

Reprise du message précédent :
j'ai un petit problème de performance

 

j'utilise l'extension de ratibus et exhprof , et je m'aperçois qu'un simple Doctrine_Core::getTable prends plus de 100 ms, qu'un Doctrine_Core::getTable('bidule')->find(1) prends 150ms, sur une table qui à 10 enregistrements

 

J'ai merdé queqlue part , ou bien il y a une solution ?


Message édité par flo850 le 29-03-2010 à 15:45:33
mood
Publicité
Posté le 29-03-2010 à 15:40:02  profilanswer
 

n°1978446
theredled
● REC
Posté le 29-03-2010 à 15:49:05  profilanswer
 

C'est sûrement le premier Doctrine_Core::getTable, qui t'instancie le modèle et tout. Mais c'est long quand même, tu peux pas profiler en bas-niveau avec xdebug ? (ou exhprof, je connais pas [:dawao])


Message édité par theredled le 29-03-2010 à 15:49:42

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1978457
flo850
moi je
Posté le 29-03-2010 à 15:57:46  profilanswer
 

act as versionable : 250 ms pour l'initialisation, par table,  j'ai 6 tables versionnées  

 

ouch


Message édité par flo850 le 29-03-2010 à 16:05:56
n°1978472
theredled
● REC
Posté le 29-03-2010 à 16:21:58  profilanswer
 

Doit y avoir un pb :o

 

Parfois ya des bugs de perf tous bêtes que personne ne relève, faut pas hésiter à chercher en profondeur et ticketer.


Message édité par theredled le 29-03-2010 à 16:24:21

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1978475
flo850
moi je
Posté le 29-03-2010 à 16:24:23  profilanswer
 

déjà que le comportement de versionable ne correspond pas tout à fait à mes besoin -> zou poubelle

 

Lorsque tu effaces l'objet sélectionné, ça efface aussi toutes les versions, c'est nul . Si je veux une table de version, c'est pas pour polluer, en plus, mes tables principales

 

sur la page que je cherche à optimiser, j'ai 78 requetes:
temps de requetes  SQL : 2.41ms
temps passé dans Doctrine_Query ::execute : 2080ms

 

je ne pensais pas prendre une telle pénalité en utilisant doctrine :/

Message cité 1 fois
Message édité par flo850 le 29-03-2010 à 16:32:19
n°1978656
Tirkyth
Posté le 29-03-2010 à 20:42:42  profilanswer
 

Si c'est juste pour de l'affichage tu peux changer le mode d'hydratation ça devrait te faire gagner pas mal non ?

n°1978674
theredled
● REC
Posté le 29-03-2010 à 21:45:47  profilanswer
 

flo850 a écrit :


sur la page que je cherche à optimiser, j'ai 78 requetes:
temps de requetes  SQL : 2.41ms
temps passé dans Doctrine_Query ::execute : 2080ms  


C'est les 3 secondes qui te posent pb, pas plutôt les 78 requetes ? :o
 


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1978675
flo850
moi je
Posté le 29-03-2010 à 21:55:50  profilanswer
 

c'est a dire qu'un facteur 1 000 me pose problème , oui  
et 78 requetes, c'est pas tant que ça non plus

n°1978677
theredled
● REC
Posté le 29-03-2010 à 22:03:12  profilanswer
 

flo850 a écrit :

c'est a dire qu'un facteur 1 000 me pose problème , oui  
et 78 requetes, c'est pas tant que ça non plus


Pourquoi un facteur 1000 ?
 
A noter que les timers de Doctrine sont foireux [:aloy] Ptet pas depuis la 1.3, remarque.

Message cité 1 fois
Message édité par theredled le 29-03-2010 à 22:04:12

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1978737
ratibus
Posté le 30-03-2010 à 09:16:50  profilanswer
 

theredled a écrit :


Pourquoi un facteur 1000 ?
 
A noter que les timers de Doctrine sont foireux [:aloy] Ptet pas depuis la 1.3, remarque.


Je pense qu'il prend les temps du profiler ;)
 
Flo tu peux m'envoyer ton fichier de profiling XHProf si tu veux que je jette un oeil.


Message édité par ratibus le 30-03-2010 à 09:17:30

---------------
Mon blog
mood
Publicité
Posté le 30-03-2010 à 09:16:50  profilanswer
 

n°1978750
flo850
moi je
Posté le 30-03-2010 à 09:53:36  profilanswer
 

oui ,je suis en train de jouer avec ton extension depuis hier, c'est vraiment du bonheur. Si je suis bloqué, je t'enverrai le fichier

 

J'ai déjà sensiblement amélioré le bouzin avec des SELECT un peu plus selectifs,  des HYDRATE un mieux choisis
Une fois que cette phase sera fini, j'ajouterai sfAPCCache et je devrai retomber à quelque chose de correct


Message édité par flo850 le 30-03-2010 à 09:53:58
n°1978757
flo850
moi je
Posté le 30-03-2010 à 10:09:12  profilanswer
 

parmi les trucs qui me semblent bizarres :

Code :
  1. $this
  2.            ->getTable()
  3.            ->createQuery('ta')
  4.            ->select('ta.id')
  5.            ->where('ta.lft > ?',$this->getLft())
  6.            ->andWhere('ta.rgt < ? ',$this->getRgt()
  7.            )->execute(array(), Doctrine_Core::HYDRATE_NONE)
  8.            ;


la table a 43 enregistrements , lft et rgt ont des index ( même si vu la taille de la table ça ne devrait rien changer )

 

le temps moyen de requête est de 50 ms , ce qui est énorme, vu que j'appelle cette fonction un paquet de fois.

 

le graphe des appels :
http://hfr-rehost.net/preview/self/pic/93ff3c06efc30767abab6db96bd24c0f9aa55fa8.png

 


Message cité 1 fois
Message édité par flo850 le 30-03-2010 à 10:09:23
n°1978906
ratibus
Posté le 30-03-2010 à 14:23:13  profilanswer
 

flo850 a écrit :

parmi les trucs qui me semblent bizarres :  

Code :
  1. $this
  2.            ->getTable()
  3.            ->createQuery('ta')
  4.            ->select('ta.id')
  5.            ->where('ta.lft > ?',$this->getLft())
  6.            ->andWhere('ta.rgt < ? ',$this->getRgt()
  7.            )->execute(array(), Doctrine_Core::HYDRATE_NONE)
  8.            ;


la table a 43 enregistrements , lft et rgt ont des index ( même si vu la taille de la table ça ne devrait rien changer )  
 
le temps moyen de requête est de 50 ms , ce qui est énorme, vu que j'appelle cette fonction un paquet de fois.
 
le graphe des appels :  
http://hfr-rehost.net/preview/http [...] a55fa8.png
 
 


Sans passer par Doctrine la requete met combien de temps ? (fais gaffe je crois que Doctrine ajoute parfois des colonnes dans le select. C'est quoi l'explain plan de la requete qui arrive au serveur ?


---------------
Mon blog
n°1978913
flo850
moi je
Posté le 30-03-2010 à 14:30:59  profilanswer
 

en copiant collant la requête qui apparait dans la barre d'outil de symfony :  


Showing rows 0 - 15 (16 total, Query took 0.0010 sec)


 
le EXPLAIN, on s'en fout, vu que clairement ce n'est pas MySQL qui limite  
 
En grattant un peu plus , ce qui me coute cher c'est Doctrine_Query::buildSqlQuery.
en temps CPU :  

  • Doctrine_Query_Abstract::_execute 85.7%
  • Doctrine_Hydrator::hydrateResultSet 13.7%


n°1978917
theredled
● REC
Posté le 30-03-2010 à 14:33:34  profilanswer
 

Tu es en mode debug ou pas ? Ca peut rallentir à fond (logs etc).

Message cité 1 fois
Message édité par theredled le 30-03-2010 à 14:33:57

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1978929
ratibus
Posté le 30-03-2010 à 14:43:58  profilanswer
 

flo850 a écrit :

en copiant collant la requête qui apparait dans la barre d'outil de symfony :  


Showing rows 0 - 15 (16 total, Query took 0.0010 sec)


 
le EXPLAIN, on s'en fout, vu que clairement ce n'est pas MySQL qui limite  
 
En grattant un peu plus , ce qui me coute cher c'est Doctrine_Query::buildSqlQuery.
en temps CPU :  

  • Doctrine_Query_Abstract::_execute 85.7%
  • Doctrine_Hydrator::hydrateResultSet 13.7%




http://www.doctrine-project.org/do [...] uery-cache


---------------
Mon blog
n°1978932
theredled
● REC
Posté le 30-03-2010 à 14:47:08  profilanswer
 


C'est toujours mieux quand ça marche correctement même sans cache IMO :o

 

Faut vérifier si ya pas de dysfonctionnement derrière, je veux dire. 50ms de parsing, c'est beaucoup je trouve...


Message édité par theredled le 30-03-2010 à 14:50:18

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1979064
flo850
moi je
Posté le 30-03-2010 à 16:55:12  profilanswer
 

theredled a écrit :

Tu es en mode debug ou pas ? Ca peut rallentir à fond (logs etc).


j'ai testé, ça ne change pas tant que ça

 

si je peux éviter de mettre tout en cache , ça m'arrange.

 

Au passage, le serveur de test est  largement sous dimensionné ( sempron 3000+ / 512 Mo de ram  ), ça agrandi beaucoup les écarts
J'ai amélioré mes performances en réorganisant une requête sale qui avait gros andWhereIN, en affinant les paramètres des selects. Ca reste long ( > 2s pour certaines pages, mais bon, on verra sur le serveur de prod ce que ça donne en vrai)

Message cité 1 fois
Message édité par flo850 le 30-03-2010 à 16:55:36
n°1979075
theredled
● REC
Posté le 30-03-2010 à 17:05:16  profilanswer
 

flo850 a écrit :

 

si je peux éviter de mettre tout en cache , ça m'arrange.


En l'occurence, on est d'accord que c'est bien un cache de *requête*, pas de résultats, ça ne met en cache que le parsing de la requête (ie ce qui te pose pb apparemment).


Message édité par theredled le 30-03-2010 à 17:05:44

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1979080
flo850
moi je
Posté le 30-03-2010 à 17:08:35  profilanswer
 

j'avais cru comprendre que c'était un cache de resultat :d  
 
bon, je vais tester tout ça  

n°1979083
theredled
● REC
Posté le 30-03-2010 à 17:15:22  profilanswer
 

A noter que tu peux même utiliser Doctrine_Cache_Array, t'as pas à t'embeter avec APC et ça fera le gros du boulot (vu que tu fais tes 78 requetes dans une même page si j'ai bien pigé)


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1979087
flo850
moi je
Posté le 30-03-2010 à 17:19:14  profilanswer
 

APC est installé  
 
par contre, je dois etre bete, je ne vois pas ou l'activer dans symfony [:yeoh]

n°1979100
theredled
● REC
Posté le 30-03-2010 à 17:29:43  profilanswer
 

flo850 a écrit :

APC est installé

 

par contre, je dois etre bete, je ne vois pas ou l'activer dans symfony [:yeoh]

 

Tu ajoutes ça à ProjectConfiguration.php

Code :
  1. public function configureDoctrine()
  2.  {
  3.    $resultCacheDriver = new Doctrine_Cache_Apc();
  4.    $queryCacheDriver = new Doctrine_Cache_Apc();
  5.  
  6.    $manager = Doctrine_Manager::getInstance();
  7.    $manager->setAttribute(Doctrine::ATTR_RESULT_CACHE, $resultCacheDriver);
  8.    $manager->setAttribute(Doctrine::ATTR_RESULT_CACHE_LIFESPAN, 3600);
  9.    $manager->setAttribute(Doctrine::ATTR_QUERY_CACHE, $queryCacheDriver);
  10.  }


(ouais, faut le savoir)

 

Après cf la doc pour activer le cache où tu veux (c'est requête par requête obligé, me semble)

Message cité 1 fois
Message édité par theredled le 30-03-2010 à 17:32:36

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1979194
Dj YeLL
$question = $to_be || !$to_be;
Posté le 30-03-2010 à 21:32:52  profilanswer
 

theredled a écrit :


 
Tu ajoutes ça à ProjectConfiguration.php

Code :
  1. public function configureDoctrine()
  2.  {
  3.    $resultCacheDriver = new Doctrine_Cache_Apc();
  4.    $queryCacheDriver = new Doctrine_Cache_Apc();
  5.  
  6.    $manager = Doctrine_Manager::getInstance();
  7.    $manager->setAttribute(Doctrine::ATTR_RESULT_CACHE, $resultCacheDriver);
  8.    $manager->setAttribute(Doctrine::ATTR_RESULT_CACHE_LIFESPAN, 3600);
  9.    $manager->setAttribute(Doctrine::ATTR_QUERY_CACHE, $queryCacheDriver);
  10.  }


(ouais, faut le savoir)
 
Après cf la doc pour activer le cache où tu veux (c'est requête par requête obligé, me semble)


 
Une des nombreuses raisons qui font que je n'ai pas eu le courage d'approfondir ma connaissance de Symfony :o


---------------
Gamertag: CoteBlack YeLL
n°1979199
theredled
● REC
Posté le 30-03-2010 à 22:03:53  profilanswer
 

Dj YeLL a écrit :


 
Une des nombreuses raisons qui font que je n'ai pas eu le courage d'approfondir ma connaissance de Symfony :o


Le fait qu'il faille ajouter une méthode à ProjectConfiguration ? [:gordon shumway]


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1979200
flo850
moi je
Posté le 30-03-2010 à 22:05:18  profilanswer
 

le fait qu'il faille le deviner

n°1979202
ratibus
Posté le 30-03-2010 à 22:06:07  profilanswer
 

Dj YeLL a écrit :


 
Une des nombreuses raisons qui font que je n'ai pas eu le courage d'approfondir ma connaissance de Symfony :o


Là en l'occurence c'est des settings de Doctrine :o


---------------
Mon blog
n°1979203
ratibus
Posté le 30-03-2010 à 22:06:49  profilanswer
 

flo850 a écrit :

le fait qu'il faille le deviner


Euh c'est tout marqué dans la doc de Doctrine :o (disclaimer : je connais pas Doctrine, je suis un Propel user)


---------------
Mon blog
n°1979204
flo850
moi je
Posté le 30-03-2010 à 22:08:43  profilanswer
 

oui , l'option est marquée
 
 
mais où l'ajouter, je ne l'ai pas trouver dans la doc de symfony ( rien qu'instancienr un APCCache manager est un challenge )

n°1979205
theredled
● REC
Posté le 30-03-2010 à 22:09:35  profilanswer
 

ratibus a écrit :


Là en l'occurence c'est des settings de Doctrine :o


L'intégration de Doctrine dans Symfony pour être précis :D
 
Doctrine-tout-seul est très clair là-dessus :o


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1979206
theredled
● REC
Posté le 30-03-2010 à 22:10:46  profilanswer
 

flo850 a écrit :

oui , l'option est marquée
 
 
mais où l'ajouter, je ne l'ai pas trouver dans la doc de symfony ( rien qu'instancienr un APCCache manager est un challenge )


C'est quoi ça ? [:dawao]


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1979210
flo850
moi je
Posté le 30-03-2010 à 22:15:25  profilanswer
 

http://www.symfony-project.org/api/1_4/sfAPCCache pour contrôler un peu les caches à la main. L appli que je developpe est , grossso modo un outil de saisie de temps de travail avec bcp de controles de quotas
 
Le coup du "je mets les resultats en cache en priant pour qu'ils ne changent pas trop", c'est un mauvais plan. Je dois donc controler la mise en cache et la suppression du cache en me greffant sur les elements postsave qui vont bien.
 

n°1979213
theredled
● REC
Posté le 30-03-2010 à 22:21:31  profilanswer
 

Ah ouais le cache de partials quoi ? Ya tout prévu pour controller ce cache normalement, non, c'est chiant ? Yavait un chapitre là-dessus dans le Definitive Guide de Sf 1.2 je crois.


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1979218
flo850
moi je
Posté le 30-03-2010 à 22:46:43  profilanswer
 

je fais de la mise en cache au niveau du modele, pas du rendu

n°1979221
theredled
● REC
Posté le 30-03-2010 à 22:48:50  profilanswer
 

flo850 a écrit :

je fais de la mise en cache au niveau du modele, pas du rendu


Quel rapport avec sfAPCCache dans ce cas ?


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1979222
flo850
moi je
Posté le 30-03-2010 à 22:51:05  profilanswer
 

ben c'est le gestionnaire de cache que j'utilise ( il peut servir pour cacher n'importe quoi )

n°1979224
theredled
● REC
Posté le 30-03-2010 à 22:56:20  profilanswer
 

flo850 a écrit :

ben c'est le gestionnaire de cache que j'utilise ( il peut servir pour cacher n'importe quoi )


Pourquoi tu utilises pas le result cache de Doctrine ?
 
edit : j'en ai marre des points d'interrogations :(


Message édité par theredled le 30-03-2010 à 22:56:41

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1979288
flo850
moi je
Posté le 31-03-2010 à 08:59:27  profilanswer
 

le result cache de doctrine cache pendant un certain temps les résultats de ma requêtes , après l'avoir parsé  
 
1/ je n'ai aucun moyen de savoir à l'avance combien de temps un résultat va être valable (en terme de durée de vie)
2/ je ne peux pas me permettre d'afficher un résultat faux :
La requête la plus couteuse me sers à calculer le temps consommé dans un type d'activité ou une famille de type d'activité. Le résultat de cette requête est utilisé, entre autres, dans des sfformvalidator . Si le résultat est périmé, je peux valider des formulaires alors que le quota est dépassé, et ça , c'est hors de question, il y a facturation derrière
3/ il m'est très simple de savoir quand le résultat est invalidé :  au moment de l'ajout, la modification ou la suppression d'une activité.  
4/ en bonus, j'économise le parsing de la requête

n°1979294
ratibus
Posté le 31-03-2010 à 09:29:55  profilanswer
 

flo850 a écrit :

le result cache de doctrine cache pendant un certain temps les résultats de ma requêtes , après l'avoir parsé  
 
1/ je n'ai aucun moyen de savoir à l'avance combien de temps un résultat va être valable (en terme de durée de vie)
2/ je ne peux pas me permettre d'afficher un résultat faux :
La requête la plus couteuse me sers à calculer le temps consommé dans un type d'activité ou une famille de type d'activité. Le résultat de cette requête est utilisé, entre autres, dans des sfformvalidator . Si le résultat est périmé, je peux valider des formulaires alors que le quota est dépassé, et ça , c'est hors de question, il y a facturation derrière
3/ il m'est très simple de savoir quand le résultat est invalidé :  au moment de l'ajout, la modification ou la suppression d'une activité.  
4/ en bonus, j'économise le parsing de la requête


Si t'es en MySQL et MyISAM, t'as une méta données très intéressante sur les tables qui est le Update_Time (qd tu fais un SHOW TABLE).
On l'utilise chez nous pour invalider le cache en automatique (vu qu'on passe pas forcément par l'ORM vu le volume de données traité).


---------------
Mon blog
n°1979299
flo850
moi je
Posté le 31-03-2010 à 09:40:09  profilanswer
 

je ne connaissais pas, je le note  
(par contre, ça va pas être possible pour ce projet, vu que la base définitive sera sous SQL server )

n°1979314
theredled
● REC
Posté le 31-03-2010 à 10:12:15  profilanswer
 

flo850 a écrit :

le result cache de doctrine cache pendant un certain temps les résultats de ma requêtes , après l'avoir parsé

 

1/ je n'ai aucun moyen de savoir à l'avance combien de temps un résultat va être valable (en terme de durée de vie)
2/ je ne peux pas me permettre d'afficher un résultat faux :
La requête la plus couteuse me sers à calculer le temps consommé dans un type d'activité ou une famille de type d'activité. Le résultat de cette requête est utilisé, entre autres, dans des sfformvalidator . Si le résultat est périmé, je peux valider des formulaires alors que le quota est dépassé, et ça , c'est hors de question, il y a facturation derrière
3/ il m'est très simple de savoir quand le résultat est invalidé :  au moment de l'ajout, la modification ou la suppression d'une activité.
4/ en bonus, j'économise le parsing de la requête

 

Supprimer manuellement des entrées de cache ça marche aussi avec Doctrine :
http://www.doctrine-project.org/up [...] provements


Message édité par theredled le 31-03-2010 à 10:14:02

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  6  7  8  9  10  11  12

Aller à :
Ajouter une réponse
 

Sujets relatifs
Symfony, OVH, et PHP_VERDes questions sur php
[C#] Questions de débutant...servlet : pleins de questions :/
Questions utilesQuelques questions
Probleme/questions Graphe de Scene avec Java3Dfpc télécharger un fichier et questions sur win
Questions sur week planner PHP/SQL[AS3 - newbies] Mes questions pour bien débuter
Plus de sujets relatifs à : Symfony : questions


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR