Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Concevoir un serveur performant en Java: l'expé...

Avatar for ludomp ludomp
March 26, 2012

Concevoir un serveur performant en Java: l'expérience du projet OpenDJ

Java, Performance, Tuning de JVM et GC.
Faite au Marseille JUG le 22/03/2012

Avatar for ludomp

ludomp

March 26, 2012
Tweet

Other Decks in Technology

Transcript

  1. (cc) 2012 ForgeRock Concevoir un serveur ultra-performant en Java :

    l'expérience du projet OpenDJ Ludovic Poitou Marseille JUG - 22/03/2012 Thursday, March 22, 12
  2. (cc) 2012 ForgeRock 2 Qui suis-je ? - Ludovic Poitou

    - Product Manager à ForgeRock - Précédemment, Architecte chez Sun et “Community Manager” pour le projet OpenDS - Plus de 15 ans d'expérience avec LDAP - Architecte de Sun Directory Server 5.2 / 6 - http://ludopoitou.wordpress.com Thursday, March 22, 12
  3. (cc) 2012 ForgeRock - ForgeRock AS - Février 2010 -

    Norvège - Editeur de logiciels d’Infrastructure et Sécurité, open source - OpenAM (ex-OpenSSO), OpenDJ (OpenDS), OpenICF, OpenIDM, OpenIG ... - ForgeRock France SAS - Novembre 2010 - Centre de Recherche & Développement à Grenoble - UK, USA, Brésil, Allemagne, Suède, Nouvelle Zélande... Thursday, March 22, 12
  4. (cc) 2012 ForgeRock Agenda - Une présentation du project OpenDJ

    - Performances et OpenDJ - Performances et la JVM - Conclusion Thursday, March 22, 12
  5. (cc) 2012 ForgeRock Le projet OpenDS - Lancé en Open

    Source en July 2006 - CDDL - Code source : https://opends.dev.java.net/ - Sponsorisé par Sun Microsystems - Ecrit en Java par des experts LDAP Thursday, March 22, 12
  6. (cc) 2012 ForgeRock - Dérive d’OpenDS - La seule branche

    activement développée en open source - Soutenue par la communauté - Supporté par ForgeRock Thursday, March 22, 12
  7. (cc) 2012 ForgeRock Qu'est ce ? - OpenDJ est un

    server en Java qui implémente le protocol LDAPv3 et ses services - Il inclut sa propre base de données, - basé sur Berkeley DB Java Edition - Pas accessible directement - Possède toutes les fonctions de sécurité, de contrôle d'accès, de gestion de mots de passes pour stocker de façon sécurisée les identités des utilisateurs et machines Thursday, March 22, 12
  8. (cc) 2012 ForgeRock Pourquoi Faire ? - Stockage générique et

    orienté objet de données - Pages blanches et carnet d'adresses mél - Principalement le coffre fort des Identités - Pour l'Authentication et les Authorizations - Pour les Profiles et Personnalisations - La brique de base de tout SI dans les entreprises - Utilisé par l'infrastructure Web et Mail - Le fondement des produits de gestion d'Identité - Gestion d'Accès, Fédération, Provisionnage Thursday, March 22, 12
  9. (cc) 2012 ForgeRock Les Objectifs du Projet OpenDJ - Un

    jeu complet de Services d'Annuaire - L'annuaire base de données, des services de Proxy d'annuaire, des fonctions d'annuaire virtuel - Conformes aux standards et extensions LDAPv3 - Capacité de croissance horizontale et verticale - Remplacer Sun Directory Server Enterprise Edition Thursday, March 22, 12
  10. (cc) 2012 ForgeRock Trois Principes - Facilité d'utilisation - Installation,

    Configuration, Gestion, Surveillance... - Capacité d'extension - De nombreuses interfaces ont été définies - Avec des implémentations par défault - Performance - C'est le coeur de cette présentation ! Thursday, March 22, 12
  11. (cc) 2012 ForgeRock 2.4 - 2.4.0 en Decembre 2010, 2.4.5

    en Février 2012 - Un serveur d'annuaire 100% conforme à LDAPv3 - Nombreuses extensions LDAP standards et expérimentales - Réplication Multi Maitre, avec 3 niveaux de cohérence des données - Fonctions étendues de Sécurité - S'installe en 6 clics et moins de 3 minutes - Gestion par outils graphiques et textes - Documentation complète Thursday, March 22, 12
  12. (cc) 2012 ForgeRock Pour Qui ? - Les opérateurs Télécom,

    le secteur financier, les portails - Pour stocker les identités des clients, téléphones et services - De 15 à 120 millions d'entrées, hautement disponibles - Pour le service de Nommage, ou les PME - OpenSolaris, Solaris, Linux..., couplé avec SAMBA, Intégré avec Kerberos - Pages blanches... Thursday, March 22, 12
  13. (cc) 2012 ForgeRock Caractéristiques de Performances - Comme tout serveur,

    les capacités de montée en charge priment - Jusqu'à plusieurs dizaines de millions d'entrées - Plusieurs milliers de connections - Quel débit d'opérations? - Quel temps de réponse moyen ? Maximum ? Photo par Roger Smith http://www.flickr.com/photos/rogersmith/ Thursday, March 22, 12
  14. (cc) 2012 ForgeRock Environnement de Test - OpenDS 2.2, Solaris

    10, ZFS - Le test de base : - 10 M d'entrées, taille moyenne 2,6K - Réplication multi-maitre entre 2 serveurs Thursday, March 22, 12
  15. (cc) 2012 ForgeRock Les réglages du Test - 32GB JVM

    with tuning - config.ldif - ds-cfg-db-cache-percent: 70 - ds-cfg-etime-resolution: nanoseconds - ds-cfg-num-request-handlers: 4 - Replication ON Thursday, March 22, 12
  16. (cc) 2012 ForgeRock Environnement de Test - OpenDJ 2.5.0 Nightly

    - Intel Core i7, 2.2 GHz - Linux 3.0, Local disk - 2 GB JVM with tuning - 10 000 entrées, taille moyenne 2,6K Thursday, March 22, 12
  17. (cc) 2012 ForgeRock Searchrate - $ bin/searchrate -h matts-laptop.local -p

    1389 -D cn=director manager -w password -g "rand(0,10000)" -c 32 -t 4 -F -b "dc=example,dc=com" "(uid=user. %d)" ------------------------------------------------------------------------------- Throughput Response Time (ops/second) (milliseconds) recent average recent average 99.9% 99.99% 99.999% err/sec Entries/Srch ------------------------------------------------------------------------------- 45538.6 46125.7 2.916 2.863 12.556 20.334 33.366 0.0 1.0 46238.0 46126.2 2.866 2.863 12.565 20.310 33.283 0.0 1.0 46563.7 46128.3 2.845 2.863 12.565 20.283 33.237 0.0 1.0 46374.9 46129.4 2.866 2.863 12.558 20.256 33.202 0.0 1.0 45679.3 46127.3 2.902 2.863 12.553 20.242 33.114 0.0 1.0 45951.9 46126.5 2.864 2.863 12.554 20.232 33.077 0.0 1.0 45549.4 46123.9 2.878 2.863 12.547 20.213 33.005 0.0 1.0 - CPU : 17% idle. - NewGen GC every 500ms, 4ms pauses, average. Thursday, March 22, 12
  18. (cc) 2012 ForgeRock Modrate - $ ./bin/modrate -h matts-laptop.local -p

    1389 -w password -D "cn=directory manager" -g "rand(0,10000)" -g "randstr(10)" -c 8 -t 1 -F -b "uid=user.%d,ou=people,dc=example,dc=com" 'description:%2$s' ----------------------------------------------------------------- Throughput Response Time (ops/second) (milliseconds) recent average recent average 99.9% 99.99% 99.999% err/sec ----------------------------------------------------------------- 13622.0 13140.0 2.346 2.432 173.866 252.059 324.275 0.0 13266.3 13145.3 2.408 2.431 173.597 251.477 324.444 0.0 12591.1 13143.2 2.539 2.431 178.187 251.988 347.243 0.0 13120.3 13142.9 2.435 2.431 178.403 252.563 347.559 0.0 12937.8 13140.0 2.469 2.432 178.540 252.418 347.559 0.0 13242.5 13141.4 2.413 2.431 178.533 252.230 347.549 0.0 13631.0 13148.1 2.343 2.430 178.421 252.139 347.559 0.0 - CPU : 60% idle, ~11MB/sec written to disks - NewGen GC every 1s, 10ms pauses, average. Thursday, March 22, 12
  19. (cc) 2012 ForgeRock Modrate - Moving the DB to a

    TEMPFS - $ ./bin/modrate -h matts-laptop.local -p 1389 -w password -D "cn=directory manager" -g "rand(0,10000)" -g "randstr(10)" -c 8 -t 1 -F -b "uid=user.%d,ou=people,dc=example,dc=com" 'description:%2$s' ----------------------------------------------------------------- Throughput Response Time (ops/second) (milliseconds) recent average recent average 99.9% 99.99% 99.999% err/sec ----------------------------------------------------------------- 17888.4 17438.8 1.785 1.832 18.294 30.490 117.054 0.0 18037.6 17455.4 1.771 1.830 18.235 30.320 117.626 0.0 18041.9 17471.3 1.770 1.829 18.236 30.057 117.356 0.0 17339.9 17467.8 1.842 1.829 18.212 30.616 117.093 0.0 18067.1 17483.2 1.768 1.827 18.213 30.524 117.054 0.0 18002.4 17496.2 1.775 1.826 18.245 30.521 117.017 0.0 17309.5 17491.6 1.845 1.826 18.252 30.355 117.093 0.0 Thursday, March 22, 12
  20. (cc) 2012 ForgeRock Comment Obtenir de Tels Résultats ? -

    2 Aspects - Le code - Le run-time : l'optimisation de la JVM et du Garbage Collector - Une relation très forte entre la conception du code et la gestion mémoire Thursday, March 22, 12
  21. (cc) 2012 ForgeRock Attention aux Tests de Performance - Des

    tests reproductibles - Maitrise du système et de l'environnement - Avec 100 000 entrées LDAP lues par seconde, le goulet peut être le réseau - Utilisation de 10GB ethernet Thursday, March 22, 12
  22. (cc) 2012 ForgeRock La JVM et les Performances “Tuning GC”

    est un art ! Photo par Kecko http://www.flickr.com/people/kecko/ Thursday, March 22, 12
  23. (cc) 2012 ForgeRock GC dans la VM HotSpot - 3

    GCs disponibles: - Serial GC - Parallel GC / Parallel Old GC - Concurrent Mark-Sweep GC (CMS) - Et mainteant Garbage First (G1) Thursday, March 22, 12
  24. (cc) 2012 ForgeRock Gestion du Tas (Pour Tous les GCs)

    Old Generation Permanent Generation Young Generation Thursday, March 22, 12
  25. (cc) 2012 ForgeRock Permanent Generation Allocation (only directly from the

    JVM) Permanent Generation Thursday, March 22, 12
  26. (cc) 2012 ForgeRock Le GC Rêvé - Idéalement il faudrait

    un GC avec - une faible consommation CPU, - des temps de pauses infimes et - efficace en occupation mémoire - Malheureusement, vous ne pouvez en choisir que 2 ! Photo par Craig Gorcott http://www.flickr.com/photos/craigweb/ Thursday, March 22, 12
  27. (cc) 2012 ForgeRock Conseil pour régler la taille du tas

    de la JVM LE PLUS GROS POSSIBLE Thursday, March 22, 12
  28. (cc) 2012 ForgeRock Un Equilibre à Trouver - Généralement, plus

    gros est l’espace mémoire, le mieux! - Valable pour les 2 espaces (Young Gen, Old Gen) - Un grand espace = des GCs moins fréquents, moins d’utilisation CPU, des objets qui sont vraiment détruits - Un petit espace = des GCs plus rapide (pas toujours) - Quelques fois, la taille maximale dépend de la mémoire physique et/ou de l’espace d’adressage de la JVM - Il faut trouver l'équilibre entre les tailles des générations Thursday, March 22, 12
  29. (cc) 2012 ForgeRock L’Impact des Tailles des Générations - La

    taille de la “Young Generation” - Détermine la fréquence des GCs mineurs - Détermine combien d’objets vont être récoltés - Ainsi que le “Tenuring Threshold” et la taille des “Survivor Spaces” - Old Generation - Doit contenir les données permanentes de l’application - Réduire la fréquence des GCs majeurs le plus possible Thursday, March 22, 12
  30. (cc) 2012 ForgeRock 2 Points Très Importants - Essayer de

    maximiser le nombre d’objets collectés dans la “Young generation” - L’empreinte mémoire de l’application ne doit pas dépasser la la taille de la mémoire physique - Ceci est valable quelque soit le GC Thursday, March 22, 12
  31. (cc) 2012 ForgeRock Dimensioner la Taille Mémoire - -Xmx<size> :

    Taille mémoire max. (young + old generation) - -Xms<size> : Taille mémoire initiale (young + old generation) - -Xmn<size> : Taille mémoire pour la “Young generation” - Pour contrôler les performances, il est préférable de mettre -Xms and -Xmx à la même valeur - Quand -Xms != -Xmx, l’accroissement ou diminution de la mémoire nécessite un GC complet. Thursday, March 22, 12
  32. (cc) 2012 ForgeRock Dimensioner la “Young Generation” - La taille

    de l’Eden influence - La fréquence des GCs mineurs - Les objets qui seront réclamés à l’age 0 - Les objets alloué dans l’Eden ont un age 0 - L’age est incrémenté chaque GC mineur - Augmenter la taille de l’Eden n’impact pas toujours la durée des GCs mineurs : celle ci est proportionnelle au nombre d’objets copiés (objets vivants) Thursday, March 22, 12
  33. (cc) 2012 ForgeRock Dimensionner les Espaces Mémoires - -XX:NewSize=<size> :

    Taille initiale de la “Young generation” - -XX:MaxNewSize=<size> : Taille maximale de la “Young generation” - -XX:NewRatio=<ratio> : Ratio entre “young generation” et “old generation” - Pour contrôler les performances, préférer -Xmn qui combine -XX:NewSize et -XX:MaxNewSize Thursday, March 22, 12
  34. (cc) 2012 ForgeRock Tenuring - -XX:TargetSurvivorRatio=<%>, e.g., 50 - Pourcentage

    d’occupation de l’espace “Survivor” - Laisser de l’espace pour gérer les pics - -XX:InitialTenuringThreshold=<threshold> - -XX:MaxTenuringThreshold=<threshold> - -XX:+AlwaysTenure - Ne rien garder dans les “Survivor” - -XX:+NeverTenure - Une très mauvaise idée Thursday, March 22, 12
  35. (cc) 2012 ForgeRock Tenuring : Avantages & Inconvénients - Maintenir

    le plus d’objets dans les espaces “Survivor” pour qu’ils soient collectés dans la “Young generation” - Moins de promotion vers la “Old generation” - Moins de GCs de la “Old generation” - Mais éviter les nombreuses copies entre espaces “Survivor” - Augmente le cout des GCs mineurs - Un équilibre difficile à trouver - Généralement, il vaut mieux copier que promouvoir Thursday, March 22, 12
  36. (cc) 2012 ForgeRock LE GC Garbage First (G1) - Nouveauté

    de la JVM HotSpot dans JDK 7 - Le replacement à long terme du GC “Concurrent Mark-Sweep” (CMS) - Objectif : plus de “Stop the World” GC ! - Version expérimentale de G1 dans Java SE 6 depuis la version mineur 14 - Utilisable avec Java 7u2 Thursday, March 22, 12
  37. (cc) 2012 ForgeRock Caractèristiques de G1 - Le remplacement de

    CMS - Un GC pour les Serveurs - Parallèle, Concurrent - S’appuie sur des Générations - Auto Compactant - Facile d’utilisation - Prédictif (mais pas temps réel) - Les étapes principales sont: remembered set (RS) maintenance, concurrent marking, and evacuation pauses. Thursday, March 22, 12
  38. (cc) 2012 ForgeRock G1: Les Options de la JVM -

    -XX:+UseG1GC (-XX:+UnlockExperimentalVMOptions) - Temps de pause (pas garanti, sinon utiliser Java Temps Réel) - -XX:MaxGCPauseMillis=50 (objectif de 50 millisecondes) - -XX:GCPauseIntervalMillis=1000 (objectif de 1000 msecs) - Taille des régions: -XX:G1HeapRegionSize=4M (de 1 a 32M) Thursday, March 22, 12
  39. (cc) 2012 ForgeRock OpenDJ et CMS - Les options -

    CMS + Occupency - NewGenSize = ¼ de la taille mémoire (jusqu’à 2GB) - MaxTenuringThreshold = 1 - Temps de pause maximum GC mineur ~ 100ms - Mais Full GC en écriture ! > 10 seconds ☹ Thursday, March 22, 12
  40. (cc) 2012 ForgeRock OpenDS et G1 - Objectif: Eviter le

    GC Complet, meilleur contrôle des temps de pause - Collaboration entre les équipes Sun HotSpot et OpenDS - OpenDS est utilisé comme application de référence - + de 20 améliorations integrées dans G1 suite aux tests - Améliorations par 10 des performances de G1 avec de grandes zones mémoires Thursday, March 22, 12
  41. (cc) 2012 ForgeRock OpenDJ, G1 et Java 7u2 - export

    OPENDS_JAVA_ARGS="-server -Xmx2G -Xms2G -Xmn512M -XX:+UseG1GC - XX:MaxGCPauseMillis=10 -XX:G1HeapRegionSize=4M -XX:MaxTenuringThreshold=1 -XX: +PrintGCTimeStamps -XX:+PrintGCDetails -XX:+UseCompressedOops" - Modrate, TEMPFS: G1: 16676.3 16373.0 1.916 1.952 18.973 28.206 59.249 0.0 16305.4 16372.4 1.960 1.952 18.966 28.160 57.163 0.0 16695.9 16375.1 1.911 1.951 18.941 28.123 59.249 0.0 16463.6 16375.8 1.943 1.951 18.927 28.104 59.924 0.0 CMS: 18041.9 17471.3 1.770 1.829 18.236 30.057 117.356 0.0 - G1 consomme plus de CPU, mais est plus prédictif - Reste à tester avec de grosses JVM (16 à 64 GB) - G1 enfin utilisable avec Java 7u2 Thursday, March 22, 12
  42. (cc) 2012 ForgeRock Le Contrôle du GC - En direct:

    - VisualVM: http://visualvm.dev.java.net/ - VisualGC: - http://java.sun.com/performance/jvmstat/ - VisualGC est aussi un module extension de VisualVM - Peut surveiller plusieurs VM dans le même outil - A posteriori - GC Logging, PrintGCStats Photo par Rennett Stowe http://www.flickr.com/photos/tomsaint/ Thursday, March 22, 12
  43. (cc) 2012 ForgeRock Le Journal du GC Activé en Production

    - Activer le journal du GC en production sans crainte - Très utile pour analyser, diagnostiquer un problème - Coût en performance extrêmement faible - Peut-être quelques gros fichiers à gérer - Il y a toujours des clients qui ont peur d’activer les logs - Un (gros) client de Sun a dit : “If someone doesn't enable GC logging in production, I shoot them!” Thursday, March 22, 12
  44. (cc) 2012 ForgeRock Paramètres pour le Journal du GC -

    -XX:+PrintGCTimeStamps - Ajouter -XX:+PrintGCDateStamps si besoin - -XX:+PrintGCDetails - Donne plus de détails que -verbosegc - Mais aussi: - -Xloggc:<fichier> - Permet de séparer les sorties du GC de celles de l’application Thursday, March 22, 12
  45. (cc) 2012 ForgeRock G1 +PrintGCDetails - [Times: user=0.03 sys=0.00, real=0.01

    secs] 1440.790: [GC pause (young), 0.00716200 secs] [Parallel Time: 5.4 ms] [GC Worker Start Time (ms): 1440790.5 1440790.6 1440790.6 1440790.6 1440790.6 1440792.1 1440792.1 1440792.1 Avg: 1440791.1, Min: 1440790.5, Max: 1440792.1, Diff: 1.6] [Update RS (ms): 0.7 0.6 0.2 0.7 0.0 0.0 0.0 0.7 Avg: 0.4, Min: 0.0, Max: 0.7, Diff: 0.7] [Processed Buffers : 8 7 1 11 0 0 0 11 Sum: 38, Avg: 4, Min: 0, Max: 11, Diff: 11] [Ext Root Scanning (ms): 2.3 2.7 2.9 2.3 2.0 1.8 1.6 1.0 Avg: 2.1, Min: 1.0, Max: 2.9, Diff: 1.9] [Mark Stack Scanning (ms): 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 Avg: 0.0, Min: 0.0, Max: 0.0, Diff: 0.0] [Scan RS (ms): 0.2 0.0 0.2 0.1 0.0 0.0 0.2 0.2 Avg: 0.1, Min: 0.0, Max: 0.2, Diff: 0.2] [Object Copy (ms): 0.5 0.3 0.4 0.5 2.5 0.3 0.3 0.2 Avg: 0.6, Min: 0.2, Max: 2.5, Diff: 2.3] [Termination (ms): 0.9 0.9 0.9 0.9 0.0 0.9 0.9 0.9 Avg: 0.8, Min: 0.0, Max: 0.9, Diff: 0.9] [Termination Attempts : 2 2 1 1 1 1 2 2 Sum: 12, Avg: 1, Min: 1, Max: 2, Diff: 1] [GC Worker End Time (ms): 1440795.2 1440795.1 1440795.1 1440795.1 1440795.1 1440795.1 1440795.2 1440795.2 Avg: 1440795.1, Min: 1440795.1, Max: 1440795.2, Diff: 0.1] [GC Worker Times (ms): 4.6 4.6 4.5 4.5 4.5 3.0 3.0 3.0 Avg: 4.0, Min: 3.0, Max: 4.6, Diff: 1.6] [Parallel Other: 1.4 ms] [Clear CT: 0.2 ms] [Other: 1.6 ms] [Choose CSet: 0.0 ms] [Ref Proc: 0.3 ms] [Ref Enq: 0.0 ms] [Eden: 511M(511M)->0B(511M) Survivors: 1024K->1024K Heap: 747M(2048M)->236M(2048M)] [Times: user=0.03 sys=0.00, real=0.01 secs] Thursday, March 22, 12
  46. (cc) 2012 ForgeRock PrintGCStats - Analyse et résume les journaux

    du GC - Un script disponible - http://java.sun.com/developer/technicalArticles/ Programming/turbo/PrintGCStats.zip - Usage - PrintGCStats -v cpus=<num> <gc log file> - Ou <num> est le nombre de CPU de la machine qui a produit les logs. - Peut ne pas marcher avec certains paramètres du log du GC Thursday, March 22, 12
  47. (cc) 2012 ForgeRock PrintGCStats Parallel GC - what count total

    mean max stddev gen0t(s) 193 11.470 0.05943 0.687 0.0633 gen1t(s) 1 7.350 7.34973 7.350 0.0000 GC(s) 194 18.819 0.09701 7.350 0.5272 alloc(MB) 193 11244.609 58.26222 100.875 18.8519 promo(MB) 193 807.236 4.18257 96.426 9.9291 used0(MB) 193 16018.930 82.99964 114.375 17.4899 used1(MB) 1 635.896 635.89648 635.896 0.0000 used(MB) 194 91802.213 473.20728 736.490 87.8376 commit0(MB) 193 17854.188 92.50874 114.500 9.8209 commit1(MB) 193 123520.000 640.00000 640.000 0.0000 commit(MB) 193 141374.188 732.50874 754.500 9.8209 alloc/elapsed_time = 11244.609 MB / 77.237 s = 145.586 MB/s alloc/tot_cpu_time = 11244.609 MB / 1235.792 s = 9.099 MB/s alloc/mut_cpu_time = 11244.609 MB / 934.682 s = 12.030 MB/s promo/elapsed_time = 807.236 MB / 77.237 s = 10.451 MB/s promo/gc0_time = 807.236 MB / 11.470 s = 70.380 MB/s gc_seq_load = 301.110 s / 1235.792 s = 24.366% gc_conc_load = 0.000 s / 1235.792 s = 0.000% gc_tot_load = 301.110 s / 1235.792 s = 24.366% Thursday, March 22, 12
  48. (cc) 2012 ForgeRock PrintGCStats CMS - what count total mean

    max stddev gen0(s) 110 24.381 0.22164 1.751 0.2038 gen0t(s) 110 24.397 0.22179 1.751 0.2038 cmsIM(s) 3 0.285 0.09494 0.108 0.0112 cmsRM(s) 3 0.092 0.03074 0.032 0.0015 GC(s) 113 24.774 0.21924 1.751 0.2013 cmsCM(s) 3 2.459 0.81967 0.835 0.0146 cmsCP(s) 6 0.971 0.16183 0.191 0.0272 cmsCS(s) 3 14.620 4.87333 4.916 0.0638 cmsCR(s) 3 0.036 0.01200 0.016 0.0035 alloc(MB) 110 11275.000 102.50000 102.500 0.0000 promo(MB) 110 1322.718 12.02471 104.608 11.8770 used0(MB) 110 12664.750 115.13409 115.250 1.2157 used(MB) 110 56546.542 514.05947 640.625 91.5858 commit0(MB) 110 12677.500 115.25000 115.250 0.0000 commit1(MB) 110 70400.000 640.00000 640.000 0.0000 commit(MB) 110 83077.500 755.25000 755.250 0.0000 alloc/elapsed_time = 11275.000 MB / 83.621 s = 134.835 MB/s alloc/tot_cpu_time = 11275.000 MB / 1337.936 s = 8.427 MB/s alloc/mut_cpu_time = 11275.000 MB / 923.472 s = 12.209 MB/s promo/elapsed_time = 1322.718 MB / 83.621 s = 15.818 MB/s promo/gc0_time = 1322.718 MB / 24.397 s = 54.217 MB/s gc_seq_load = 396.378 s / 1337.936 s = 29.626% gc_conc_load = 18.086 s / 1337.936 s = 1.352% gc_tot_load = 414.464 s / 1337.936 s = 30.978% Thursday, March 22, 12
  49. (cc) 2012 ForgeRock En Résumé - OpenDJ: Un serveur LDAP

    en Java, open source - Simple à installer et utiliser - Conçu pour de hautes performances et haute disponibilité - OpenDJ pour une version supportée (et améliorée) - Le paramètrage de la JVM et du GC est un Art - L'ingénierie des performances, un métier ! - Comprendre la JVM et les GCs est indispensable - Qui a dit que Java est lent ! Thursday, March 22, 12
  50. (cc) 2012 ForgeRock Maintenant... - Essayez OpenDJ: - http://www.opendj.org -

    IRC: #opendj on freenode.net - Participez ! Thursday, March 22, 12
  51. (cc) 2012 ForgeRock - Ludovic Poitou - [email protected] - Twitter:

    @LudoMP - Blog: http://ludopoitou.wordpress.com - https://plus.google.com/116489828651245331071 (gplus.to/ludomp) Concevoir un serveur ultra-performant en Java : l'expérience du projet OpenDJ Thursday, March 22, 12