58
(cc) 2012 ForgeRock Concevoir un serveur ultra-performant en Java : l'expérience du projet OpenDJ Ludovic Poitou Lyon JUG - 17/01/2012 1 Wednesday, January 18, 12

Performances Java et OpenDJ - LyonJUG Janv. 2012

Embed Size (px)

DESCRIPTION

Presentation sur le projet OpenDJ et les performances en Java. Contient une description du fonctionnement de la JVM Hotspot et des divers GC, y compris G1.

Citation preview

(cc) 2012 ForgeRock

Concevoir un serveurultra-performant en Java :

l'expérience du projet OpenDJ

Ludovic Poitou

Lyon JUG - 17/01/2012

1Wednesday, January 18, 12

(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

2Wednesday, January 18, 12

(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...

3Wednesday, January 18, 12

(cc) 2012 ForgeRock

Agenda

- Une présentation du project OpenDJ

- Performances et OpenDJ

- Performances et la JVM

- Conclusion

4Wednesday, January 18, 12

(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

5Wednesday, January 18, 12

(cc) 2012 ForgeRock

- Dérive d’OpenDS

- La seule branche activement développée en open source

- Soutenue par la communauté

- Supporté par ForgeRock

6Wednesday, January 18, 12

(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

7Wednesday, January 18, 12

(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

8Wednesday, January 18, 12

(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

9Wednesday, January 18, 12

(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 !

10Wednesday, January 18, 12

(cc) 2012 ForgeRock

2.4- 2.4.0 en Decembre 2010, 2.4.4 en Octobre 2011- 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

11Wednesday, January 18, 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...

12Wednesday, January 18, 12

(cc) 2012 ForgeRock

Performances & OpenDJ

Photo by http://www.flickr.com/photos/nuonsolarteam

Photo by http://www.flickr.com/photos/ooocha/

13Wednesday, January 18, 12

(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/

14Wednesday, January 18, 12

(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

15Wednesday, January 18, 12

(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

16Wednesday, January 18, 12

(cc) 2012 ForgeRock

Searchrate sur x4170

17Wednesday, January 18, 12

(cc) 2012 ForgeRock

Modrate sur x4170

18Wednesday, January 18, 12

(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

19Wednesday, January 18, 12

(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.046238.0 46126.2 2.866 2.863 12.565 20.310 33.283 0.0 1.046563.7 46128.3 2.845 2.863 12.565 20.283 33.237 0.0 1.046374.9 46129.4 2.866 2.863 12.558 20.256 33.202 0.0 1.045679.3 46127.3 2.902 2.863 12.553 20.242 33.114 0.0 1.045951.9 46126.5 2.864 2.863 12.554 20.232 33.077 0.0 1.045549.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.

20Wednesday, January 18, 12

(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.013266.3 13145.3 2.408 2.431 173.597 251.477 324.444 0.012591.1 13143.2 2.539 2.431 178.187 251.988 347.243 0.013120.3 13142.9 2.435 2.431 178.403 252.563 347.559 0.012937.8 13140.0 2.469 2.432 178.540 252.418 347.559 0.013242.5 13141.4 2.413 2.431 178.533 252.230 347.549 0.013631.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.

21Wednesday, January 18, 12

(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.018037.6 17455.4 1.771 1.830 18.235 30.320 117.626 0.018041.9 17471.3 1.770 1.829 18.236 30.057 117.356 0.017339.9 17467.8 1.842 1.829 18.212 30.616 117.093 0.018067.1 17483.2 1.768 1.827 18.213 30.524 117.054 0.018002.4 17496.2 1.775 1.826 18.245 30.521 117.017 0.017309.5 17491.6 1.845 1.826 18.252 30.355 117.093 0.0

22Wednesday, January 18, 12

(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

23Wednesday, January 18, 12

(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

24Wednesday, January 18, 12

(cc) 2012 ForgeRock

La JVM et les Performances

“Tuning GC” est un art !

Photo par Kecko http://www.flickr.com/people/kecko/

25Wednesday, January 18, 12

(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)

26Wednesday, January 18, 12

(cc) 2012 ForgeRock

Gestion du Tas(Pour Tous les GCs)

Old Generation

Permanent Generation

Young Generation

27Wednesday, January 18, 12

(cc) 2012 ForgeRock

Young Generation

Allocation (new Object())

Survivor SpacesEden

28Wednesday, January 18, 12

(cc) 2012 ForgeRock

Old Generation

Promotion(survivors from

the Young Generation)

29Wednesday, January 18, 12

(cc) 2012 ForgeRock

Permanent Generation

Allocation(only directly from the JVM)

Permanent Generation

30Wednesday, January 18, 12

(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/

31Wednesday, January 18, 12

(cc) 2012 ForgeRock

Conseil pour régler la taille du tas de la JVM

LE PLUS GROS POSSIBLE

32Wednesday, January 18, 12

(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

33Wednesday, January 18, 12

(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

34Wednesday, January 18, 12

(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

35Wednesday, January 18, 12

(cc) 2012 ForgeRock

Régler la “Young Generation”

36Wednesday, January 18, 12

(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.

37Wednesday, January 18, 12

(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)

38Wednesday, January 18, 12

(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

39Wednesday, January 18, 12

(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

40Wednesday, January 18, 12

(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

41Wednesday, January 18, 12

(cc) 2012 ForgeRock

Garbage First

42Wednesday, January 18, 12

(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

43Wednesday, January 18, 12

(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.

44Wednesday, January 18, 12

(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)

45Wednesday, January 18, 12

(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 ☹

46Wednesday, January 18, 12

(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

47Wednesday, January 18, 12

(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.016305.4 16372.4 1.960 1.952 18.966 28.160 57.163 0.016695.9 16375.1 1.911 1.951 18.941 28.123 59.249 0.016463.6 16375.8 1.943 1.951 18.927 28.104 59.924 0.0CMS: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

48Wednesday, January 18, 12

(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/

49Wednesday, January 18, 12

(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!”

50Wednesday, January 18, 12

(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

51Wednesday, January 18, 12

(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]

52Wednesday, January 18, 12

(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

53Wednesday, January 18, 12

(cc) 2012 ForgeRock

PrintGCStats Parallel GC

- what count total mean max stddevgen0t(s) 193 11.470 0.05943 0.687 0.0633gen1t(s) 1 7.350 7.34973 7.350 0.0000GC(s) 194 18.819 0.09701 7.350 0.5272alloc(MB) 193 11244.609 58.26222 100.875 18.8519promo(MB) 193 807.236 4.18257 96.426 9.9291used0(MB) 193 16018.930 82.99964 114.375 17.4899used1(MB) 1 635.896 635.89648 635.896 0.0000used(MB) 194 91802.213 473.20728 736.490 87.8376commit0(MB) 193 17854.188 92.50874 114.500 9.8209commit1(MB) 193 123520.000 640.00000 640.000 0.0000commit(MB) 193 141374.188 732.50874 754.500 9.8209

alloc/elapsed_time = 11244.609 MB / 77.237 s = 145.586 MB/salloc/tot_cpu_time = 11244.609 MB / 1235.792 s = 9.099 MB/salloc/mut_cpu_time = 11244.609 MB / 934.682 s = 12.030 MB/spromo/elapsed_time = 807.236 MB / 77.237 s = 10.451 MB/spromo/gc0_time = 807.236 MB / 11.470 s = 70.380 MB/sgc_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%

54Wednesday, January 18, 12

(cc) 2012 ForgeRock

PrintGCStats CMS- what count total mean max stddev

gen0(s) 110 24.381 0.22164 1.751 0.2038gen0t(s) 110 24.397 0.22179 1.751 0.2038cmsIM(s) 3 0.285 0.09494 0.108 0.0112cmsRM(s) 3 0.092 0.03074 0.032 0.0015GC(s) 113 24.774 0.21924 1.751 0.2013cmsCM(s) 3 2.459 0.81967 0.835 0.0146cmsCP(s) 6 0.971 0.16183 0.191 0.0272cmsCS(s) 3 14.620 4.87333 4.916 0.0638cmsCR(s) 3 0.036 0.01200 0.016 0.0035alloc(MB) 110 11275.000 102.50000 102.500 0.0000promo(MB) 110 1322.718 12.02471 104.608 11.8770used0(MB) 110 12664.750 115.13409 115.250 1.2157used(MB) 110 56546.542 514.05947 640.625 91.5858commit0(MB) 110 12677.500 115.25000 115.250 0.0000commit1(MB) 110 70400.000 640.00000 640.000 0.0000commit(MB) 110 83077.500 755.25000 755.250 0.0000

alloc/elapsed_time = 11275.000 MB / 83.621 s = 134.835 MB/salloc/tot_cpu_time = 11275.000 MB / 1337.936 s = 8.427 MB/salloc/mut_cpu_time = 11275.000 MB / 923.472 s = 12.209 MB/spromo/elapsed_time = 1322.718 MB / 83.621 s = 15.818 MB/spromo/gc0_time = 1322.718 MB / 24.397 s = 54.217 MB/sgc_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%

55Wednesday, January 18, 12

(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 !

56Wednesday, January 18, 12

(cc) 2012 ForgeRock

Maintenant...

- Essayez OpenDJ:

- http://www.opendj.org

- IRC: #opendj onfreenode.net

- Participez !

57Wednesday, January 18, 12

(cc) 2012 ForgeRock

- Ludovic Poitou

- [email protected]

- Twitter : @LudoMP

- Blog: http://ludopoitou.wordpress.com

- https://plus.google.com/116489828651245331071(gplus.to/ludomp)

Concevoir un serveurultra-performant en Java :

l'expérience du projet OpenDJ

58Wednesday, January 18, 12