SlideShare une entreprise Scribd logo
1  sur  94
Tests de performances d'une
    application Java EE


           Tours JUG – 10 juin 2010




            Antonio Gomes Rodrigues
Sponsors
Antonio Gomes Rodrigues
●   Consultant en performances JavaEE
●   Plus de 6 ans d'expériences
●   Rédacteur sur developpez.com
    ●   http://arodrigues.developpez.com/
Des ressources                      Des actualités




                                   http://twitter.com/javaDeveloppez




                                   java@redaction-developpez.com




De l'entraide            Un hébergement gratuit
                           w   w
                     :/ /w
                 http
Mesurez, ne supposez pas
Commencez par faire correctement les choses,
puis accélérez-les si cela ne va pas assez vite
Sommaire
●   Procédure de test
●   Définition de la stratégie de test
●   Faire un test de charge
●   Identifier les problèmes
●   Diagnostic Java EE
Sommaire
●   Procédure de test
●   Définition de la stratégie de test
●   Faire un test de charge
●   Identifier les problèmes
●   Diagnostic Java EE
Procédure de test
●   Itératif
    ●   Préparer les tests
    ●   Mesurer les performances
    ●   Identifier les problèmes
    ●   Corriger les problèmes (faire seulement une
        modification à la fois)
    ●   Recommencer jusqu'à atteindre les objectifs
Sommaire
●   Procédure de test
●   Définition de la stratégie de test
●   Faire un test de charge
●   Identifier les problèmes
●   Diagnostic Java EE
Définition de la stratégie de test
Définition de la stratégie de test
Définir les objectifs de l'audit de
performance
●   Résoudre des problèmes de performance d'une
    application,
●   Dimensionner une infrastructure de production pour un
    déploiement national,
●   Rassurer la DSI sur la montée en charge d'une
    application
●   Valider les performances/endurance/robustesse d'une
    application,
●   Comparer des solutions,
●   ...
Identifier les scénarios pertinents et
les pondérer
●   Des scénarios réalistes (écrans consultés, champs
    saisis dans les formulaires, temps entre chaque
    actions, ...).
●   Faire les scénarios importants (ceux de tous les jours
    mais aussi ceux importants d'un point de vue
    fonctionnel (déclenchement de la paye, ...))
●   Voir les logs d'accès, cas d'utilisation, ...
●   Attention au cas où l'application fait appel à un service
    extérieur (serveur de cartographie, serveur de
    validation du numéro de carte bleue, ...).
Identifier les outils et les ressources
à disposition
●   Outils mis à disposition (LoadRunner, JMeter,
    Introscope, ...)
●   Disponibilité des développeurs, fonctionnels, DBA,
    administrateur système, ...
●   S'assurer de la disponibilité exclusive de
    l'environnement
S'assurer que la plateforme testée
est la plus proche possible de la
plateforme cible
S'assurer que la plateforme de test
répond aux exigences du test
S'assurer d'avoir un jeux de
données réaliste

●   Données de prod, ETL, Outils spécifique
    (Benerator, ...)
Démo de Benerator
●   Plugin pour Maven2
●   Plugin pour Eclipse
●   Personnalisable
●   Gratuit
●   Bonne documentation
●   Supporte la majorité des bases de données du
    marché
●   http://databene.org/databene-benerator
Identifier les métriques à collecter
Une application fonctionnelle
Sommaire
●   Procédure de test
●   Définition de la stratégie de test
●   Faire un test de charge
    ●   Quand faire un test de charge
    ●   Quoi mesurer/vérifier
    ●   Quand donner les résultats
    ●   Que va t-on trouver
    ●   Process
    ●   Rapport d'audit
Sommaire
●   Procédure de test
●   Définition de la stratégie de test
●   Faire un test de charge
    ●   Quand faire un test de charge
    ●   Quoi mesurer/vérifier
    ●   Quand donner les résultats
    ●   Que va t on trouver
    ●   Procédure
    ●   Rapport d'audit
Quand faire un test de charge
Demo de ContiPerf

●   Simple d'utilisation
●   Intégration à Maven2
●   Intégration à Eclipse
●   Export des résultats au format CSV
●   …
●   http://databene.org/contiperf.html
Demo de Yourkit Java Profiler

●   Une grande richesse fonctionnelle
●   Intégration aux principaux IDE du marché
●   Multi plate-forme
●   Intégration aux principaux serveurs
    d'application
●   Contrôle de l'overhead pour s'adapter à la
    machine cible
●   http://www.yourkit.com/overview/index.jsp
Quand faire un test de charge
●   En fin de projet
●   Pour :
    ●   Régler les serveurs
    ●   Augmenter les performances
    ●   Valider la mise en production,
    ●   ...
Sommaire
●   Procédure de test
●   Définition de la stratégie de test
●   Faire un test de charge
    ●   Quand faire un test de charge
    ●   Quoi mesurer/vérifier
    ●   Quand donner les résultats
    ●   Que va t-on trouver
    ●   Procédure
    ●   Rapport d'audit
Quoi mesurer/vérifier
Sur chaque serveur
●   L’activité du système
●   L’activité du réseau (débit, taux de perte, ...)
●   L’occupation mémoire (mémoire occupée,
    mémoire libre, mémoire swap, ...)
●   L’occupation du processeur (taux
    d'occupation, ...)
Sur chaque JVM
●   JVM Mode
    ●   Vérifier qu'on est bien en "-server"et non en "-client" (En
        particulier sur les JVM 1.4 et inférieur)
●   Taille de la Java Heap
    ●   La taille de la heap (Java options -Xmx (maximum) et
        -Xms (minimum)) et son comportement.
●   Comportement du Garbage Collection
    ●   Sa fréquence, son temps d'exécution, ... (-verbose:gc,
        -XX:+PrintGCTimeStamps, -XX:+PrintGCDetails)
●   Dump mémoire
    ●   -XX:+HeapDumpOnOutOfMemoryError
    ●   -XX:+HeapDumpOnCtrlBreak
Sur les serveurs d'application
●   L’activité du système
●   L’activité du réseau (débit, taux de perte, ...)
●   L’occupation mémoire (mémoire occupée,
    mémoire libre, mémoire swap, ...)
●   L’occupation du processeur (taux
    d'occupation, ...)
Paramétré pour la prod
Désactiver l'Auto-Deploy

   Tomcat - conf/server.xml
<Host name="localhost" appBase="webapps" unpackWARs="true"
autoDeploy="false"
xmlValidation="false" xmlNamespaceAware="false">
JSP Reload et
                      JSP Development Mode
   Glassfish - default-web.xml
<init-param>
<param-name>development</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>genStrAsCharArray</param-name>
<param-value>true</param-value>
</init-param>
Niveau de log
Pool de connexion JDBC

●   Taille du pool
●   Maximum wait time
●   Average wait time
●   Minimum available free connections
Pool de threads

●   Taille du pool
●   Taux d'occupation du pool de thread
●   Le nombre de threads en attente
Web Container

●   Nombre maximal de connexions ouvertes
●   Pool d'unité d'exécution
●   Le cache (surtout pour les objets statiques)
EJB Container

●   Taille du pool de thread
●   Taille du cache
●   Taille du pool Message Driven Beans
Sessions

●   Nombre de sessions
●   Délai d'expiration
Sur les serveurs de bases de
          données
Taille mémoire cache
update TABLE_A_MODIFIER
set FIELD1 = FIELD1 + 1, FIELD2=' '  where (FIELD3>0)




                                              Après tuning du cache
Les requêtes couteuses

●   Attention, il faut bien paramétrer la taille de la
    mémoire cache avant.
●   MySQL propose un « slow query log »
●   Oracle propose une vue
●   Sinon plusieurs outils proposent de le faire
Autres
●   Hibernate
    ● Activer ou désactiver le mode trace
      d'hibernate
●   Application
    ●   Les fonctions les plus consommatrices.
Sommaire
●   Procédure de test
●   Définition de la stratégie de test
●   Faire un test de charge
    ●   Quand faire un test de charge
    ●   Quoi mesurer/vérifier
    ●   Quand donner les résultats
    ●   Que va t-on trouver
    ●   Procédure
    ●   Rapport d'audit
Quand donner les résultats
●   Au fur et à mesure car généralement cela induit
    des décision importantes dont le cycle de
    décision peut être relativement long.

●   par exemple lancer des procédures d'achat de
    matériel lors d'un dimensionnement
    d'infrastructure, commander l'intervention d'une
    expertise externe/interne, migration vers une
    version plus récente de la librairie.
Sommaire
●   Procédure de test
●   Définition de la stratégie de test
●   Faire un test de charge
    ●   Quand faire un test de charge
    ●   Quoi mesurer/vérifier
    ●   Quand donner les résultats
    ●   Que va t-on trouver
    ●   Procédure
    ●   Rapport d'audit
Que va t-on trouver
●   Des mauvaises pratiques de conception ou de
    développement,
●   Une architecture logicielle qui ne privilégie pas les
    performances,
●   Un hardware sous dimensionné,
●   Un mauvais paramétrage du serveur d'applications,
●   Un mauvais paramétrage du serveur de bases de
    données,
●   Un mauvais paramétrage des frameworks (hibernate, ...)
●   Problème d'utilisation de cache,
●   ...
Sommaire
●   Procédure de test
●   Définition de la stratégie de test
●   Faire un test de charge
    ●   Quand faire un test de charge
    ●   Quoi mesurer/vérifier
    ●   Quand donner les résultats
    ●   Que va t-on trouver
    ●   Procédure
    ●   Rapport d'audit
Procédure
●   Capture scénario
●   Paramétrage scénario
    ●   Corrélation, variabilisation, think time, ...
●   Regroupement dans un plan de test
●   Paramétrage du plan de test
●   Faire un tir unitaire/de référence
    ●   Permet d'étalonner les scénarios et de collecter des temps de
        réponse nominaux
●   Exécuter le scénario
    ●   Le tir doit être assez long pour monter en charge et obtenir des
        moyennes significatives
●   Récupérer les metrics
●   Faire un rapport d'audit
JMeter - enregistrement d'un script
JMeter – exécution d'un script
JMeter Demo
●   Bonne documentation
●   Open Source et gratuit
●   De nombreux protocoles supportés
●   …
●   http://jakarta.apache.org/jmeter/
Sommaire
●   Procédure de test
●   Définition de la stratégie de test
●   Faire un test de charge
    ●   Quand faire un test de charge
    ●   Quoi mesurer/vérifier
    ●   Quand donner les résultats
    ●   Que va t-on trouver
    ●   Procédure
    ●   Rapport d'audit
Rapport d'audit
Rapport d'audit
●   C’est un long travail de consolidation de toutes les
    informations pertinentes.
S'adapter à son auditoire
Sommaire
●   Procédure de test
●   Définition de la stratégie de test
●   Faire un test de charge
●   Identifier les problèmes
●   Diagnostic Java EE
Identifier les problèmes
Identifier les problèmes
Mauvaise performances et
 utilisation CPU élevée
Mauvaise performances et
  utilisation CPU basse
Performances irrégulière et
 utilisation CPU irrégulière
Mauvaises performances et
 utilisation des I/O haute
Consommation mémoire élevée
Sommaire
●   Procédure de test
●   Définition de la stratégie de test
●   Faire un test de charge
●   Identifier les problèmes
●   Diagnostic Java EE
Diag Java EE
Diag mémoire
Tuning
●   Attention , la taille de la heap ne doit pas
    dépasser la taille mémoire physique de la
    machine.

●   Il peut être utile de mettre la même valeur pour
    -Xmx (maximum) et -Xms (minimum) afin
    d'éviter les redimensionnement de la heap.

●   Attention lorsque il y a beaucoup de JSP
Diag mémoire
Vérification des
                          paramètres

●   Utiliser YourKit Java Profiler ou VisualVM ou ...
OutOfMemoryError
●   Exception in thread "main":
    java.lang.OutOfMemoryError: Java heap space
    ●   Problème de paramétrage de la taille de la
        heap
    ●   Fuite mémoire


                ●   Paramètre JVM : -Xmx
                ●   Profiler/Dump
OutOfMemoryError
●   Exception in thread "main":
    java.lang.OutOfMemoryError: PermGen space
    ●   Beaucoup de classes
    ●   Beaucoup d'objets String (String.intern ou
        ClassLoader.defineClass dans la stack trace)


              ●   Paramètre JVM : -XX:MaxPermSize
              ●   jmap -permgen
OutOfMemoryError
●   Exception in thread "main":
    java.lang.OutOfMemoryError: Requested array
    size exceeds VM limit
    ●   Utilisation de tableaux trop grands par
        rapport à la taille de la heap


                ●   Paramètre -Xmx
                ●   Profiler/Dump
OutOfMemoryError
●   Exception in thread "main":
    java.lang.OutOfMemoryError: request <size>
    bytes for <reason>. Out of swap space?
    ●   Fuite mémoire
    ●   Serveur trop chargé en mémoire (autres
        applications, ...)

             ●   Profiler/Dump
             ●   Monitoring du serveur
OutOfMemoryError
●   Exception in thread "main":
    java.lang.OutOfMemoryError: <reason> <stack
    trace> (Native method)
    ●   Problème mémoire détecté lors d'une
        interaction avec une application native à
        l'aide de JNI

                 ●   Profiler/Dump
                 ●   Monitoring du serveur
Le coût du GC
●   Si le temps utilisé par GC est supérieur à 25%
    c'est qu'il y a un problème.
    ●   Heap trop petite
    ●   Trop d'objet
                 ●   Profiler/Dump
                 ●   Paramètre JVM : -Xmx
                 ●   Findbugs/PMD
                 ●   Modification de la stratégie du GC
                 ●   Pas d'appels explicite du GC :
                     -XX:-DisableExplicitGC
Diag CPU
Diag Bdd
●   Faire intervenir un DBA si nécessaire
Utiliser des index
update TABLE1 MxT3 set (T1.FIELD1) = (select T2.FIELD1 from TABLE2 T2
where (T1.FIELD2 = T2.FIELD3 )) where exists (select 1 from TABLE2 T2
where (T1.FIELD2 = T2.FIELD3 ))




                                                      Après
                                           create index TABLE2_N98
                                           on TABLE2 (FIELD3,FIELD1)
Limiter au maximum les
                 valeurs récupérées
●   Pas de select *
●   Conditions dans la clause where
Utiliser des Prepared
                        Statements
●   Seulement pour les requêtes appelées de
    nombreuses fois
PreparedStatement pstmt = con.prepareStatement("UPDATE
table SET i = ? WHERE j = ?");
pstmt.setLong(1, 123);
pstmt.setLong(2, 100);


              Paramétrer le cache Prepared
              Statements dans le serveur JavaEE
              et/ou dans le driver JDBC
Éviter les commits trop
                      fréquents
setAutoCommit(false);
// Executer toute les requêtes
ExecuteUpdate();
Utiliser des Batch Updates
Connection con = DriverManager.getConnection(.......);
Statement stmt = con.createStatement();
stmt.addBatch("INSERT INTO Adresse .......");
stmt.addBatch("INSERT INTO Contacte .......");
int[] countUpdates = stmt.executeBatch();
Paramétrer le pool de
                   connexion JDBC
●   Trouver la bonne taille lors des tests (regarder
    le nombre de connexions en attente, la charge
    CPU, ...).




              Pour éviter la création de connexions
              au mauvais moment, on peut fixer la
              même valeur pour le min et le max
Libérer les ressources JDBC
●   Libérer les ressources JDBC dans la clause
    finally du try catch
●   Utiliser Spring Jdbc template
●   Utiliser Commons DbUtils



              Findbugs
Diag thread
●   Dead lock
    ●   Au moins 2 threads se bloquent pour accéder à une
        ressource.

●   Race conditions
    ●   Au moins 2 threads entrent en compétition pour
        obtenir une ressource et donc le nombre de threads
        augmente et il faut de plus en plus de temps pour
        accéder à la ressource.
Diag thread
●   Thread Leak
    ●   On crée des thread sans fin jusqu'à avoir un
        OutOfMemory: unable to create new native thread.

●   Problème de configuration du pool de thread
    ●   Le nombre de thread configuré dans le pool est
        supérieur au nombre maximum de thread de la
        JVM
Diag HTTP
●   Une gestion des dates d'expiration sur les
    ressources statiques couplée à un cache au
    niveau des frontaux http pour soulager
    l'infrastructure.
●   Par exemple une image qui ne change pas
    régulièrement peut avoir une date d'expiration
    lointaine afin qu'à chaque requête, il n'y ait pas
    de vérification sur l'existence d'une nouvelle
    version. 
Session
●   Attention au volume des données stockées en
    session car cela peut provoquer une
    dégradation significative des performances
    dans le cas notamment où la réplication de
    session est activée.
Diag affichage
●   Compression des ressources statiques
    (images, fichiers flashs, scripts, ...)
●   Mettre en place une politique d'expiration des
    ressources statiques,
●   Activer la compression HTTP
●   Utiliser des CSS sprite
●   CSS en début de page
●   Javascript en fin de page
Diag Hibernate
●   Optimisation du mapping hibernate pour réduire
    significativement le nombre de requêtes
    exécutées sur la base de données.
●   Mes préconisations sont :
    ●   D'initialiser les relations en mode différé (par
        défaut)
    ●   Puis au cas par cas s'assurer que ce mode de
        chargement ne génère pas les problèmes dits de
        N+1 ou les produits cartésiens.
    ●   Optimiser les modes de chargement en utilisant les
        techniques de chargement groupé, chargement par
        sous select, etc.
Conseils
●   Commencer les tests dès que possible
●   Automatiser le maximum de tests
●   Faire intervenir un DBA
●   Faire de l'itératif
●   Ne faire varier qu'un paramètre à la fois
●   Communiquer
●   ...

Contenu connexe

Tendances

Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)ENSET, Université Hassan II Casablanca
 
Introduction à React JS
Introduction à React JSIntroduction à React JS
Introduction à React JSAbdoulaye Dieng
 
Introduction to JCR and Apache Jackrabbi
Introduction to JCR and Apache JackrabbiIntroduction to JCR and Apache Jackrabbi
Introduction to JCR and Apache JackrabbiJukka Zitting
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...ENSET, Université Hassan II Casablanca
 
les style d'architecture
les style d'architecture les style d'architecture
les style d'architecture Mouna Maazoun
 
Architectures 3-tiers (Web)
Architectures 3-tiers (Web)Architectures 3-tiers (Web)
Architectures 3-tiers (Web)Heithem Abbes
 
Chp1- Introduction aux Technologies Web et SOA
Chp1- Introduction aux Technologies Web et SOAChp1- Introduction aux Technologies Web et SOA
Chp1- Introduction aux Technologies Web et SOALilia Sfaxi
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EEInes Ouaz
 
Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootDNG Consulting
 
Tp1 - WS avec JAXWS
Tp1 - WS avec JAXWSTp1 - WS avec JAXWS
Tp1 - WS avec JAXWSLilia Sfaxi
 
La persistance des données : ORM et hibernate
La persistance des données : ORM et hibernateLa persistance des données : ORM et hibernate
La persistance des données : ORM et hibernateYouness Boukouchi
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications JavaAntoine Rey
 
Securité des applications web
Securité des applications webSecurité des applications web
Securité des applications webMarcel TCHOULEGHEU
 

Tendances (20)

Support cours angular
Support cours angularSupport cours angular
Support cours angular
 
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
 
Introduction à React JS
Introduction à React JSIntroduction à React JS
Introduction à React JS
 
Introduction to JCR and Apache Jackrabbi
Introduction to JCR and Apache JackrabbiIntroduction to JCR and Apache Jackrabbi
Introduction to JCR and Apache Jackrabbi
 
Introduction à Node.js
Introduction à Node.js Introduction à Node.js
Introduction à Node.js
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
 
les style d'architecture
les style d'architecture les style d'architecture
les style d'architecture
 
Architectures 3-tiers (Web)
Architectures 3-tiers (Web)Architectures 3-tiers (Web)
Architectures 3-tiers (Web)
 
Chp1- Introduction aux Technologies Web et SOA
Chp1- Introduction aux Technologies Web et SOAChp1- Introduction aux Technologies Web et SOA
Chp1- Introduction aux Technologies Web et SOA
 
Support de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfiSupport de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfi
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EE
 
Support de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec SpringSupport de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec Spring
 
Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring Boot
 
Tp1 - WS avec JAXWS
Tp1 - WS avec JAXWSTp1 - WS avec JAXWS
Tp1 - WS avec JAXWS
 
Maven et industrialisation du logiciel
Maven et industrialisation du logicielMaven et industrialisation du logiciel
Maven et industrialisation du logiciel
 
Introduction à Angular
Introduction à AngularIntroduction à Angular
Introduction à Angular
 
La persistance des données : ORM et hibernate
La persistance des données : ORM et hibernateLa persistance des données : ORM et hibernate
La persistance des données : ORM et hibernate
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications Java
 
Traitement distribue en BIg Data - KAFKA Broker and Kafka Streams
Traitement distribue en BIg Data - KAFKA Broker and Kafka StreamsTraitement distribue en BIg Data - KAFKA Broker and Kafka Streams
Traitement distribue en BIg Data - KAFKA Broker and Kafka Streams
 
Securité des applications web
Securité des applications webSecurité des applications web
Securité des applications web
 

En vedette

Mesurer la performance dans le milieu hostile du développement Java
Mesurer la performance dans le milieu hostile du développement JavaMesurer la performance dans le milieu hostile du développement Java
Mesurer la performance dans le milieu hostile du développement JavaAntonio Gomes Rodrigues
 
BreizhCamp 2013 - Crash test à haute vitesse
BreizhCamp 2013 - Crash test à haute vitesseBreizhCamp 2013 - Crash test à haute vitesse
BreizhCamp 2013 - Crash test à haute vitesseAntonio Gomes Rodrigues
 
Mesurer les performances avec JMeter
Mesurer les performances avec JMeterMesurer les performances avec JMeter
Mesurer les performances avec JMeterClaude Falguiere
 
Offre Audit et Test De Performance
Offre Audit et Test De PerformanceOffre Audit et Test De Performance
Offre Audit et Test De PerformanceCabinet Openi
 
Migration PHP4-PHP5
Migration PHP4-PHP5Migration PHP4-PHP5
Migration PHP4-PHP5julien pauli
 
Performance test - YaJUG Octobre 2012
Performance test - YaJUG Octobre 2012Performance test - YaJUG Octobre 2012
Performance test - YaJUG Octobre 2012Claude Falguiere
 
Dot Net performance monitoring
 Dot Net performance monitoring Dot Net performance monitoring
Dot Net performance monitoringKranthi Paidi
 
Développez et déployez votre application Java dans Azure
Développez et déployez votre application Java dans AzureDéveloppez et déployez votre application Java dans Azure
Développez et déployez votre application Java dans AzureMicrosoft
 
Advanced liferay architecture clustering and high availability
Advanced liferay architecture clustering and high availabilityAdvanced liferay architecture clustering and high availability
Advanced liferay architecture clustering and high availabilityBordin Kijsirijareonchai
 
Mesurer Les Performances Avec JMeter Cours Du Soir Valtech 25 Mars 2010
Mesurer Les Performances Avec JMeter   Cours Du Soir Valtech 25 Mars 2010Mesurer Les Performances Avec JMeter   Cours Du Soir Valtech 25 Mars 2010
Mesurer Les Performances Avec JMeter Cours Du Soir Valtech 25 Mars 2010Claude Falguiere
 
Softshake 2015 - Comment tester et optimiser la performance d'un SI ?
Softshake 2015 - Comment tester et optimiser la performance d'un SI ?Softshake 2015 - Comment tester et optimiser la performance d'un SI ?
Softshake 2015 - Comment tester et optimiser la performance d'un SI ?cyrilpicat
 
Clustering Java applications with Terracotta and Hazelcast
Clustering Java applications with Terracotta and HazelcastClustering Java applications with Terracotta and Hazelcast
Clustering Java applications with Terracotta and Hazelcastb0ris_1
 
Performance serveur et apache
Performance serveur et apachePerformance serveur et apache
Performance serveur et apacheafup Paris
 
Measuring Web Performance - HighEdWeb Edition
Measuring Web Performance - HighEdWeb EditionMeasuring Web Performance - HighEdWeb Edition
Measuring Web Performance - HighEdWeb EditionDave Olsen
 
présentation migration automatisee Pacbase -> UML + Java
présentation migration automatisee Pacbase -> UML + Javaprésentation migration automatisee Pacbase -> UML + Java
présentation migration automatisee Pacbase -> UML + JavaDidier Durand
 
Conduire un projet de GED: Concepts de base, points de repère pour la mise en...
Conduire un projet de GED: Concepts de base, points de repère pour la mise en...Conduire un projet de GED: Concepts de base, points de repère pour la mise en...
Conduire un projet de GED: Concepts de base, points de repère pour la mise en...Baba Kourouma
 

En vedette (20)

Tests de performances
Tests de performancesTests de performances
Tests de performances
 
Mesurer la performance dans le milieu hostile du développement Java
Mesurer la performance dans le milieu hostile du développement JavaMesurer la performance dans le milieu hostile du développement Java
Mesurer la performance dans le milieu hostile du développement Java
 
BreizhCamp 2013 - Crash test à haute vitesse
BreizhCamp 2013 - Crash test à haute vitesseBreizhCamp 2013 - Crash test à haute vitesse
BreizhCamp 2013 - Crash test à haute vitesse
 
Mesurer les performances avec JMeter
Mesurer les performances avec JMeterMesurer les performances avec JMeter
Mesurer les performances avec JMeter
 
Offre Audit et Test De Performance
Offre Audit et Test De PerformanceOffre Audit et Test De Performance
Offre Audit et Test De Performance
 
Migration PHP4-PHP5
Migration PHP4-PHP5Migration PHP4-PHP5
Migration PHP4-PHP5
 
Performance test - YaJUG Octobre 2012
Performance test - YaJUG Octobre 2012Performance test - YaJUG Octobre 2012
Performance test - YaJUG Octobre 2012
 
Dot Net performance monitoring
 Dot Net performance monitoring Dot Net performance monitoring
Dot Net performance monitoring
 
Développez et déployez votre application Java dans Azure
Développez et déployez votre application Java dans AzureDéveloppez et déployez votre application Java dans Azure
Développez et déployez votre application Java dans Azure
 
Advanced liferay architecture clustering and high availability
Advanced liferay architecture clustering and high availabilityAdvanced liferay architecture clustering and high availability
Advanced liferay architecture clustering and high availability
 
Mesurer Les Performances Avec JMeter Cours Du Soir Valtech 25 Mars 2010
Mesurer Les Performances Avec JMeter   Cours Du Soir Valtech 25 Mars 2010Mesurer Les Performances Avec JMeter   Cours Du Soir Valtech 25 Mars 2010
Mesurer Les Performances Avec JMeter Cours Du Soir Valtech 25 Mars 2010
 
Softshake 2015 - Comment tester et optimiser la performance d'un SI ?
Softshake 2015 - Comment tester et optimiser la performance d'un SI ?Softshake 2015 - Comment tester et optimiser la performance d'un SI ?
Softshake 2015 - Comment tester et optimiser la performance d'un SI ?
 
Clustering Java applications with Terracotta and Hazelcast
Clustering Java applications with Terracotta and HazelcastClustering Java applications with Terracotta and Hazelcast
Clustering Java applications with Terracotta and Hazelcast
 
Performance serveur et apache
Performance serveur et apachePerformance serveur et apache
Performance serveur et apache
 
Measuring Web Performance - HighEdWeb Edition
Measuring Web Performance - HighEdWeb EditionMeasuring Web Performance - HighEdWeb Edition
Measuring Web Performance - HighEdWeb Edition
 
Livre blanc - GED les meilleures solutions open source
Livre blanc - GED les meilleures solutions open sourceLivre blanc - GED les meilleures solutions open source
Livre blanc - GED les meilleures solutions open source
 
Migration
MigrationMigration
Migration
 
Migration
MigrationMigration
Migration
 
présentation migration automatisee Pacbase -> UML + Java
présentation migration automatisee Pacbase -> UML + Javaprésentation migration automatisee Pacbase -> UML + Java
présentation migration automatisee Pacbase -> UML + Java
 
Conduire un projet de GED: Concepts de base, points de repère pour la mise en...
Conduire un projet de GED: Concepts de base, points de repère pour la mise en...Conduire un projet de GED: Concepts de base, points de repère pour la mise en...
Conduire un projet de GED: Concepts de base, points de repère pour la mise en...
 

Similaire à Tests de performances d'une application Java EE

Performance ug#1
Performance ug#1Performance ug#1
Performance ug#1Marc Bojoly
 
Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...
Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...
Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...Normandy JUG
 
Université de la performance
Université de la performanceUniversité de la performance
Université de la performancepkernevez
 
Morning tech #2 - Démarche performance slides
Morning tech #2 - Démarche performance slidesMorning tech #2 - Démarche performance slides
Morning tech #2 - Démarche performance slidesOxalide
 
Oxalide Morning tech #2 - démarche performance
Oxalide Morning tech #2 - démarche performanceOxalide Morning tech #2 - démarche performance
Oxalide Morning tech #2 - démarche performanceLudovic Piot
 
Automatisation des tests - objectifs et concepts - partie 1
Automatisation des tests  - objectifs et concepts - partie 1Automatisation des tests  - objectifs et concepts - partie 1
Automatisation des tests - objectifs et concepts - partie 1Christophe Rochefolle
 
Université de la performance - Devoxx France
Université de la performance - Devoxx FranceUniversité de la performance - Devoxx France
Université de la performance - Devoxx FranceMarc Bojoly
 
Optimisation LAMP
Optimisation LAMPOptimisation LAMP
Optimisation LAMPcyruss666
 
Load test & performance profiling
Load test & performance profilingLoad test & performance profiling
Load test & performance profilingMSDEVMTL
 
PyConFR - testons en python
PyConFR - testons en pythonPyConFR - testons en python
PyConFR - testons en pythongburet
 
Session #2 du workshop sur la performance en environnement de production
Session #2 du workshop sur la performance en environnement de productionSession #2 du workshop sur la performance en environnement de production
Session #2 du workshop sur la performance en environnement de productionDEFO KUATE Landry
 
Automatisation des tests - objectifs et concepts - partie 2
Automatisation des tests  - objectifs et concepts - partie 2Automatisation des tests  - objectifs et concepts - partie 2
Automatisation des tests - objectifs et concepts - partie 2Christophe Rochefolle
 
Spring Batch - Julien Jakubowski - November 2010
Spring Batch - Julien Jakubowski - November 2010Spring Batch - Julien Jakubowski - November 2010
Spring Batch - Julien Jakubowski - November 2010JUG Lausanne
 
Presentation Rex Methodes Agiles
Presentation Rex Methodes AgilesPresentation Rex Methodes Agiles
Presentation Rex Methodes AgilesIppon
 
Accélération des pages Web : les bases en exemple
Accélération des pages Web : les bases en exempleAccélération des pages Web : les bases en exemple
Accélération des pages Web : les bases en exempleJean-Pierre Vincent
 
Scub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libreScub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libreStéphane Traumat
 
Panel de solutions javascript
Panel de solutions javascriptPanel de solutions javascript
Panel de solutions javascriptjp_mouton
 

Similaire à Tests de performances d'une application Java EE (20)

Performance ug#1
Performance ug#1Performance ug#1
Performance ug#1
 
Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...
Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...
Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...
 
Université de la performance
Université de la performanceUniversité de la performance
Université de la performance
 
Morning tech #2 - Démarche performance slides
Morning tech #2 - Démarche performance slidesMorning tech #2 - Démarche performance slides
Morning tech #2 - Démarche performance slides
 
Oxalide Morning tech #2 - démarche performance
Oxalide Morning tech #2 - démarche performanceOxalide Morning tech #2 - démarche performance
Oxalide Morning tech #2 - démarche performance
 
Automatisation des tests - objectifs et concepts - partie 1
Automatisation des tests  - objectifs et concepts - partie 1Automatisation des tests  - objectifs et concepts - partie 1
Automatisation des tests - objectifs et concepts - partie 1
 
Perf university
Perf universityPerf university
Perf university
 
Université de la performance - Devoxx France
Université de la performance - Devoxx FranceUniversité de la performance - Devoxx France
Université de la performance - Devoxx France
 
Optimisation LAMP
Optimisation LAMPOptimisation LAMP
Optimisation LAMP
 
Cerberus Testing
Cerberus TestingCerberus Testing
Cerberus Testing
 
Load test & performance profiling
Load test & performance profilingLoad test & performance profiling
Load test & performance profiling
 
PyConFR - testons en python
PyConFR - testons en pythonPyConFR - testons en python
PyConFR - testons en python
 
Session #2 du workshop sur la performance en environnement de production
Session #2 du workshop sur la performance en environnement de productionSession #2 du workshop sur la performance en environnement de production
Session #2 du workshop sur la performance en environnement de production
 
Automatisation des tests - objectifs et concepts - partie 2
Automatisation des tests  - objectifs et concepts - partie 2Automatisation des tests  - objectifs et concepts - partie 2
Automatisation des tests - objectifs et concepts - partie 2
 
Spring Batch - Julien Jakubowski - November 2010
Spring Batch - Julien Jakubowski - November 2010Spring Batch - Julien Jakubowski - November 2010
Spring Batch - Julien Jakubowski - November 2010
 
REX Scrum mature
REX Scrum matureREX Scrum mature
REX Scrum mature
 
Presentation Rex Methodes Agiles
Presentation Rex Methodes AgilesPresentation Rex Methodes Agiles
Presentation Rex Methodes Agiles
 
Accélération des pages Web : les bases en exemple
Accélération des pages Web : les bases en exempleAccélération des pages Web : les bases en exemple
Accélération des pages Web : les bases en exemple
 
Scub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libreScub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libre
 
Panel de solutions javascript
Panel de solutions javascriptPanel de solutions javascript
Panel de solutions javascript
 

Plus de Antonio Gomes Rodrigues

We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...
We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...
We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...Antonio Gomes Rodrigues
 
"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUG
"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUG"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUG
"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUGAntonio Gomes Rodrigues
 

Plus de Antonio Gomes Rodrigues (6)

We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...
We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...
We Love Speed 2019 : Retour d’expérience sur 4 ans d’utilisation d’un outil d...
 
Condensé de mom illustré
Condensé de mom illustréCondensé de mom illustré
Condensé de mom illustré
 
PerfUG : présentation de Dynatrace APM
PerfUG : présentation de Dynatrace APMPerfUG : présentation de Dynatrace APM
PerfUG : présentation de Dynatrace APM
 
"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUG
"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUG"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUG
"Apache JMeter, Java et Groovy sont sur un bateau" présentée au Paris JUG
 
Gestion des index SQL : Soyez AWARE !
Gestion des index SQL : Soyez  AWARE !Gestion des index SQL : Soyez  AWARE !
Gestion des index SQL : Soyez AWARE !
 
Test de charge avec Apache JMeter
Test de charge avec Apache JMeterTest de charge avec Apache JMeter
Test de charge avec Apache JMeter
 

Tests de performances d'une application Java EE

  • 1. Tests de performances d'une application Java EE Tours JUG – 10 juin 2010 Antonio Gomes Rodrigues
  • 3. Antonio Gomes Rodrigues ● Consultant en performances JavaEE ● Plus de 6 ans d'expériences ● Rédacteur sur developpez.com ● http://arodrigues.developpez.com/
  • 4. Des ressources Des actualités http://twitter.com/javaDeveloppez java@redaction-developpez.com De l'entraide Un hébergement gratuit w w :/ /w http
  • 6. Commencez par faire correctement les choses, puis accélérez-les si cela ne va pas assez vite
  • 7. Sommaire ● Procédure de test ● Définition de la stratégie de test ● Faire un test de charge ● Identifier les problèmes ● Diagnostic Java EE
  • 8. Sommaire ● Procédure de test ● Définition de la stratégie de test ● Faire un test de charge ● Identifier les problèmes ● Diagnostic Java EE
  • 9. Procédure de test ● Itératif ● Préparer les tests ● Mesurer les performances ● Identifier les problèmes ● Corriger les problèmes (faire seulement une modification à la fois) ● Recommencer jusqu'à atteindre les objectifs
  • 10. Sommaire ● Procédure de test ● Définition de la stratégie de test ● Faire un test de charge ● Identifier les problèmes ● Diagnostic Java EE
  • 11. Définition de la stratégie de test
  • 12. Définition de la stratégie de test
  • 13. Définir les objectifs de l'audit de performance ● Résoudre des problèmes de performance d'une application, ● Dimensionner une infrastructure de production pour un déploiement national, ● Rassurer la DSI sur la montée en charge d'une application ● Valider les performances/endurance/robustesse d'une application, ● Comparer des solutions, ● ...
  • 14. Identifier les scénarios pertinents et les pondérer ● Des scénarios réalistes (écrans consultés, champs saisis dans les formulaires, temps entre chaque actions, ...). ● Faire les scénarios importants (ceux de tous les jours mais aussi ceux importants d'un point de vue fonctionnel (déclenchement de la paye, ...)) ● Voir les logs d'accès, cas d'utilisation, ... ● Attention au cas où l'application fait appel à un service extérieur (serveur de cartographie, serveur de validation du numéro de carte bleue, ...).
  • 15. Identifier les outils et les ressources à disposition ● Outils mis à disposition (LoadRunner, JMeter, Introscope, ...) ● Disponibilité des développeurs, fonctionnels, DBA, administrateur système, ... ● S'assurer de la disponibilité exclusive de l'environnement
  • 16. S'assurer que la plateforme testée est la plus proche possible de la plateforme cible
  • 17. S'assurer que la plateforme de test répond aux exigences du test
  • 18. S'assurer d'avoir un jeux de données réaliste ● Données de prod, ETL, Outils spécifique (Benerator, ...)
  • 19. Démo de Benerator ● Plugin pour Maven2 ● Plugin pour Eclipse ● Personnalisable ● Gratuit ● Bonne documentation ● Supporte la majorité des bases de données du marché ● http://databene.org/databene-benerator
  • 22. Sommaire ● Procédure de test ● Définition de la stratégie de test ● Faire un test de charge ● Quand faire un test de charge ● Quoi mesurer/vérifier ● Quand donner les résultats ● Que va t-on trouver ● Process ● Rapport d'audit
  • 23. Sommaire ● Procédure de test ● Définition de la stratégie de test ● Faire un test de charge ● Quand faire un test de charge ● Quoi mesurer/vérifier ● Quand donner les résultats ● Que va t on trouver ● Procédure ● Rapport d'audit
  • 24. Quand faire un test de charge
  • 25. Demo de ContiPerf ● Simple d'utilisation ● Intégration à Maven2 ● Intégration à Eclipse ● Export des résultats au format CSV ● … ● http://databene.org/contiperf.html
  • 26. Demo de Yourkit Java Profiler ● Une grande richesse fonctionnelle ● Intégration aux principaux IDE du marché ● Multi plate-forme ● Intégration aux principaux serveurs d'application ● Contrôle de l'overhead pour s'adapter à la machine cible ● http://www.yourkit.com/overview/index.jsp
  • 27. Quand faire un test de charge ● En fin de projet ● Pour : ● Régler les serveurs ● Augmenter les performances ● Valider la mise en production, ● ...
  • 28. Sommaire ● Procédure de test ● Définition de la stratégie de test ● Faire un test de charge ● Quand faire un test de charge ● Quoi mesurer/vérifier ● Quand donner les résultats ● Que va t-on trouver ● Procédure ● Rapport d'audit
  • 30. Sur chaque serveur ● L’activité du système ● L’activité du réseau (débit, taux de perte, ...) ● L’occupation mémoire (mémoire occupée, mémoire libre, mémoire swap, ...) ● L’occupation du processeur (taux d'occupation, ...)
  • 31. Sur chaque JVM ● JVM Mode ● Vérifier qu'on est bien en "-server"et non en "-client" (En particulier sur les JVM 1.4 et inférieur) ● Taille de la Java Heap ● La taille de la heap (Java options -Xmx (maximum) et -Xms (minimum)) et son comportement. ● Comportement du Garbage Collection ● Sa fréquence, son temps d'exécution, ... (-verbose:gc, -XX:+PrintGCTimeStamps, -XX:+PrintGCDetails) ● Dump mémoire ● -XX:+HeapDumpOnOutOfMemoryError ● -XX:+HeapDumpOnCtrlBreak
  • 32. Sur les serveurs d'application ● L’activité du système ● L’activité du réseau (débit, taux de perte, ...) ● L’occupation mémoire (mémoire occupée, mémoire libre, mémoire swap, ...) ● L’occupation du processeur (taux d'occupation, ...)
  • 34. Désactiver l'Auto-Deploy Tomcat - conf/server.xml <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="false" xmlValidation="false" xmlNamespaceAware="false">
  • 35. JSP Reload et JSP Development Mode Glassfish - default-web.xml <init-param> <param-name>development</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>genStrAsCharArray</param-name> <param-value>true</param-value> </init-param>
  • 37. Pool de connexion JDBC ● Taille du pool ● Maximum wait time ● Average wait time ● Minimum available free connections
  • 38. Pool de threads ● Taille du pool ● Taux d'occupation du pool de thread ● Le nombre de threads en attente
  • 39. Web Container ● Nombre maximal de connexions ouvertes ● Pool d'unité d'exécution ● Le cache (surtout pour les objets statiques)
  • 40. EJB Container ● Taille du pool de thread ● Taille du cache ● Taille du pool Message Driven Beans
  • 41. Sessions ● Nombre de sessions ● Délai d'expiration
  • 42. Sur les serveurs de bases de données
  • 43. Taille mémoire cache update TABLE_A_MODIFIER set FIELD1 = FIELD1 + 1, FIELD2=' '  where (FIELD3>0) Après tuning du cache
  • 44. Les requêtes couteuses ● Attention, il faut bien paramétrer la taille de la mémoire cache avant. ● MySQL propose un « slow query log » ● Oracle propose une vue ● Sinon plusieurs outils proposent de le faire
  • 45. Autres ● Hibernate ● Activer ou désactiver le mode trace d'hibernate ● Application ● Les fonctions les plus consommatrices.
  • 46. Sommaire ● Procédure de test ● Définition de la stratégie de test ● Faire un test de charge ● Quand faire un test de charge ● Quoi mesurer/vérifier ● Quand donner les résultats ● Que va t-on trouver ● Procédure ● Rapport d'audit
  • 47. Quand donner les résultats ● Au fur et à mesure car généralement cela induit des décision importantes dont le cycle de décision peut être relativement long. ● par exemple lancer des procédures d'achat de matériel lors d'un dimensionnement d'infrastructure, commander l'intervention d'une expertise externe/interne, migration vers une version plus récente de la librairie.
  • 48. Sommaire ● Procédure de test ● Définition de la stratégie de test ● Faire un test de charge ● Quand faire un test de charge ● Quoi mesurer/vérifier ● Quand donner les résultats ● Que va t-on trouver ● Procédure ● Rapport d'audit
  • 49. Que va t-on trouver ● Des mauvaises pratiques de conception ou de développement, ● Une architecture logicielle qui ne privilégie pas les performances, ● Un hardware sous dimensionné, ● Un mauvais paramétrage du serveur d'applications, ● Un mauvais paramétrage du serveur de bases de données, ● Un mauvais paramétrage des frameworks (hibernate, ...) ● Problème d'utilisation de cache, ● ...
  • 50. Sommaire ● Procédure de test ● Définition de la stratégie de test ● Faire un test de charge ● Quand faire un test de charge ● Quoi mesurer/vérifier ● Quand donner les résultats ● Que va t-on trouver ● Procédure ● Rapport d'audit
  • 51. Procédure ● Capture scénario ● Paramétrage scénario ● Corrélation, variabilisation, think time, ... ● Regroupement dans un plan de test ● Paramétrage du plan de test ● Faire un tir unitaire/de référence ● Permet d'étalonner les scénarios et de collecter des temps de réponse nominaux ● Exécuter le scénario ● Le tir doit être assez long pour monter en charge et obtenir des moyennes significatives ● Récupérer les metrics ● Faire un rapport d'audit
  • 52. JMeter - enregistrement d'un script
  • 53. JMeter – exécution d'un script
  • 54. JMeter Demo ● Bonne documentation ● Open Source et gratuit ● De nombreux protocoles supportés ● … ● http://jakarta.apache.org/jmeter/
  • 55. Sommaire ● Procédure de test ● Définition de la stratégie de test ● Faire un test de charge ● Quand faire un test de charge ● Quoi mesurer/vérifier ● Quand donner les résultats ● Que va t-on trouver ● Procédure ● Rapport d'audit
  • 57. Rapport d'audit ● C’est un long travail de consolidation de toutes les informations pertinentes.
  • 58. S'adapter à son auditoire
  • 59. Sommaire ● Procédure de test ● Définition de la stratégie de test ● Faire un test de charge ● Identifier les problèmes ● Diagnostic Java EE
  • 62. Mauvaise performances et utilisation CPU élevée
  • 63. Mauvaise performances et utilisation CPU basse
  • 64. Performances irrégulière et utilisation CPU irrégulière
  • 65. Mauvaises performances et utilisation des I/O haute
  • 67. Sommaire ● Procédure de test ● Définition de la stratégie de test ● Faire un test de charge ● Identifier les problèmes ● Diagnostic Java EE
  • 70. Tuning ● Attention , la taille de la heap ne doit pas dépasser la taille mémoire physique de la machine. ● Il peut être utile de mettre la même valeur pour -Xmx (maximum) et -Xms (minimum) afin d'éviter les redimensionnement de la heap. ● Attention lorsque il y a beaucoup de JSP
  • 72. Vérification des paramètres ● Utiliser YourKit Java Profiler ou VisualVM ou ...
  • 73. OutOfMemoryError ● Exception in thread "main": java.lang.OutOfMemoryError: Java heap space ● Problème de paramétrage de la taille de la heap ● Fuite mémoire ● Paramètre JVM : -Xmx ● Profiler/Dump
  • 74. OutOfMemoryError ● Exception in thread "main": java.lang.OutOfMemoryError: PermGen space ● Beaucoup de classes ● Beaucoup d'objets String (String.intern ou ClassLoader.defineClass dans la stack trace) ● Paramètre JVM : -XX:MaxPermSize ● jmap -permgen
  • 75. OutOfMemoryError ● Exception in thread "main": java.lang.OutOfMemoryError: Requested array size exceeds VM limit ● Utilisation de tableaux trop grands par rapport à la taille de la heap ● Paramètre -Xmx ● Profiler/Dump
  • 76. OutOfMemoryError ● Exception in thread "main": java.lang.OutOfMemoryError: request <size> bytes for <reason>. Out of swap space? ● Fuite mémoire ● Serveur trop chargé en mémoire (autres applications, ...) ● Profiler/Dump ● Monitoring du serveur
  • 77. OutOfMemoryError ● Exception in thread "main": java.lang.OutOfMemoryError: <reason> <stack trace> (Native method) ● Problème mémoire détecté lors d'une interaction avec une application native à l'aide de JNI ● Profiler/Dump ● Monitoring du serveur
  • 78. Le coût du GC ● Si le temps utilisé par GC est supérieur à 25% c'est qu'il y a un problème. ● Heap trop petite ● Trop d'objet ● Profiler/Dump ● Paramètre JVM : -Xmx ● Findbugs/PMD ● Modification de la stratégie du GC ● Pas d'appels explicite du GC : -XX:-DisableExplicitGC
  • 80. Diag Bdd ● Faire intervenir un DBA si nécessaire
  • 81. Utiliser des index update TABLE1 MxT3 set (T1.FIELD1) = (select T2.FIELD1 from TABLE2 T2 where (T1.FIELD2 = T2.FIELD3 )) where exists (select 1 from TABLE2 T2 where (T1.FIELD2 = T2.FIELD3 )) Après create index TABLE2_N98 on TABLE2 (FIELD3,FIELD1)
  • 82. Limiter au maximum les valeurs récupérées ● Pas de select * ● Conditions dans la clause where
  • 83. Utiliser des Prepared Statements ● Seulement pour les requêtes appelées de nombreuses fois PreparedStatement pstmt = con.prepareStatement("UPDATE table SET i = ? WHERE j = ?"); pstmt.setLong(1, 123); pstmt.setLong(2, 100); Paramétrer le cache Prepared Statements dans le serveur JavaEE et/ou dans le driver JDBC
  • 84. Éviter les commits trop fréquents setAutoCommit(false); // Executer toute les requêtes ExecuteUpdate();
  • 85. Utiliser des Batch Updates Connection con = DriverManager.getConnection(.......); Statement stmt = con.createStatement(); stmt.addBatch("INSERT INTO Adresse ......."); stmt.addBatch("INSERT INTO Contacte ......."); int[] countUpdates = stmt.executeBatch();
  • 86. Paramétrer le pool de connexion JDBC ● Trouver la bonne taille lors des tests (regarder le nombre de connexions en attente, la charge CPU, ...). Pour éviter la création de connexions au mauvais moment, on peut fixer la même valeur pour le min et le max
  • 87. Libérer les ressources JDBC ● Libérer les ressources JDBC dans la clause finally du try catch ● Utiliser Spring Jdbc template ● Utiliser Commons DbUtils Findbugs
  • 88. Diag thread ● Dead lock ● Au moins 2 threads se bloquent pour accéder à une ressource. ● Race conditions ● Au moins 2 threads entrent en compétition pour obtenir une ressource et donc le nombre de threads augmente et il faut de plus en plus de temps pour accéder à la ressource.
  • 89. Diag thread ● Thread Leak ● On crée des thread sans fin jusqu'à avoir un OutOfMemory: unable to create new native thread. ● Problème de configuration du pool de thread ● Le nombre de thread configuré dans le pool est supérieur au nombre maximum de thread de la JVM
  • 90. Diag HTTP ● Une gestion des dates d'expiration sur les ressources statiques couplée à un cache au niveau des frontaux http pour soulager l'infrastructure. ● Par exemple une image qui ne change pas régulièrement peut avoir une date d'expiration lointaine afin qu'à chaque requête, il n'y ait pas de vérification sur l'existence d'une nouvelle version. 
  • 91. Session ● Attention au volume des données stockées en session car cela peut provoquer une dégradation significative des performances dans le cas notamment où la réplication de session est activée.
  • 92. Diag affichage ● Compression des ressources statiques (images, fichiers flashs, scripts, ...) ● Mettre en place une politique d'expiration des ressources statiques, ● Activer la compression HTTP ● Utiliser des CSS sprite ● CSS en début de page ● Javascript en fin de page
  • 93. Diag Hibernate ● Optimisation du mapping hibernate pour réduire significativement le nombre de requêtes exécutées sur la base de données. ● Mes préconisations sont : ● D'initialiser les relations en mode différé (par défaut) ● Puis au cas par cas s'assurer que ce mode de chargement ne génère pas les problèmes dits de N+1 ou les produits cartésiens. ● Optimiser les modes de chargement en utilisant les techniques de chargement groupé, chargement par sous select, etc.
  • 94. Conseils ● Commencer les tests dès que possible ● Automatiser le maximum de tests ● Faire intervenir un DBA ● Faire de l'itératif ● Ne faire varier qu'un paramètre à la fois ● Communiquer ● ...