Mesurer la performance
dans le milieu hostile
du développement Java
Antonio Gomes Rodrigues
@ra0077


Consultant chez Aliecom


Rédacteur pour developpez.com


Conférencier                    0
●   Le milieu hostile du développement Java

●   La loi de Pareto

●   Sur quoi se focaliser

●   Comment interpréter les résultats

●   Tester la performance de votre code
La loi de Pareto La loi
de Murphy La loi de
Carlson La loi de
Parkinson La loi d'Illich
La loi de Laborit La loi
de Fraisse
20% du code totalise
      80% du temps d'exécution
Et comment fait-on pour
            connaitre ces 20% ?
Ne      devinez     pas,
mesurez      E = mc²
S = (b*h)/2 a = b S = c²
S = (h * (b+B))/2 a+b=c
P = 2*Pi*r² a² + b² = c²
La solution est 42
Et comment fait-on pour
             analyser ces 20% ?
Approfondissez       les
choses      Donne     un
poisson à un homme, tu
le nourris pour un jour.
Apprends-lui à pêcher,
tu le chuck norris
Apprenez comment les choses
fonctionnent et pas seulement
comment les utiliser
Un exemple ?

   Le comportement d'une JVM
JVM Tenure age Stack
Architecture   mémoire
Allocator Full GC Tilt
ratio JVM générationel
-Xmx Minor GC Tilt ratio
Mark -Xss JIT Sweep
Compaction -verbosegc
Évitez les Major GC
(Full Garbage collector)
Fonctionnement simplifié du GC
Fonctionnement simplifié du GC
Fonctionnement simplifié du GC
Fonctionnement simplifié du GC
Fonctionnement simplifié du GC
Fonctionnement simplifié du GC
Fonctionnement simplifié du GC
Fonctionnement simplifié du GC
Fonctionnement simplifié du GC
Fonctionnement simplifié du GC
Fonctionnement simplifié du GC
Fonctionnement simplifié du GC
Fonctionnement simplifié du GC
Fonctionnement simplifié du GC
Fonctionnement simplifié du GC
Évitez les FullGC

Faire attention aux objets vivants longtemps
(pool, session...)

Faire attention aux gros objets

Essayer de maximiser le nombre d’objets
collectés dans la New Generation

Éviter les objets de durée de vie
intermédiaire
Un autre exemple ?
L'architecture mémoire de la JVM ...
... ou pas
Code    Scala   HTML
Bytecode     Javascript
Framework XML CSS
Groovy Binaire Java
Class Java EE SQL
Jython
Code HTML Combined
files   Gzip   Cache-
Control header CSS
sprites DOM Javascript
Framework XML CSS
Chargement tardif CDN
Code SonarJ Couplage
Xradar Findbugs Revue
de code Sonar PMD
Checkstyle JIRA Squid
Clover NCSS Cobertura
Couverture de code
FindBugs
FindBugs
FindBugs
Code VisualGC TPTP
ContiPerf jinfo DBunit
Hyperic jstat VisualVM
JConsole        Netbeans
Profiler Perf4j jps TDA
Audit de code Profiler
Databene ContiPerf
import org.junit.*;
import org.databene.contiperf.*;

public class OwnerTestsPerf {

        @Rule
        public ContiPerfRule i = new ContiPerfRule();

        @Test
        @PerfTest(threads = 10, duration = 60000,
                    rampUp = 100, warmUp = 2000)

        @Required(max = 1000, average = 250)
        public void testHasPet() {
           Owner owner = new Owner();
           Pet fido = new Pet();
           fido.setName("Fido");
           owner.addPet(fido);
    }
}
Code SQL Index Oracle
MySQL SGA Benerator
Normalisation Mapping
JMeter Tuning Full scan
Transaction Select
select * from t_conducteur
left join t_voiture on id_conducteur=conducteur_fk
where couleur = 'rouge'




                  x 200
Databene Benerator
Databene Benerator
 <database id="db" url="jdbc:mysql://localhost:3306/test" ... />

 <generate type="t_conducteur" count="1000" consumer="db" >
 <variable name="individu"
 generator="org.databene.domain.person.PersonGenerator" />
     <id name="id_conducteur" generator="idGen" />
     <attribute name="prenom" script="individu.givenName" />
     <attribute name="nom" script="individu.familyName" />
     <attribute name="email" script="individu.email" />
 </generate>

 <generate type="t_voiture" count="3000" consumer="db">
     <id name="id_voiture" generator="idGen" />
     <attribute name="prix" min="8000" max="200000" />
     <reference name="couleur" values="'rouge','verte'" />
     <reference name="conducteur_fk" targetType="t_conducteur"
 source="db" distribution="expand" cyclic="true" />
 </generate>
Code Test aux limites
VisualGC LoadRunner
JConsole JMeter Test
de charge Monitoring
Plan de test Ramp up
Apache JMeter
Paramètres



Transactions



Requêtes HTTP
Mesurez Mesurez Mesurez Mesurez
Mesurez Mesurez Mesurez Mesurez
Mesurez Mesurez Mesurez Mesurez

Et si possible avec un jeu de
données cohérent et une bonne
méthodologie
Pour aller plus loin
Benerator
http://blog.aliecom.com/presentation-de-loutil-de-generation-de-jeux-de-
donnees-benerator/

System.gc()
http://blog.aliecom.com/pourquoi-il-est-dangereux-dutiliser-system-gc/

Volume du jeu de données
http://blog.aliecom.com/pourquoi-faire-attention-au-volume-du-jeu-de-
donnees-en-base/

ContiPerf
http://blog.aliecom.com/contiperf/

Apache JMeter
http://blog.aliecom.com/presentation-de-loutil-apache-jmeter-partie-1/
http://blog.aliecom.com/presentation-de-loutil-apache-jmeter-partie-2/
Mesurer la performance dans le milieu hostile du développement Java

Mesurer la performance dans le milieu hostile du développement Java