IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

Hibernate et performance CPU


Sujet :

Hibernate Java

  1. #1
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut Hibernate et performance CPU
    Bonjour,

    j'utilise Hibernate 3, Spring 2. dans une application web, lorsque l'utilisateur se connecte, j'ai besoin de lancer plusieurs requêtes pour charger des objets (ses droits) en session.
    quand j'essaye des tests de charges, pour 10 utilisateurs virtuels, la CPU monte à plus de 90% à la connexion d'un utilisateur,
    j'ai essayé de regarder ce qui se passe, je pense que le chargement des objets hibernates utilise beaucoup la CPU.

    Est ce que celà est normal? comment peut on réduire cette utilisation excessive de la CPU?

    Merci..

  2. #2
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Le mieux serait probablement de réduire le nombre d'appels, en les synthétisant. Tu peux par exemple faire appel à une procédure stockée qui te renverrait un gros bloc d'informations dans une map.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Par défaut
    Difficile de donner un avis avec ces infos.
    Affiche le logs d'Hibernate (sql) pour voir les requêtes qui sont envoyées vers ta base.
    Installe un outil genre p6spy pour voir le temps que tu passes dans tes requêtes.

    Ca semble quand même bizarre vu le peu d'utilisateurs simultanés..

  4. #4
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Je vois les requêtes qui causent le problèmes, c'est une requête qui a beaucoup de colonnes en retour, ou c'est un ensemble de requêtes: load de plusieurs listes et chaque liste a pas mal de colonnes aussi.. je ne sais pas si ça vient de la configuration d'hibernate ou d'ailleurs, les requetes en base s'exécutent avec un temps raisonnable, la CPU de mon serveur est de 3Ghz, je ne veux pas demander plus sans savoir si le problème ne serait pas applicatif.

    à la fin des requêtes le serveur 'se calme', je suis certain que c'est le traitement hibernate qui prend charge la CPU.

    NB: hibernate 3.2.GA + c3p0+ spring 2.5

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Par défaut
    Combien de colonnes "remontes" tu ?
    Est-ce que tes requêtes ramènent juste les données dont tu as besoin, ou plus ?
    As-tu désactivé le lazy-loading ?

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Combien de colonnes "remontes" tu ?
    Est-ce que tes requêtes ramènent juste les données dont tu as besoin, ou plus ?
    As-tu désactivé le lazy-loading ?
    Je pense également que son problème vient de là...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Combien de colonnes "remontes" tu ?
    Est-ce que tes requêtes ramènent juste les données dont tu as besoin, ou plus ?
    As-tu désactivé le lazy-loading ?
    yes, je désactive le lazy-loading, c'est désactivé par défaut avec hibernate 3 je pense ..

    j'ai entre 20 et + de 50 colonnes, suivant les requetes, sachant que je n'ai pas besoin de toutes les colonnes mais, je ne peux pas dire à hibernate de ne pas prendre par exemple une colonne qui n'est jamais renseigné ou pour un join ne pas prendre toutes les colonnes.
    mais même sans jointure, le load des listes prend baecuou de ressources:
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    List result = getHibernateTemplate().find("from Role  order by  name")

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Peux-tu montrer le mapping par hasard ?
    Également la log (pour voir les requêtes générées) ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    un exemple de mapping:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <hibernate-mapping>
        <class name="com.xx.model.domain.Company" table="COMPANY">
            <id name="companyId" type="long">
                <column name="COMPANY_ID" precision="18" scale="0" />
                <generator class="identity" />
            </id>
         	<many-to-one name="clientOf" class="com.xx.model.domain.Company" >
                <column name="CLIENT_OF" precision="18" scale="0" />
            </many-to-one>
     
            <property name="name" type="string">
                <column name="NAME" length="100" not-null="true" unique="true" />
            </property>
            .. 
            ...
     
    </hibernate-mapping>
    et la requete générée (le join est fait en requete HQL)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
      select
            this_.COMPANY_ID as COMPANY1_5_1_,
            this_.CLIENT_OF as CLIENT2_5_1_,
            this_.ID_TEAM as ID3_5_1_,
            this_.NAME as NAME5_1_,
            this_.MAILING_ADDRESS as MAILING5_5_1_,
            this_.LOCATION as LOCATION5_1_,        
            this_.COMPANY_COMMENT as COMPANY8_5_1_,
            this_.UPDATE_DATE as UPDATE9_5_1_,
            this_.UPDATED_BY as UPDATED10_5_1_,
            company2_.COMPANY_ID as COMPANY1_5_0_,
            company2_.CLIENT_OF as CLIENT2_5_0_,
            company2_.ID_TEAM as ID3_5_0_,
            company2_.NAME as NAME5_0_,
            company2_.MAILING_ADDRESS as MAILING5_5_0_,
            company2_.LOCATION as LOCATION5_0_,        
            company2_.COMPANY_COMMENT as COMPANY8_5_0_,
            company2_.UPDATE_DATE as UPDATE9_5_0_,
            company2_.UPDATED_BY as UPDATED10_5_0_ 
        from
            COMPANY this_ 
        left outer join
            COMPANY company2_ 
                on this_.CLIENT_OF=company2_.COMPANY_ID 
        order by
            this_.NAME asc
    J'ai stressé l'application en activant tous les logs d'hibernate, je remarque que ce qui prend du temps c'est la construction des objets, à la fin lorsque le serveur est saturé, j'ai une exception

    java.lang.NullPointerException
    at org.apache.log4j.LogManager.getLogger(LogManager.java:188)
    at org.apache.log4j.Logger.getLogger(Logger.java:104)
    at org.apache.commons.logging.impl.Log4JLogger.getLogger(Log4JLogger.java:229)
    at org.apache.commons.logging.impl.Log4JLogger.error(Log4JLogger.java:193)

  10. #10
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    As-tu la même "lourdeur" en ne faisant qu'une simple liste de "company" ?
    (sans la jointure)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    As-tu la même "lourdeur" en ne faisant qu'une simple liste de "company" ?
    (sans la jointure)
    oui j'ai testé, 20 utilisateurs virtuels qui lancent la requete sans jointure, et ça prend pas mal de CPU plus de 96%, mais, c'est rapide, et le serveur retombe à moins de 1% après.

  12. #12
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    C'est la première opération sur les données de ta base ?
    Tu as la même montée en charge par la suite ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    C'est la première opération sur les données de ta base ?
    Tu as la même montée en charge par la suite ?
    il y'a bien plus de montée en charge la première opération, mais, d'autre requêtes par la suite causent des problèmes.
    même au démarrage de tomcat la JVM prend 97% de la CPU..

  14. #14
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    La première fois qu'on fait appel à Hibernate, c'est plus long, mais ça dépend du mapping... plus il y en a, plus c'est long...

    Maintenant, pour moi, 97% de CPU ne posent pas plus de problèmes que ça... s'il n'y a pas d'autre processus en attente, pourquoi il ne prendrait pas toute la ressource...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    La première fois qu'on fait appel à Hibernate, c'est plus long, mais ça dépend du mapping... plus il y en a, plus c'est long...

    Maintenant, pour moi, 97% de CPU ne posent pas plus de problèmes que ça... s'il n'y a pas d'autre processus en attente, pourquoi il ne prendrait pas toute la ressource...
    oui mais ça peut monter à 99%, et quand j'ajoute plusieurs users, ça plante. normalement la CPU ne doit pas dépasser 80% pour une utilisation normale.

  16. #16
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Par défaut
    Ca ne viendrait pas de ton serveur ou de ton serveur d'application ou autres.
    Ou alors ton serveur est sous dimensionné.

  17. #17
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Ca ne viendrait pas de ton serveur ou de ton serveur d'application ou autres.
    Ou alors ton serveur est sous dimensionné.
    C'est possible, je suis entrain de tester en modifiant les paramètres du serveur d'application: tomcat 6.0.18.

    Le processeur du serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Intel(R) Xeon(R) CPU           X5355  @ 2.66GHz
    Il doit avoir 2Go de mémoire, mais, elle n'est jamais utilisée à plus de 60%.

    Je ne voulais pas demander un double proc sans trouver d'où vient le problème.

  18. #18
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Re.....

    J'ai profiler un peu le serveur, en modifiant pas mal d'options JVM, je remarque que le problème vient toujours d'un thread de gestionnaire de pool de connexion c3p0, la méthode createConnection prend consomme beaucoup de cpu, et elle est appelée plusieurs fois..
    quelqu'un a une idée?

  19. #19
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Par défaut
    A tout hasard, n'y a t il pas un bug reconnu avec ta version de C3P0 ?

  20. #20
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    aucune idée
    j'utilise la 0.9.1.2

Discussions similaires

  1. [Hibernate 3] Questions générales sur les performances
    Par hugo123 dans le forum Hibernate
    Réponses: 7
    Dernier message: 13/12/2006, 17h02
  2. Réponses: 8
    Dernier message: 21/11/2006, 11h54
  3. [Hibernate][Ibatis] Problème de performance..
    Par Saloucious dans le forum Hibernate
    Réponses: 2
    Dernier message: 29/10/2005, 13h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo