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

Preview:

DESCRIPTION

Présentation réalisé pour la Breizhcamp 2012

Citation preview

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/

Recommended