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 ContiPerfimport 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 loinBeneratorhttp://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éeshttp://blog.aliecom.com/pourquoi-faire-attention-au-volume-du-jeu-de-donnees-en-base/
ContiPerfhttp://blog.aliecom.com/contiperf/
Apache JMeterhttp://blog.aliecom.com/presentation-de-loutil-apache-jmeter-partie-1/http://blog.aliecom.com/presentation-de-loutil-apache-jmeter-partie-2/
Top Related