SlideShare uma empresa Scribd logo
1 de 58
Baixar para ler offline
Concevoir un serveur
              ultra-performant en Java :
                l'expérience du projet
                       OpenDJ
    Ludovic Poitou
    Lyon JUG - 17/01/2012
                            (cc) 2012 ForgeRock

Wednesday, January 18, 12                         1
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
                                         (cc) 2012 ForgeRock      2
Wednesday, January 18, 12                                         2
- 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...
                                    (cc) 2012 ForgeRock

Wednesday, January 18, 12                                           3
Agenda

                    - Une présentation du project OpenDJ
                    - Performances et OpenDJ
                    - Performances et la JVM
                    - Conclusion



                                         (cc) 2012 ForgeRock

Wednesday, January 18, 12                                      4
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


                                                 (cc) 2012 ForgeRock

Wednesday, January 18, 12                                                  5
- Dérive d’OpenDS
                    - La seule branche activement développée en
                      open source
                    - Soutenue par la communauté
                    - Supporté par ForgeRock



                                         (cc) 2012 ForgeRock

Wednesday, January 18, 12                                         6
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
                                   (cc) 2012 ForgeRock

Wednesday, January 18, 12                                         7
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
                                    (cc) 2012 ForgeRock

Wednesday, January 18, 12                                     8
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


                                      (cc) 2012 ForgeRock

Wednesday, January 18, 12                                           9
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 !


                                            (cc) 2012 ForgeRock

Wednesday, January 18, 12                                             10
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
                                (cc) 2012 ForgeRock

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

                                        (cc) 2012 ForgeRock

Wednesday, January 18, 12                                              12
Performances & OpenDJ




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




                                                               Photo by http://www.flickr.com/photos/ooocha/
                                                        (cc) 2012 ForgeRock

Wednesday, January 18, 12                                                                                     13
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 ?                Photo par Roger Smith http://www.flickr.com/photos/rogersmith/



                 Maximum ?
                                        (cc) 2012 ForgeRock

Wednesday, January 18, 12                                                                                                14
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


                                         (cc) 2012 ForgeRock

Wednesday, January 18, 12                                      15
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

                                      (cc) 2012 ForgeRock

Wednesday, January 18, 12                                   16
Searchrate sur x4170




                                 (cc) 2012 ForgeRock

Wednesday, January 18, 12                              17
Modrate sur x4170




                                    (cc) 2012 ForgeRock

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


                                   (cc) 2012 ForgeRock

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

                                                                 (cc) 2012 ForgeRock

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

                                                                 (cc) 2012 ForgeRock

Wednesday, January 18, 12                                                                                21
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




                                                                 (cc) 2012 ForgeRock

Wednesday, January 18, 12                                                                                22
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

                                      (cc) 2012 ForgeRock

Wednesday, January 18, 12                                       23
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



                                                (cc) 2012 ForgeRock

Wednesday, January 18, 12                                             24
La JVM et les
                            Performances

                        “Tuning GC” est un art !



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

                                        (cc) 2012 ForgeRock

Wednesday, January 18, 12                                                               25
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)
                                     (cc) 2012 ForgeRock

Wednesday, January 18, 12                                  26
Gestion du Tas
                            (Pour Tous les GCs)
                            Young Generation


                            Old Generation



                            Permanent Generation


                                             (cc) 2012 ForgeRock

Wednesday, January 18, 12                                          27
Young Generation
                            Allocation (new Object())


                            Eden                   Survivor Spaces




                                             (cc) 2012 ForgeRock

Wednesday, January 18, 12                                            28
Old Generation
                                                           Promotion
                                                         (survivors from
                                                            the Young
                                                           Generation)




                                   (cc) 2012 ForgeRock

Wednesday, January 18, 12                                                  29
Permanent Generation




                            Permanent Generation
                                                  Allocation
                                         (only directly from the JVM)
                                           (cc) 2012 ForgeRock

Wednesday, January 18, 12                                               30
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/




                                      (cc) 2012 ForgeRock

Wednesday, January 18, 12                                                                                                   31
Conseil pour régler la
                     taille du tas de la JVM




                    LE PLUS GROS POSSIBLE
                                (cc) 2012 ForgeRock

Wednesday, January 18, 12                             32
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
                                          (cc) 2012 ForgeRock

Wednesday, January 18, 12                                                 33
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
                                     (cc) 2012 ForgeRock

Wednesday, January 18, 12                                           34
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


                                          (cc) 2012 ForgeRock

Wednesday, January 18, 12                                            35
Régler la “Young
                             Generation”




                                    (cc) 2012 ForgeRock

Wednesday, January 18, 12                                 36
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.
                                      (cc) 2012 ForgeRock

Wednesday, January 18, 12                                          37
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)
                                   (cc) 2012 ForgeRock

Wednesday, January 18, 12                                          38
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
                                    (cc) 2012 ForgeRock

Wednesday, January 18, 12                                        39
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

                                  (cc) 2012 ForgeRock

Wednesday, January 18, 12                                     40
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
                                     (cc) 2012 ForgeRock

Wednesday, January 18, 12                                           41
Garbage First




                                  (cc) 2012 ForgeRock

Wednesday, January 18, 12                               42
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
                                           (cc) 2012 ForgeRock

Wednesday, January 18, 12                                          43
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.
                                   (cc) 2012 ForgeRock

Wednesday, January 18, 12                                    44
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)



                                       (cc) 2012 ForgeRock

Wednesday, January 18, 12                                                45
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 ☹

                                    (cc) 2012 ForgeRock

Wednesday, January 18, 12                                     46
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


                                       (cc) 2012 ForgeRock

Wednesday, January 18, 12                                                47
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
                                                            (cc) 2012 ForgeRock

Wednesday, January 18, 12                                                                       48
Le Contrôle du GC
        - En direct:
          - VisualVM: http://visualvm.dev.java.net/
          - VisualGC:
                                                           Photo par Rennett Stowe http://www.flickr.com/photos/tomsaint/


            - 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

                                     (cc) 2012 ForgeRock

Wednesday, January 18, 12                                                                                           49
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!”

                                            (cc) 2012 ForgeRock

Wednesday, January 18, 12                                                    50
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
                                     (cc) 2012 ForgeRock

Wednesday, January 18, 12                                      51
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]


                                                                         (cc) 2012 ForgeRock

Wednesday, January 18, 12                                                                                                                  52
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

                                        (cc) 2012 ForgeRock

Wednesday, January 18, 12                                             53
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%


                                                            (cc) 2012 ForgeRock

Wednesday, January 18, 12                                                                                    54
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%
                                                            (cc) 2012 ForgeRock

Wednesday, January 18, 12                                                                                    55
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 !

                                      (cc) 2012 ForgeRock

Wednesday, January 18, 12                                              56
Maintenant...

        - Essayez OpenDJ:
             - http://www.opendj.org
             - IRC: #opendj on
               freenode.net
        - Participez !

                                       (cc) 2012 ForgeRock

Wednesday, January 18, 12                                    57
Concevoir un serveur
                    ultra-performant en Java :
                 l'expérience du projet OpenDJ
                    - Ludovic Poitou
                    - ludovic.poitou@ForgeRock.com
                    - Twitter: @LudoMP
                    - Blog: http://ludopoitou.wordpress.com
                    - https://plus.google.com/116489828651245331071
                      (gplus.to/ludomp)

                                           (cc) 2012 ForgeRock

Wednesday, January 18, 12                                             58

Mais conteúdo relacionado

Semelhante a Performances Java et OpenDJ - LyonJUG Janv. 2012

.NET Microframework, les joies de l'électronique et du code pour tous
.NET Microframework, les joies de l'électronique et du code pour tous.NET Microframework, les joies de l'électronique et du code pour tous
.NET Microframework, les joies de l'électronique et du code pour tousMicrosoft
 
SQL Server et infrastructure
SQL Server et infrastructureSQL Server et infrastructure
SQL Server et infrastructureDavid Barbarin
 
JavaScript aussi sur le serveur et jusque dans le cloud?
JavaScript aussi sur le serveur et jusque dans le cloud?JavaScript aussi sur le serveur et jusque dans le cloud?
JavaScript aussi sur le serveur et jusque dans le cloud?Microsoft
 
Server Side Javascript in the cloud
Server Side Javascript in the cloudServer Side Javascript in the cloud
Server Side Javascript in the cloudstefounet
 
JavaScript aussi sur le serveur et jusque dans le cloud?
JavaScript aussi sur le serveur et jusque dans le cloud?JavaScript aussi sur le serveur et jusque dans le cloud?
JavaScript aussi sur le serveur et jusque dans le cloud?benjguin
 
Etat de l'art Server-Side JavaScript - JS Geneve
Etat de l'art Server-Side JavaScript - JS GeneveEtat de l'art Server-Side JavaScript - JS Geneve
Etat de l'art Server-Side JavaScript - JS GeneveAlexandre Morgaut
 
OpenDS - Ludovic Poitou - December 2010
OpenDS - Ludovic Poitou - December 2010OpenDS - Ludovic Poitou - December 2010
OpenDS - Ludovic Poitou - December 2010JUG Lausanne
 
Présentation mongoDB et mongoId
Présentation mongoDB et mongoIdPrésentation mongoDB et mongoId
Présentation mongoDB et mongoIdvtabary
 
Stage de fin d’études – dotcloud
Stage de fin d’études – dotcloudStage de fin d’études – dotcloud
Stage de fin d’études – dotcloudJoffrey Fu Hrer
 
Stage de fin d’études – dotcloud
Stage de fin d’études – dotcloudStage de fin d’études – dotcloud
Stage de fin d’études – dotcloudJoffrey Fu Hrer
 
Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...
Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...
Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...Pierre Ternon
 
Les micro orm, alternatives à entity framework
Les micro orm, alternatives à entity frameworkLes micro orm, alternatives à entity framework
Les micro orm, alternatives à entity frameworkMSDEVMTL
 
La plateforme de services dynamiques OSGi
La plateforme de services dynamiques OSGiLa plateforme de services dynamiques OSGi
La plateforme de services dynamiques OSGiDidier Donsez
 
Presentation du SGBD Oracle DATABASE.pptx
Presentation du SGBD Oracle DATABASE.pptxPresentation du SGBD Oracle DATABASE.pptx
Presentation du SGBD Oracle DATABASE.pptxPriscilleGANKIA
 
Présentation Gradle au LyonJUG par Grégory Boissinot - Zenika
Présentation Gradle au LyonJUG par Grégory Boissinot - ZenikaPrésentation Gradle au LyonJUG par Grégory Boissinot - Zenika
Présentation Gradle au LyonJUG par Grégory Boissinot - ZenikaZenika
 
Migration vers Active Directory 2012 et 2012 R2 : les meilleures pratiques
Migration vers Active Directory 2012 et 2012 R2 : les meilleures pratiques Migration vers Active Directory 2012 et 2012 R2 : les meilleures pratiques
Migration vers Active Directory 2012 et 2012 R2 : les meilleures pratiques Microsoft Technet France
 

Semelhante a Performances Java et OpenDJ - LyonJUG Janv. 2012 (20)

.NET Microframework, les joies de l'électronique et du code pour tous
.NET Microframework, les joies de l'électronique et du code pour tous.NET Microframework, les joies de l'électronique et du code pour tous
.NET Microframework, les joies de l'électronique et du code pour tous
 
SQL Server et infrastructure
SQL Server et infrastructureSQL Server et infrastructure
SQL Server et infrastructure
 
JavaScript aussi sur le serveur et jusque dans le cloud?
JavaScript aussi sur le serveur et jusque dans le cloud?JavaScript aussi sur le serveur et jusque dans le cloud?
JavaScript aussi sur le serveur et jusque dans le cloud?
 
LyonJUG-2023-v1.0.pdf
LyonJUG-2023-v1.0.pdfLyonJUG-2023-v1.0.pdf
LyonJUG-2023-v1.0.pdf
 
Server Side Javascript in the cloud
Server Side Javascript in the cloudServer Side Javascript in the cloud
Server Side Javascript in the cloud
 
JavaScript aussi sur le serveur et jusque dans le cloud?
JavaScript aussi sur le serveur et jusque dans le cloud?JavaScript aussi sur le serveur et jusque dans le cloud?
JavaScript aussi sur le serveur et jusque dans le cloud?
 
Etat de l'art Server-Side JavaScript - JS Geneve
Etat de l'art Server-Side JavaScript - JS GeneveEtat de l'art Server-Side JavaScript - JS Geneve
Etat de l'art Server-Side JavaScript - JS Geneve
 
OpenDS Aquarium Paris
OpenDS Aquarium ParisOpenDS Aquarium Paris
OpenDS Aquarium Paris
 
Fusion io
Fusion ioFusion io
Fusion io
 
OpenDS - Ludovic Poitou - December 2010
OpenDS - Ludovic Poitou - December 2010OpenDS - Ludovic Poitou - December 2010
OpenDS - Ludovic Poitou - December 2010
 
Présentation mongoDB et mongoId
Présentation mongoDB et mongoIdPrésentation mongoDB et mongoId
Présentation mongoDB et mongoId
 
Stage de fin d’études – dotcloud
Stage de fin d’études – dotcloudStage de fin d’études – dotcloud
Stage de fin d’études – dotcloud
 
Stage de fin d’études – dotcloud
Stage de fin d’études – dotcloudStage de fin d’études – dotcloud
Stage de fin d’études – dotcloud
 
Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...
Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...
Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...
 
Stratégie OpenJDK
Stratégie OpenJDKStratégie OpenJDK
Stratégie OpenJDK
 
Les micro orm, alternatives à entity framework
Les micro orm, alternatives à entity frameworkLes micro orm, alternatives à entity framework
Les micro orm, alternatives à entity framework
 
La plateforme de services dynamiques OSGi
La plateforme de services dynamiques OSGiLa plateforme de services dynamiques OSGi
La plateforme de services dynamiques OSGi
 
Presentation du SGBD Oracle DATABASE.pptx
Presentation du SGBD Oracle DATABASE.pptxPresentation du SGBD Oracle DATABASE.pptx
Presentation du SGBD Oracle DATABASE.pptx
 
Présentation Gradle au LyonJUG par Grégory Boissinot - Zenika
Présentation Gradle au LyonJUG par Grégory Boissinot - ZenikaPrésentation Gradle au LyonJUG par Grégory Boissinot - Zenika
Présentation Gradle au LyonJUG par Grégory Boissinot - Zenika
 
Migration vers Active Directory 2012 et 2012 R2 : les meilleures pratiques
Migration vers Active Directory 2012 et 2012 R2 : les meilleures pratiques Migration vers Active Directory 2012 et 2012 R2 : les meilleures pratiques
Migration vers Active Directory 2012 et 2012 R2 : les meilleures pratiques
 

Mais de Ludovic Poitou

OpenDJ, life after Sun and OpenDS
OpenDJ, life after Sun and OpenDSOpenDJ, life after Sun and OpenDS
OpenDJ, life after Sun and OpenDSLudovic Poitou
 
Protection des applications Web avec OpenAM
Protection des applications Web avec OpenAMProtection des applications Web avec OpenAM
Protection des applications Web avec OpenAMLudovic Poitou
 
GC Tuning in the HotSpot Java VM - a FISL 10 Presentation
GC Tuning in the HotSpot Java VM - a FISL 10 PresentationGC Tuning in the HotSpot Java VM - a FISL 10 Presentation
GC Tuning in the HotSpot Java VM - a FISL 10 PresentationLudovic Poitou
 

Mais de Ludovic Poitou (6)

OpenDj Fossa2011
OpenDj Fossa2011OpenDj Fossa2011
OpenDj Fossa2011
 
OpenDJ, life after Sun and OpenDS
OpenDJ, life after Sun and OpenDSOpenDJ, life after Sun and OpenDS
OpenDJ, life after Sun and OpenDS
 
Is Ldap Dead ?
Is Ldap Dead ?Is Ldap Dead ?
Is Ldap Dead ?
 
Protection des applications Web avec OpenAM
Protection des applications Web avec OpenAMProtection des applications Web avec OpenAM
Protection des applications Web avec OpenAM
 
GC Tuning in the HotSpot Java VM - a FISL 10 Presentation
GC Tuning in the HotSpot Java VM - a FISL 10 PresentationGC Tuning in the HotSpot Java VM - a FISL 10 Presentation
GC Tuning in the HotSpot Java VM - a FISL 10 Presentation
 
OpenDS_Jazoon2010
OpenDS_Jazoon2010OpenDS_Jazoon2010
OpenDS_Jazoon2010
 

Performances Java et OpenDJ - LyonJUG Janv. 2012

  • 1. Concevoir un serveur ultra-performant en Java : l'expérience du projet OpenDJ Ludovic Poitou Lyon JUG - 17/01/2012 (cc) 2012 ForgeRock Wednesday, January 18, 12 1
  • 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 (cc) 2012 ForgeRock 2 Wednesday, January 18, 12 2
  • 3. - 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... (cc) 2012 ForgeRock Wednesday, January 18, 12 3
  • 4. Agenda - Une présentation du project OpenDJ - Performances et OpenDJ - Performances et la JVM - Conclusion (cc) 2012 ForgeRock Wednesday, January 18, 12 4
  • 5. 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 5
  • 6. - Dérive d’OpenDS - La seule branche activement développée en open source - Soutenue par la communauté - Supporté par ForgeRock (cc) 2012 ForgeRock Wednesday, January 18, 12 6
  • 7. 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 7
  • 8. 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 8
  • 9. 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 9
  • 10. 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 ! (cc) 2012 ForgeRock Wednesday, January 18, 12 10
  • 11. 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 11
  • 12. 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... (cc) 2012 ForgeRock Wednesday, January 18, 12 12
  • 13. Performances & OpenDJ Photo by http://www.flickr.com/photos/nuonsolarteam Photo by http://www.flickr.com/photos/ooocha/ (cc) 2012 ForgeRock Wednesday, January 18, 12 13
  • 14. 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 ? Photo par Roger Smith http://www.flickr.com/photos/rogersmith/ Maximum ? (cc) 2012 ForgeRock Wednesday, January 18, 12 14
  • 15. 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 15
  • 16. 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 16
  • 17. Searchrate sur x4170 (cc) 2012 ForgeRock Wednesday, January 18, 12 17
  • 18. Modrate sur x4170 (cc) 2012 ForgeRock Wednesday, January 18, 12 18
  • 19. 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 19
  • 20. 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. (cc) 2012 ForgeRock Wednesday, January 18, 12 20
  • 21. 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. (cc) 2012 ForgeRock Wednesday, January 18, 12 21
  • 22. 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 22
  • 23. 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 23
  • 24. 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 24
  • 25. La JVM et les Performances “Tuning GC” est un art ! Photo par Kecko http://www.flickr.com/people/kecko/ (cc) 2012 ForgeRock Wednesday, January 18, 12 25
  • 26. 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) (cc) 2012 ForgeRock Wednesday, January 18, 12 26
  • 27. Gestion du Tas (Pour Tous les GCs) Young Generation Old Generation Permanent Generation (cc) 2012 ForgeRock Wednesday, January 18, 12 27
  • 28. Young Generation Allocation (new Object()) Eden Survivor Spaces (cc) 2012 ForgeRock Wednesday, January 18, 12 28
  • 29. Old Generation Promotion (survivors from the Young Generation) (cc) 2012 ForgeRock Wednesday, January 18, 12 29
  • 30. Permanent Generation Permanent Generation Allocation (only directly from the JVM) (cc) 2012 ForgeRock Wednesday, January 18, 12 30
  • 31. 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/ (cc) 2012 ForgeRock Wednesday, January 18, 12 31
  • 32. Conseil pour régler la taille du tas de la JVM LE PLUS GROS POSSIBLE (cc) 2012 ForgeRock Wednesday, January 18, 12 32
  • 33. 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 33
  • 34. 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 34
  • 35. 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 35
  • 36. Régler la “Young Generation” (cc) 2012 ForgeRock Wednesday, January 18, 12 36
  • 37. 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. (cc) 2012 ForgeRock Wednesday, January 18, 12 37
  • 38. 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) (cc) 2012 ForgeRock Wednesday, January 18, 12 38
  • 39. 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 39
  • 40. 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 40
  • 41. 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 41
  • 42. Garbage First (cc) 2012 ForgeRock Wednesday, January 18, 12 42
  • 43. 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 43
  • 44. 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. (cc) 2012 ForgeRock Wednesday, January 18, 12 44
  • 45. 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) (cc) 2012 ForgeRock Wednesday, January 18, 12 45
  • 46. 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 ☹ (cc) 2012 ForgeRock Wednesday, January 18, 12 46
  • 47. 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 47
  • 48. 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 48
  • 49. Le Contrôle du GC - En direct: - VisualVM: http://visualvm.dev.java.net/ - VisualGC: Photo par Rennett Stowe http://www.flickr.com/photos/tomsaint/ - 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 49
  • 50. 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!” (cc) 2012 ForgeRock Wednesday, January 18, 12 50
  • 51. 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 51
  • 52. 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] (cc) 2012 ForgeRock Wednesday, January 18, 12 52
  • 53. 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 (cc) 2012 ForgeRock Wednesday, January 18, 12 53
  • 54. 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% (cc) 2012 ForgeRock Wednesday, January 18, 12 54
  • 55. 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% (cc) 2012 ForgeRock Wednesday, January 18, 12 55
  • 56. 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 ! (cc) 2012 ForgeRock Wednesday, January 18, 12 56
  • 57. Maintenant... - Essayez OpenDJ: - http://www.opendj.org - IRC: #opendj on freenode.net - Participez ! (cc) 2012 ForgeRock Wednesday, January 18, 12 57
  • 58. Concevoir un serveur ultra-performant en Java : l'expérience du projet OpenDJ - Ludovic Poitou - ludovic.poitou@ForgeRock.com - Twitter: @LudoMP - Blog: http://ludopoitou.wordpress.com - https://plus.google.com/116489828651245331071 (gplus.to/ludomp) (cc) 2012 ForgeRock Wednesday, January 18, 12 58