SlideShare uma empresa Scribd logo
1 de 61
Baixar para ler offline
CONCEVOIR UN SERVEUR
ULTRA-PERFORMANT EN JAVA :
L'EXPÉRIENCE DU PROJET
OPENDS
Ludovic Poitou

Friday, December 10, 2010

1
QUI SUIS-JE ?
• Ludovic

Poitou

• Product

Manager à ForgeRock

• Précédemment Architecte

chez Sun et “Community
Manager” pour le projet OpenDS

• Plus

de 14 ans d'expérience avec LDAP

• Architecte

de Sun Directory Server 5.2 / 6

2
• http://ludopoitou.wordpress.com
Friday, December 10, 2010

2
• ForgeRock AS
• Editeur

- Février 2010 - Norvège

de logiciels open source

• OpenAM
• ForgeRock
• Centre

(ex-OpenSSO), OpenIDM, OpenDJ (OpenDS) ...

France SAS - Novembre 2010

de Recherche & Développement à Grenoble

• UK, USA, Brésil, Allemagne, Suède...
Friday, December 10, 2010

3
AGENDA
• Une

présentation du projet OpenDS

• Modèles

de conceptions et réflexions sur la notion de
performance

• La

JVM et les performances

• Conclusion

Friday, December 10, 2010

4
LE PROJET OPENDS
• Lancé

en Open Source en July 2006

• CDDL
• Code

source : https://opends.dev.java.net/

• Sponsorisé
• Ecrit

par Sun Microsystems / Oracle

en Java par des experts LDAP

Friday, December 10, 2010

5
QU'EST CE ?
• OpenDS

est un server en Java qui implémente le protocol
LDAPv3 et ses services

• Il

inclut sa propre base de données,

• basé
• Pas

sur Berkeley DB Java Edition

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

Friday, December 10, 2010

6
POURQUOI FAIRE ?
• Stockage
• Pages

générique et orienté objet de données

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é
• Le

par l'infrastructure Web et Mail

fondement des produits de gestion d'Identité

• Gestion
Friday, December 10, 2010

d'Access, Fédération, Provisionnage
7
LES OBJECTIFS DU PROJET
OPENDS
• 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
• Capacité

aux standards et extensions LDAPv3

de croissance horizontale et verticale

• Utiliser

le code d'OpenDS pour le produit Oracle Directory
Server Enterprise Edition

Friday, December 10, 2010

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

Friday, December 10, 2010

9
OPENDS 2.2
• Disponible
• Un

depuis Décembre 2009

serveur d'annuaire 100% conforme à LDAPv3

• Nombreuses
• Réplication

données

• Fonctions

extensions LDAP standards et expérimentales

Multi Maitre, avec 3 niveaux de cohérence des

étendues de Sécurité

• S'installe

en 6 clics et moins de 3 minutes

• Gestion

par outils graphiques et textes

• Documentation
Friday, December 10, 2010

complète sur le Wiki
10
• Dérive

d’OpenDS

• Version
• Plus

2.4 la semaine prochaine

de 10 nouvelles fonctionnalités

• Un

grand nombre de correctifs

• De

meilleures performances

Friday, December 10, 2010

11
POUR QUI ?
• Les

opérateurs Télécom, le secteur financier, les portails

• Pour
• De
• Pour

stocker les identités des clients, téléphones et services

15 à 120 millions d'entrées, hautement disponibles
le service de Nommage, ou les PME

• OpenSolaris, Solaris, Linux..., couplé

avec Kerberos

• Pages
Friday, December 10, 2010

avec SAMBA, Intégré

blanches...
12
CARACTÉRISTIQUES DE
PERFORMANCES
• Comme

priment

• Jusqu'à

tout serveur, les capacités de montée en charge
plusieurs dizaines de millions d'entrées

• Plusieurs
• Quel
• Quel

Friday, December 10, 2010

milliers de connections

débit d'opérations?
Photo par Roger Smith http://www.flickr.com/photos/rogersmith/

temps de réponse moyen ? Maximum ?

13
ENVIRONNEMENT DE TEST

• OpenDS
• Le

2.2, Solaris 10, ZFS

test de base :

• 10

M d'entrées, taille moyenne 2,6K

• Réplication

Friday, December 10, 2010

multi-maitre entre 2 serveurs

14
LES RÉGLAGES DU TEST
• config.ldif
• ds-cfg-db-log-file-max: 100

MB

• ds-cfg-db-cache-percent: 70-80
• ds-cfg-db-checkpointer-bytes-interval: 100

MB

• ds-cfg-etime-resolution: nanoseconds
• ds-cfg-num-request-handlers: 4
• Replication
Friday, December 10, 2010

ON
15
SEARCHRATE SUR X4170

Friday, December 10, 2010

16
MODRATE SUR X4170

Friday, December 10, 2010

17
REFLEXIONS SUR LA
CONCEPTION

Photo par Jean-Pierre Dalbera http://www.flickr.com/people/dalbera/

Friday, December 10, 2010

18
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

Friday, December 10, 2010

19
PERFORMANCE VS
PARALLELISME
• Impact

des performances sur le parallelisme

• Code

sérialisé crée des points de contentions

• Manque
• Impact

de ressources

du parallelisme sur les performances

• L'utilisation

de plus de ressources conduit à plus de
contention et impacte les performances

• Réglage
Friday, December 10, 2010

du goulet d'étranglement
20
ATTENTION AUX SECTIONS
CRITIQUES
• Essayer

de minimiser le temps passé en section critique

• Mais

la bande passante est limitée par le temps passé dans la
plus grosse section critique
• Exemple
• 200
• 20

000 opérations sur processeur x64

000 sur processor T2000

• Utilisée
Friday, December 10, 2010

: LinkedBlockingQueue

pour la WorkQueue et les Access Logs
21
LE CACHE D'ENTRÉES
• Un

cache pour réduire les accès disques

• L'éviction
• Un

du cache rajoute du travail au GC

cache global est point de contention

• Cacher

uniquement des objets qui vont être réutilisés (et pas
peut-être)

• Utiliser
Friday, December 10, 2010

un cache “thread local”, mais attention aux coûts !
22
LE MONITORING DU SERVEUR
• Les

statistiques sont indispensables

• Mais

attention à la contention

• Ecritures
• Lecture

fréquentes (update stats)

beaucoup moins

• Une

stratégie est de garder des statistiques par thread et de
les collecter sur demande

• Pas

encore implémenté dans OpenDS !

Friday, December 10, 2010

23
PATTERNS
• Utilisation

des I/O asynchrones

• Utilisation

d'Objets Immuables

• Thread
• Less

code

• Utilisation
• Evite
• Avec

des “Static Factories” au lieu de Constructeurs

la création d'objets

• Permet

Friday, December 10, 2010

safe

des optimisations

des objet immuables.
24
PATTERNS

• Producteurs

/ Consommateurs

• Queues
• Pool

de Threads

• Monitors

Friday, December 10, 2010

25
ANTI-PATTERNS
• Manipulation
• Il

faut utiliser “StringBuilder”

• Le

compilateur optimise aussi “Aaa” + “Bbb”

• Eviter
• Ne

les grandes méthodes (Milliers de lignes de code)

pas exposer la représentation concrète d'un objet

• Set
• Ne

de chaines (String)

vs LinkedHashSet

pas définir plus de méthodes que nécessaires

Friday, December 10, 2010

26
COLLECTIONS JAVA
• Vector

et Hashtable sont synchronisés (toutes les méthodes)
=> Un cout à payer, même avec un seul thread

• Certaines

classes ne sont pas synchronisées par défaut

• ArrayList, LinkedList
• HashSet, HashMap

replacent Vector

replacent Hashtable

• Pour

synchroniser: Enrober dans une classe.
Par une méthode “static factory”
Collections.synchronizedList(new ArrayList())

• ConcurrentHashMap, pour
• Mais
Friday, December 10, 2010

la concurrence

attention à l'itérateur
27
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

Friday, December 10, 2010

de 10GB ethernet

28
LA JVM ET LES PARAMÈTRES
DES PERFORMANCES
“Tuning GC” est un art !

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

Friday, December 10, 2010

29
GC DANS LA JVM HOTSPOT

•3

GCs disponibles:

• Serial

GC

• Parallel

GC / Parallel Old GC

• Concurrent
• Et

Mark-Sweep GC (CMS)

bientôt Garbage First (G1)

Friday, December 10, 2010

30
GESTION DU TAS
(POUR TOUS LES GCS)
Young Generation
Old Generation

Permanent Generation

Friday, December 10, 2010

31
YOUNG GENERATION
Allocation (new Object())

Eden

Friday, December 10, 2010

Survivor Spaces

32
OLD GENERATION
Promotion
(survivors from
the Young
Generation)

Friday, December 10, 2010

33
PERMANENT GENERATION

Permanent Generation

Allocation
(only directly from the JVM)

Friday, December 10, 2010

34
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
Photo par Craig Gorcott http://www.flickr.com/photos/craigweb/

• Malheureusement, vous

Friday, December 10, 2010

ne pouvez en choisir que 2 !

35
CONSEIL POUR REGLER LA
TAILLE DU TAS DE LA JVM

LE PLUS GROS POSSIBLE
Friday, December 10, 2010

36
UN EQUILIBRE A TROUVER
• Généralement, plus
• Valable

gros est l’espace mémoire, le mieux c’est !

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

Friday, December 10, 2010

37
L’IMPACT DES TAILLES DES
GENERATIONS
• 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
Friday, December 10, 2010

la fréquence des GCs majeurs le plus possible
38
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

Friday, December 10, 2010

39
REGLER LA “YOUNG
GENERATION”

Friday, December 10, 2010

40
DIMENSIONER LA TAILLE
MEMOIRE
• -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.

Friday, December 10, 2010

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

Friday, December 10, 2010

42
DIMENSIONNER LES ESPACES
MEMOIRES
• -XX:NewSize=<size>

: Taille initiale de la “Young generation”

• -XX:MaxNewSize=<size>

generation”

• -XX:NewRatio=<ratio>

“old generation”

: Taille maximale de la “Young

: Ratio entre “young generation” et

• Pour

contrôler les performances, préférer -Xmn qui combine
-XX:NewSize et -XX:MaxNewSize

Friday, December 10, 2010

43
TENURING
• -XX:TargetSurvivorRatio=<%>, e.g., 50
• Pourcentage
• Laisser

d’occupation de l’espace “Survivor”

de l’espace pour gérer les pics

• -XX:InitialTenuringThreshold=<threshold>
• -XX:MaxTenuringThreshold=<threshold>
• -XX:+AlwaysTenure
• -XX:+NeverTenure
Friday, December 10, 2010

- Ne rien garder dans les “Survivor”
- Une très mauvaise idée
44
TENURING : AVANTAGES &
INCONVENIENTS
• 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
• Un

le cout des GCs mineurs

équilibre difficile à trouver

• Généralement, il
Friday, December 10, 2010

vaut mieux copier que promouvoir
45
GARBAGE FIRST

Friday, December 10, 2010

46
LE GC GARBAGE FIRST (G1)
• Nouveauté

de la VM Java HotSpot dans JDK 7

• Une

version experimentale de G1 est dans Java SE 6 depuis la
version mineur 14

• G1

est vu comme le replacement à long terme du GC
“Concurrent Mark-Sweep” (CMS)

• Toujours

Friday, December 10, 2010

expérimental dans Java SE 6 Update 23 ☹
47
CARACTERISTIQUES 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.

Friday, December 10, 2010

48
G1: LES OPTIONS DE LA JVM
• -XX:+UnlockExperimentalVMOptions

-XX:+UseG1GC

• Temps

de pause (pas garanti, sinon utiliser Java Temps Réel)

• -XX:MaxGCPauseMillis=50

(objectif de 50 millisecondes)

• -XX:GCPauseIntervalMillis=1000
• Dimension:

(objectif de 1000 msecs)

-XX:+G1YoungGenSize=512m

• Parallélisme:
• -XX:+G1ParallelRSetUpdatingEnabled
• -XX:+G1ParallelRSetScanningEnabled
Friday, December 10, 2010

49
OPENDS ET CMS
• Les

options

• CMS

+ Occupency

• NewGenSize

= ¼ de la taille mémoire (jusqu’à 2GB)

• MaxTenuringThreshold
• Temps
• Mais

=1

de pause maximum GC mineur ~ 100ms

Full GC en écriture ! 10 seconds ☹

Friday, December 10, 2010

50
OPENDS ET G1
• Objectif: Eviter
• Collaboration
• OpenDS
• Entre

tests

le GC Complet, meilleur contrôle des pauses

entre les équipes HotSpot et OpenDS

est utilisé comme application de référence

20 et 30 améliorations integrées dans G1 suite aux

• Améliorations

par 10 des performances de G1 avec de
grandes zones mémoires

Friday, December 10, 2010

51
LE CONTROLE 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
• Peut
•A

est aussi un module extension de VisualVM

surveiller plusieurs VM dans le même outil

posteriori

• GC

Logging, PrintGCStats, GChisto

Friday, December 10, 2010

52
LE JOURNAL DU GC ACTIVÉ
EN PRODUCTION
• Activer
• Très
• Coût

le journal du GC en production sans crainte

utile pour analyser, diagnostiquer un problème

en performance extrêmement faible

• Peut-être
• Il

quelques gros fichiers à gérer

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

Friday, December 10, 2010

53
PARAMETRES POUR LE
JOURNAL DU GC
• -XX:+PrintGCTimeStamps
• Ajouter

-XX:+PrintGCDateStamps si besoin

• -XX:+PrintGCDetails
• Donne
• Mais

plus de détails que -verbosegc

aussi:

• -Xloggc:<fichier>
• Permet

de séparer les sorties du GC de celles de
l’application

Friday, December 10, 2010

54
PRINTGCSTATS
• Analyse
• Un

et résume les journaux du GC

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

Friday, December 10, 2010

55
PRINTGCSTATS PARALLEL GC
•

what
gen0t(s)
gen1t(s)
GC(s)
alloc(MB)
promo(MB)
used0(MB)
used1(MB)
used(MB)
commit0(MB)
commit1(MB)
commit(MB)

count
193
1
194
193
193
193
1
194
193
193
193

alloc/elapsed_time
alloc/tot_cpu_time
alloc/mut_cpu_time
promo/elapsed_time
promo/gc0_time
gc_seq_load
gc_conc_load
gc_tot_load
Friday, December 10, 2010

total
11.470
7.350
18.819
11244.609
807.236
16018.930
635.896
91802.213
17854.188
123520.000
141374.188
=
=
=
=
=
=
=
=

11244.609
11244.609
11244.609
807.236
807.236
301.110
0.000
301.110

mean
0.05943
7.34973
0.09701
58.26222
4.18257
82.99964
635.89648
473.20728
92.50874
640.00000
732.50874
MB
MB
MB
MB
MB
s
s
s

/
/
/
/
/
/
/
/

77.237
1235.792
934.682
77.237
11.470
1235.792
1235.792
1235.792

max
0.687
7.350
7.350
100.875
96.426
114.375
635.896
736.490
114.500
640.000
754.500
s
s
s
s
s
s
s
s

stddev
0.0633
0.0000
0.5272
18.8519
9.9291
17.4899
0.0000
87.8376
9.8209
0.0000
9.8209

= 145.586 MB/s
=
9.099 MB/s
= 12.030 MB/s
= 10.451 MB/s
= 70.380 MB/s
= 24.366%
=
0.000%
= 24.366%
56
PRINTGCSTATS CMS
•

what
gen0(s)
gen0t(s)
cmsIM(s)
cmsRM(s)
GC(s)
cmsCM(s)
cmsCP(s)
cmsCS(s)
cmsCR(s)
alloc(MB)
promo(MB)
used0(MB)
used(MB)
commit0(MB)
commit1(MB)
commit(MB)

count
110
110
3
3
113
3
6
3
3
110
110
110
110
110
110
110

alloc/elapsed_time
alloc/tot_cpu_time
alloc/mut_cpu_time
promo/elapsed_time
promo/gc0_time
gc_seq_load
gc_conc_load
gc_tot_load
Friday, December 10, 2010

total
24.381
24.397
0.285
0.092
24.774
2.459
0.971
14.620
0.036
11275.000
1322.718
12664.750
56546.542
12677.500
70400.000
83077.500
=
=
=
=
=
=
=
=

11275.000
11275.000
11275.000
1322.718
1322.718
396.378
18.086
414.464

mean
0.22164
0.22179
0.09494
0.03074
0.21924
0.81967
0.16183
4.87333
0.01200
102.50000
12.02471
115.13409
514.05947
115.25000
640.00000
755.25000
MB
MB
MB
MB
MB
s
s
s

/
/
/
/
/
/
/
/

83.621
1337.936
923.472
83.621
24.397
1337.936
1337.936
1337.936

max
1.751
1.751
0.108
0.032
1.751
0.835
0.191
4.916
0.016
102.500
104.608
115.250
640.625
115.250
640.000
755.250
s
s
s
s
s
s
s
s

stddev
0.2038
0.2038
0.0112
0.0015
0.2013
0.0146
0.0272
0.0638
0.0035
0.0000
11.8770
1.2157
91.5858
0.0000
0.0000
0.0000

= 134.835 MB/s
=
8.427 MB/s
= 12.209 MB/s
= 15.818 MB/s
= 54.217 MB/s
= 29.626%
=
1.352%
= 30.978%
57
GCHISTO
• Pour

une visualisation graphique des journaux du GC

• Développement
• Affiche
• Open
• Peut

démarré en 2008 (mais arrêté ?)

uniquement les temps de pause

source sur Java.net : http://gchisto.dev.java.net/

ne pas marcher avec certains paramètres du log du GC

Friday, December 10, 2010

58
EN RÉSUMÉ
• OpenDS: Un

serveur LDAP en Java, open source

• Simple

à installer et utiliser

• Conçu

pour de hautes performances et haute disponibilité

• OpenDJ
• Le

pour une version supportée (et améliorée)

paramètrage de la JVM et du GC est un Art

• L'ingénierie

des performances, un métier !

• Comprendre
• Qui

la JVM et les GCs est indispensable

a dit que Java est lent !

Friday, December 10, 2010

59
MAINTENANT...

• Essayez

OpenDJ:

• http://www.opendj.org
• IRC: #opendj
• Participez

Friday, December 10, 2010

on freenode.net

!

60
Concevoir un serveur
ultra-performant en Java :
l'expérience du projet OpenDS

• Ludovic

Poitou

• ludovic.poitou@ForgeRock.com
• Twitter: @LudoMP
• Blog: http://ludopoitou.wordpress.com

Friday, December 10, 2010

61

Mais conteúdo relacionado

Mais procurados

Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016Fabien Arcellier
 
Architecture d'annuaire hautement disponible avec OpenLDAP
Architecture d'annuaire hautement disponible avec OpenLDAPArchitecture d'annuaire hautement disponible avec OpenLDAP
Architecture d'annuaire hautement disponible avec OpenLDAPLINAGORA
 
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cacheMeetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cacheAurelien Navarre
 
Hadoop and friends : introduction
Hadoop and friends : introductionHadoop and friends : introduction
Hadoop and friends : introductionfredcons
 
Hadoop et son écosystème - v2
Hadoop et son écosystème - v2Hadoop et son écosystème - v2
Hadoop et son écosystème - v2Khanh Maudoux
 
Presentation Zabbix en Français du 6 Juin 2013
Presentation Zabbix en Français du 6 Juin 2013Presentation Zabbix en Français du 6 Juin 2013
Presentation Zabbix en Français du 6 Juin 2013Alain Ganuchaud
 

Mais procurados (17)

Sentry
SentrySentry
Sentry
 
Mongo DB
Mongo DBMongo DB
Mongo DB
 
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
 
WordPress Jurassique
WordPress JurassiqueWordPress Jurassique
WordPress Jurassique
 
Architecture d'annuaire hautement disponible avec OpenLDAP
Architecture d'annuaire hautement disponible avec OpenLDAPArchitecture d'annuaire hautement disponible avec OpenLDAP
Architecture d'annuaire hautement disponible avec OpenLDAP
 
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cacheMeetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
 
Hadoop and friends : introduction
Hadoop and friends : introductionHadoop and friends : introduction
Hadoop and friends : introduction
 
Ansib formation-ansible
Ansib formation-ansibleAnsib formation-ansible
Ansib formation-ansible
 
Hadoop unit
Hadoop unitHadoop unit
Hadoop unit
 
Squid squid guard
Squid squid guardSquid squid guard
Squid squid guard
 
Chiffrer et sécuriser MariaDB
Chiffrer et sécuriser MariaDBChiffrer et sécuriser MariaDB
Chiffrer et sécuriser MariaDB
 
Haute Disponibilité et Disaster Recovery
Haute Disponibilité et Disaster RecoveryHaute Disponibilité et Disaster Recovery
Haute Disponibilité et Disaster Recovery
 
Tech day hadoop, Spark
Tech day hadoop, SparkTech day hadoop, Spark
Tech day hadoop, Spark
 
Hadoop et son écosystème - v2
Hadoop et son écosystème - v2Hadoop et son écosystème - v2
Hadoop et son écosystème - v2
 
Le nouveau AMP : apache mariadb php
Le nouveau AMP : apache mariadb phpLe nouveau AMP : apache mariadb php
Le nouveau AMP : apache mariadb php
 
Presentation Zabbix en Français du 6 Juin 2013
Presentation Zabbix en Français du 6 Juin 2013Presentation Zabbix en Français du 6 Juin 2013
Presentation Zabbix en Français du 6 Juin 2013
 
Hadoop unit
Hadoop unitHadoop unit
Hadoop unit
 

Destaque

Introduction à Google Web Toolkit (GWT) - Philippe Kernevez - February 2009
Introduction à Google Web Toolkit (GWT) - Philippe Kernevez - February 2009Introduction à Google Web Toolkit (GWT) - Philippe Kernevez - February 2009
Introduction à Google Web Toolkit (GWT) - Philippe Kernevez - February 2009JUG Lausanne
 
Presentacionubuntu
PresentacionubuntuPresentacionubuntu
Presentacionubuntujavier181920
 
Rey banquedefrance 11-2014
Rey banquedefrance 11-2014Rey banquedefrance 11-2014
Rey banquedefrance 11-2014Macropru Reader
 
Dossier de production version2 ameliorée
Dossier de production version2 amelioréeDossier de production version2 ameliorée
Dossier de production version2 amelioréesteph95000
 
Relato biográfico gímbler perdomo zamora
Relato biográfico gímbler perdomo zamoraRelato biográfico gímbler perdomo zamora
Relato biográfico gímbler perdomo zamoraBerly Z.
 
Innovation sociale : développer l'esprit d'entreprendre un nouvel enjeu pour ...
Innovation sociale : développer l'esprit d'entreprendre un nouvel enjeu pour ...Innovation sociale : développer l'esprit d'entreprendre un nouvel enjeu pour ...
Innovation sociale : développer l'esprit d'entreprendre un nouvel enjeu pour ...Yann Alexandre Soubaï
 
Dossier de production
Dossier de production Dossier de production
Dossier de production Johanna Lry
 
Gestion tecnologic a 2
Gestion tecnologic a 2Gestion tecnologic a 2
Gestion tecnologic a 2MIGUEL ANGEL
 
Diapositivas sustentacion
Diapositivas sustentacionDiapositivas sustentacion
Diapositivas sustentacionvalegsalazar1
 
Palindrome - JFTL2014 - Mais quelle qualité voulons-nous?
Palindrome - JFTL2014 - Mais quelle qualité voulons-nous?Palindrome - JFTL2014 - Mais quelle qualité voulons-nous?
Palindrome - JFTL2014 - Mais quelle qualité voulons-nous?Olivier Denoo
 

Destaque (20)

Introduction à Google Web Toolkit (GWT) - Philippe Kernevez - February 2009
Introduction à Google Web Toolkit (GWT) - Philippe Kernevez - February 2009Introduction à Google Web Toolkit (GWT) - Philippe Kernevez - February 2009
Introduction à Google Web Toolkit (GWT) - Philippe Kernevez - February 2009
 
Presentacionubuntu
PresentacionubuntuPresentacionubuntu
Presentacionubuntu
 
Rey banquedefrance 11-2014
Rey banquedefrance 11-2014Rey banquedefrance 11-2014
Rey banquedefrance 11-2014
 
Dossier de production version2 ameliorée
Dossier de production version2 amelioréeDossier de production version2 ameliorée
Dossier de production version2 ameliorée
 
My favourite sport
My favourite sportMy favourite sport
My favourite sport
 
Relato biográfico gímbler perdomo zamora
Relato biográfico gímbler perdomo zamoraRelato biográfico gímbler perdomo zamora
Relato biográfico gímbler perdomo zamora
 
Innovation sociale : développer l'esprit d'entreprendre un nouvel enjeu pour ...
Innovation sociale : développer l'esprit d'entreprendre un nouvel enjeu pour ...Innovation sociale : développer l'esprit d'entreprendre un nouvel enjeu pour ...
Innovation sociale : développer l'esprit d'entreprendre un nouvel enjeu pour ...
 
Roxy
RoxyRoxy
Roxy
 
Carnestoltes 2015 PRIMER
Carnestoltes 2015 PRIMERCarnestoltes 2015 PRIMER
Carnestoltes 2015 PRIMER
 
L'ecole
L'ecoleL'ecole
L'ecole
 
Lenguaje de programación
Lenguaje de programaciónLenguaje de programación
Lenguaje de programación
 
Dossier de production
Dossier de production Dossier de production
Dossier de production
 
Situacion problema de taller de historia
Situacion problema de taller de historiaSituacion problema de taller de historia
Situacion problema de taller de historia
 
Polimorfismo2015c1
Polimorfismo2015c1Polimorfismo2015c1
Polimorfismo2015c1
 
Plaquette Comarch ERP
Plaquette Comarch ERPPlaquette Comarch ERP
Plaquette Comarch ERP
 
Un/Une
Un/UneUn/Une
Un/Une
 
Cars 3
Cars 3Cars 3
Cars 3
 
Gestion tecnologic a 2
Gestion tecnologic a 2Gestion tecnologic a 2
Gestion tecnologic a 2
 
Diapositivas sustentacion
Diapositivas sustentacionDiapositivas sustentacion
Diapositivas sustentacion
 
Palindrome - JFTL2014 - Mais quelle qualité voulons-nous?
Palindrome - JFTL2014 - Mais quelle qualité voulons-nous?Palindrome - JFTL2014 - Mais quelle qualité voulons-nous?
Palindrome - JFTL2014 - Mais quelle qualité voulons-nous?
 

Semelhante a OpenDS - Ludovic Poitou - December 2010

JSS2013 : Haute disponibilité
JSS2013 : Haute disponibilitéJSS2013 : Haute disponibilité
JSS2013 : Haute disponibilitéChristophe Laporte
 
Cloud Azure -- Services de données et bonnes pratiques
Cloud Azure -- Services de données et bonnes pratiques Cloud Azure -- Services de données et bonnes pratiques
Cloud Azure -- Services de données et bonnes pratiques Microsoft Technet France
 
Windows Azure : Services de données et bonnes pratiques
Windows Azure : Services de données et bonnes pratiquesWindows Azure : Services de données et bonnes pratiques
Windows Azure : Services de données et bonnes pratiquesMCKLMT
 
Conteneurs Linux ou Windows : quelles approches pour des IT agiles ?
Conteneurs Linux ou Windows : quelles approches pour des IT agiles ?Conteneurs Linux ou Windows : quelles approches pour des IT agiles ?
Conteneurs Linux ou Windows : quelles approches pour des IT agiles ?Microsoft
 
Meetup Google Cloud
Meetup Google CloudMeetup Google Cloud
Meetup Google CloudPierre Coste
 
Au cœur du Framework .NET 4.5.1
Au cœur du Framework .NET 4.5.1Au cœur du Framework .NET 4.5.1
Au cœur du Framework .NET 4.5.1Microsoft
 
TechDays 2014 : Cloud Azure – Services de données et bonnes pratiques
TechDays 2014 : Cloud Azure – Services de données et bonnes pratiquesTechDays 2014 : Cloud Azure – Services de données et bonnes pratiques
TechDays 2014 : Cloud Azure – Services de données et bonnes pratiquesMCKLMT
 
Meetup Google Cloud
Meetup Google CloudMeetup Google Cloud
Meetup Google CloudPierre Coste
 
Réussir une montée en charge avec MongoDB
Réussir une montée en charge avec MongoDBRéussir une montée en charge avec MongoDB
Réussir une montée en charge avec MongoDB MongoDB
 
Azure Camp 9 Décembre 2014 - slides Keynote
Azure Camp 9 Décembre 2014 - slides KeynoteAzure Camp 9 Décembre 2014 - slides Keynote
Azure Camp 9 Décembre 2014 - slides KeynoteMicrosoft
 
Elasticsearch 5.0 les nouveautés
Elasticsearch 5.0 les nouveautésElasticsearch 5.0 les nouveautés
Elasticsearch 5.0 les nouveautésMathieu Elie
 
Toutes les raisons d'adopter MongoDB
Toutes les raisons d'adopter MongoDBToutes les raisons d'adopter MongoDB
Toutes les raisons d'adopter MongoDBContent Square
 
Les nouveautés stockage dans Windows Server 2012 R2
Les nouveautés stockage dans Windows Server 2012 R2Les nouveautés stockage dans Windows Server 2012 R2
Les nouveautés stockage dans Windows Server 2012 R2Georgeot Cédric
 
Exchange 2013 Dimensionnement et Performance
Exchange 2013 Dimensionnement et Performance Exchange 2013 Dimensionnement et Performance
Exchange 2013 Dimensionnement et Performance Microsoft Technet France
 
Vincent biret azure functions et flow #AosCanadianTour (quebec)
Vincent biret azure functions et flow #AosCanadianTour (quebec)Vincent biret azure functions et flow #AosCanadianTour (quebec)
Vincent biret azure functions et flow #AosCanadianTour (quebec)Vincent Biret
 
Serveurs core et virtualisation
Serveurs core et virtualisationServeurs core et virtualisation
Serveurs core et virtualisationChristophe Laporte
 
meetup - Workflow complet de CI/CD pour les geeks avec gitlab et kubernetes
meetup - Workflow complet de CI/CD pour les geeks avec gitlab et kubernetesmeetup - Workflow complet de CI/CD pour les geeks avec gitlab et kubernetes
meetup - Workflow complet de CI/CD pour les geeks avec gitlab et kubernetesFrederic Leger
 

Semelhante a OpenDS - Ludovic Poitou - December 2010 (20)

Exchange 2013 Bonnes pratiques
Exchange 2013 Bonnes pratiques Exchange 2013 Bonnes pratiques
Exchange 2013 Bonnes pratiques
 
JSS2013 : Haute disponibilité
JSS2013 : Haute disponibilitéJSS2013 : Haute disponibilité
JSS2013 : Haute disponibilité
 
Cloud Azure -- Services de données et bonnes pratiques
Cloud Azure -- Services de données et bonnes pratiques Cloud Azure -- Services de données et bonnes pratiques
Cloud Azure -- Services de données et bonnes pratiques
 
Windows Azure : Services de données et bonnes pratiques
Windows Azure : Services de données et bonnes pratiquesWindows Azure : Services de données et bonnes pratiques
Windows Azure : Services de données et bonnes pratiques
 
Conteneurs Linux ou Windows : quelles approches pour des IT agiles ?
Conteneurs Linux ou Windows : quelles approches pour des IT agiles ?Conteneurs Linux ou Windows : quelles approches pour des IT agiles ?
Conteneurs Linux ou Windows : quelles approches pour des IT agiles ?
 
Meetup Google Cloud
Meetup Google CloudMeetup Google Cloud
Meetup Google Cloud
 
Au cœur du Framework .NET 4.5.1
Au cœur du Framework .NET 4.5.1Au cœur du Framework .NET 4.5.1
Au cœur du Framework .NET 4.5.1
 
TechDays 2014 : Cloud Azure – Services de données et bonnes pratiques
TechDays 2014 : Cloud Azure – Services de données et bonnes pratiquesTechDays 2014 : Cloud Azure – Services de données et bonnes pratiques
TechDays 2014 : Cloud Azure – Services de données et bonnes pratiques
 
Meetup Google Cloud
Meetup Google CloudMeetup Google Cloud
Meetup Google Cloud
 
Réussir une montée en charge avec MongoDB
Réussir une montée en charge avec MongoDBRéussir une montée en charge avec MongoDB
Réussir une montée en charge avec MongoDB
 
Haute disponibilité jss2012
Haute disponibilité jss2012Haute disponibilité jss2012
Haute disponibilité jss2012
 
Azure Camp 9 Décembre 2014 - slides Keynote
Azure Camp 9 Décembre 2014 - slides KeynoteAzure Camp 9 Décembre 2014 - slides Keynote
Azure Camp 9 Décembre 2014 - slides Keynote
 
Elasticsearch 5.0 les nouveautés
Elasticsearch 5.0 les nouveautésElasticsearch 5.0 les nouveautés
Elasticsearch 5.0 les nouveautés
 
Fusion io
Fusion ioFusion io
Fusion io
 
Toutes les raisons d'adopter MongoDB
Toutes les raisons d'adopter MongoDBToutes les raisons d'adopter MongoDB
Toutes les raisons d'adopter MongoDB
 
Les nouveautés stockage dans Windows Server 2012 R2
Les nouveautés stockage dans Windows Server 2012 R2Les nouveautés stockage dans Windows Server 2012 R2
Les nouveautés stockage dans Windows Server 2012 R2
 
Exchange 2013 Dimensionnement et Performance
Exchange 2013 Dimensionnement et Performance Exchange 2013 Dimensionnement et Performance
Exchange 2013 Dimensionnement et Performance
 
Vincent biret azure functions et flow #AosCanadianTour (quebec)
Vincent biret azure functions et flow #AosCanadianTour (quebec)Vincent biret azure functions et flow #AosCanadianTour (quebec)
Vincent biret azure functions et flow #AosCanadianTour (quebec)
 
Serveurs core et virtualisation
Serveurs core et virtualisationServeurs core et virtualisation
Serveurs core et virtualisation
 
meetup - Workflow complet de CI/CD pour les geeks avec gitlab et kubernetes
meetup - Workflow complet de CI/CD pour les geeks avec gitlab et kubernetesmeetup - Workflow complet de CI/CD pour les geeks avec gitlab et kubernetes
meetup - Workflow complet de CI/CD pour les geeks avec gitlab et kubernetes
 

Mais de JUG Lausanne

Introduction aux algorithmes génétiques
Introduction aux algorithmes génétiquesIntroduction aux algorithmes génétiques
Introduction aux algorithmes génétiquesJUG Lausanne
 
Développer un moteur d'exécution symbolique en partant de rien
Développer un moteur d'exécution symbolique en partant de rienDévelopper un moteur d'exécution symbolique en partant de rien
Développer un moteur d'exécution symbolique en partant de rienJUG Lausanne
 
Reverse engineering Java et contournement du mécanisme de paiement inapp Android
Reverse engineering Java et contournement du mécanisme de paiement inapp AndroidReverse engineering Java et contournement du mécanisme de paiement inapp Android
Reverse engineering Java et contournement du mécanisme de paiement inapp AndroidJUG Lausanne
 
Exemple d'IOT et ML avec Android, Cassandra et Spark
Exemple d'IOT et ML avec Android, Cassandra et SparkExemple d'IOT et ML avec Android, Cassandra et Spark
Exemple d'IOT et ML avec Android, Cassandra et SparkJUG Lausanne
 
Play! chez Zaptravel - Nicolas Martignole - December 2012
Play! chez Zaptravel - Nicolas Martignole - December 2012Play! chez Zaptravel - Nicolas Martignole - December 2012
Play! chez Zaptravel - Nicolas Martignole - December 2012JUG Lausanne
 
Playframework Realtime Web - Guillaume Bort & Sadek Drobi - December 2012
Playframework Realtime Web - Guillaume Bort & Sadek Drobi - December 2012Playframework Realtime Web - Guillaume Bort & Sadek Drobi - December 2012
Playframework Realtime Web - Guillaume Bort & Sadek Drobi - December 2012JUG Lausanne
 
CloudBees - Sacha Labourey - May 2011
CloudBees - Sacha Labourey - May 2011CloudBees - Sacha Labourey - May 2011
CloudBees - Sacha Labourey - May 2011JUG Lausanne
 
Apache Camel - Stéphane Kay - April 2011
Apache Camel - Stéphane Kay - April 2011Apache Camel - Stéphane Kay - April 2011
Apache Camel - Stéphane Kay - April 2011JUG Lausanne
 
Session dédiée à l'analyse de la qualité du code Java - Cyril Picat - Februar...
Session dédiée à l'analyse de la qualité du code Java - Cyril Picat - Februar...Session dédiée à l'analyse de la qualité du code Java - Cyril Picat - Februar...
Session dédiée à l'analyse de la qualité du code Java - Cyril Picat - Februar...JUG Lausanne
 
Spring Batch - Julien Jakubowski - November 2010
Spring Batch - Julien Jakubowski - November 2010Spring Batch - Julien Jakubowski - November 2010
Spring Batch - Julien Jakubowski - November 2010JUG Lausanne
 
Infinispan - Galder Zamarreno - October 2010
Infinispan - Galder Zamarreno - October 2010Infinispan - Galder Zamarreno - October 2010
Infinispan - Galder Zamarreno - October 2010JUG Lausanne
 
No Sql - Olivier Mallassi - September 2010
No Sql - Olivier Mallassi - September 2010No Sql - Olivier Mallassi - September 2010
No Sql - Olivier Mallassi - September 2010JUG Lausanne
 
Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010
Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010
Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010JUG Lausanne
 
Introduction à Scala - Michel Schinz - January 2010
Introduction à Scala - Michel Schinz - January 2010Introduction à Scala - Michel Schinz - January 2010
Introduction à Scala - Michel Schinz - January 2010JUG Lausanne
 
Introduction Groovy / Grails - Cyril Picat - December 2009
Introduction Groovy / Grails - Cyril Picat - December 2009Introduction Groovy / Grails - Cyril Picat - December 2009
Introduction Groovy / Grails - Cyril Picat - December 2009JUG Lausanne
 
Initiation aux tests fonctionnels - Philippe Kernevez - October 2009
Initiation aux tests fonctionnels - Philippe Kernevez - October 2009Initiation aux tests fonctionnels - Philippe Kernevez - October 2009
Initiation aux tests fonctionnels - Philippe Kernevez - October 2009JUG Lausanne
 
Sonar - Freddy Mallet - April 2009
Sonar - Freddy Mallet - April 2009Sonar - Freddy Mallet - April 2009
Sonar - Freddy Mallet - April 2009JUG Lausanne
 
Maven2 - Philippe Kernevez - March 2009
Maven2 - Philippe Kernevez - March 2009Maven2 - Philippe Kernevez - March 2009
Maven2 - Philippe Kernevez - March 2009JUG Lausanne
 
XML & Java - Raphaël Tagliani - March 2008
XML & Java - Raphaël Tagliani - March 2008XML & Java - Raphaël Tagliani - March 2008
XML & Java - Raphaël Tagliani - March 2008JUG Lausanne
 
Visual Mobile Applications with Netbeans 6.0 - Cédric Tabin - February 2008
Visual Mobile Applications with Netbeans 6.0 - Cédric Tabin - February 2008Visual Mobile Applications with Netbeans 6.0 - Cédric Tabin - February 2008
Visual Mobile Applications with Netbeans 6.0 - Cédric Tabin - February 2008JUG Lausanne
 

Mais de JUG Lausanne (20)

Introduction aux algorithmes génétiques
Introduction aux algorithmes génétiquesIntroduction aux algorithmes génétiques
Introduction aux algorithmes génétiques
 
Développer un moteur d'exécution symbolique en partant de rien
Développer un moteur d'exécution symbolique en partant de rienDévelopper un moteur d'exécution symbolique en partant de rien
Développer un moteur d'exécution symbolique en partant de rien
 
Reverse engineering Java et contournement du mécanisme de paiement inapp Android
Reverse engineering Java et contournement du mécanisme de paiement inapp AndroidReverse engineering Java et contournement du mécanisme de paiement inapp Android
Reverse engineering Java et contournement du mécanisme de paiement inapp Android
 
Exemple d'IOT et ML avec Android, Cassandra et Spark
Exemple d'IOT et ML avec Android, Cassandra et SparkExemple d'IOT et ML avec Android, Cassandra et Spark
Exemple d'IOT et ML avec Android, Cassandra et Spark
 
Play! chez Zaptravel - Nicolas Martignole - December 2012
Play! chez Zaptravel - Nicolas Martignole - December 2012Play! chez Zaptravel - Nicolas Martignole - December 2012
Play! chez Zaptravel - Nicolas Martignole - December 2012
 
Playframework Realtime Web - Guillaume Bort & Sadek Drobi - December 2012
Playframework Realtime Web - Guillaume Bort & Sadek Drobi - December 2012Playframework Realtime Web - Guillaume Bort & Sadek Drobi - December 2012
Playframework Realtime Web - Guillaume Bort & Sadek Drobi - December 2012
 
CloudBees - Sacha Labourey - May 2011
CloudBees - Sacha Labourey - May 2011CloudBees - Sacha Labourey - May 2011
CloudBees - Sacha Labourey - May 2011
 
Apache Camel - Stéphane Kay - April 2011
Apache Camel - Stéphane Kay - April 2011Apache Camel - Stéphane Kay - April 2011
Apache Camel - Stéphane Kay - April 2011
 
Session dédiée à l'analyse de la qualité du code Java - Cyril Picat - Februar...
Session dédiée à l'analyse de la qualité du code Java - Cyril Picat - Februar...Session dédiée à l'analyse de la qualité du code Java - Cyril Picat - Februar...
Session dédiée à l'analyse de la qualité du code Java - Cyril Picat - Februar...
 
Spring Batch - Julien Jakubowski - November 2010
Spring Batch - Julien Jakubowski - November 2010Spring Batch - Julien Jakubowski - November 2010
Spring Batch - Julien Jakubowski - November 2010
 
Infinispan - Galder Zamarreno - October 2010
Infinispan - Galder Zamarreno - October 2010Infinispan - Galder Zamarreno - October 2010
Infinispan - Galder Zamarreno - October 2010
 
No Sql - Olivier Mallassi - September 2010
No Sql - Olivier Mallassi - September 2010No Sql - Olivier Mallassi - September 2010
No Sql - Olivier Mallassi - September 2010
 
Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010
Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010
Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010
 
Introduction à Scala - Michel Schinz - January 2010
Introduction à Scala - Michel Schinz - January 2010Introduction à Scala - Michel Schinz - January 2010
Introduction à Scala - Michel Schinz - January 2010
 
Introduction Groovy / Grails - Cyril Picat - December 2009
Introduction Groovy / Grails - Cyril Picat - December 2009Introduction Groovy / Grails - Cyril Picat - December 2009
Introduction Groovy / Grails - Cyril Picat - December 2009
 
Initiation aux tests fonctionnels - Philippe Kernevez - October 2009
Initiation aux tests fonctionnels - Philippe Kernevez - October 2009Initiation aux tests fonctionnels - Philippe Kernevez - October 2009
Initiation aux tests fonctionnels - Philippe Kernevez - October 2009
 
Sonar - Freddy Mallet - April 2009
Sonar - Freddy Mallet - April 2009Sonar - Freddy Mallet - April 2009
Sonar - Freddy Mallet - April 2009
 
Maven2 - Philippe Kernevez - March 2009
Maven2 - Philippe Kernevez - March 2009Maven2 - Philippe Kernevez - March 2009
Maven2 - Philippe Kernevez - March 2009
 
XML & Java - Raphaël Tagliani - March 2008
XML & Java - Raphaël Tagliani - March 2008XML & Java - Raphaël Tagliani - March 2008
XML & Java - Raphaël Tagliani - March 2008
 
Visual Mobile Applications with Netbeans 6.0 - Cédric Tabin - February 2008
Visual Mobile Applications with Netbeans 6.0 - Cédric Tabin - February 2008Visual Mobile Applications with Netbeans 6.0 - Cédric Tabin - February 2008
Visual Mobile Applications with Netbeans 6.0 - Cédric Tabin - February 2008
 

OpenDS - Ludovic Poitou - December 2010

  • 1. CONCEVOIR UN SERVEUR ULTRA-PERFORMANT EN JAVA : L'EXPÉRIENCE DU PROJET OPENDS Ludovic Poitou Friday, December 10, 2010 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 14 ans d'expérience avec LDAP • Architecte de Sun Directory Server 5.2 / 6 2 • http://ludopoitou.wordpress.com Friday, December 10, 2010 2
  • 3. • ForgeRock AS • Editeur - Février 2010 - Norvège de logiciels open source • OpenAM • ForgeRock • Centre (ex-OpenSSO), OpenIDM, OpenDJ (OpenDS) ... France SAS - Novembre 2010 de Recherche & Développement à Grenoble • UK, USA, Brésil, Allemagne, Suède... Friday, December 10, 2010 3
  • 4. AGENDA • Une présentation du projet OpenDS • Modèles de conceptions et réflexions sur la notion de performance • La JVM et les performances • Conclusion Friday, December 10, 2010 4
  • 5. LE PROJET OPENDS • Lancé en Open Source en July 2006 • CDDL • Code source : https://opends.dev.java.net/ • Sponsorisé • Ecrit par Sun Microsystems / Oracle en Java par des experts LDAP Friday, December 10, 2010 5
  • 6. QU'EST CE ? • OpenDS est un server en Java qui implémente le protocol LDAPv3 et ses services • Il inclut sa propre base de données, • basé • Pas sur Berkeley DB Java Edition 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 Friday, December 10, 2010 6
  • 7. POURQUOI FAIRE ? • Stockage • Pages générique et orienté objet de données 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é • Le par l'infrastructure Web et Mail fondement des produits de gestion d'Identité • Gestion Friday, December 10, 2010 d'Access, Fédération, Provisionnage 7
  • 8. LES OBJECTIFS DU PROJET OPENDS • 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 • Capacité aux standards et extensions LDAPv3 de croissance horizontale et verticale • Utiliser le code d'OpenDS pour le produit Oracle Directory Server Enterprise Edition Friday, December 10, 2010 8
  • 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 ! Friday, December 10, 2010 9
  • 10. OPENDS 2.2 • Disponible • Un depuis Décembre 2009 serveur d'annuaire 100% conforme à LDAPv3 • Nombreuses • Réplication données • Fonctions extensions LDAP standards et expérimentales Multi Maitre, avec 3 niveaux de cohérence des étendues de Sécurité • S'installe en 6 clics et moins de 3 minutes • Gestion par outils graphiques et textes • Documentation Friday, December 10, 2010 complète sur le Wiki 10
  • 11. • Dérive d’OpenDS • Version • Plus 2.4 la semaine prochaine de 10 nouvelles fonctionnalités • Un grand nombre de correctifs • De meilleures performances Friday, December 10, 2010 11
  • 12. POUR QUI ? • Les opérateurs Télécom, le secteur financier, les portails • Pour • De • Pour stocker les identités des clients, téléphones et services 15 à 120 millions d'entrées, hautement disponibles le service de Nommage, ou les PME • OpenSolaris, Solaris, Linux..., couplé avec Kerberos • Pages Friday, December 10, 2010 avec SAMBA, Intégré blanches... 12
  • 13. CARACTÉRISTIQUES DE PERFORMANCES • Comme priment • Jusqu'à tout serveur, les capacités de montée en charge plusieurs dizaines de millions d'entrées • Plusieurs • Quel • Quel Friday, December 10, 2010 milliers de connections débit d'opérations? Photo par Roger Smith http://www.flickr.com/photos/rogersmith/ temps de réponse moyen ? Maximum ? 13
  • 14. ENVIRONNEMENT DE TEST • OpenDS • Le 2.2, Solaris 10, ZFS test de base : • 10 M d'entrées, taille moyenne 2,6K • Réplication Friday, December 10, 2010 multi-maitre entre 2 serveurs 14
  • 15. LES RÉGLAGES DU TEST • config.ldif • ds-cfg-db-log-file-max: 100 MB • ds-cfg-db-cache-percent: 70-80 • ds-cfg-db-checkpointer-bytes-interval: 100 MB • ds-cfg-etime-resolution: nanoseconds • ds-cfg-num-request-handlers: 4 • Replication Friday, December 10, 2010 ON 15
  • 16. SEARCHRATE SUR X4170 Friday, December 10, 2010 16
  • 17. MODRATE SUR X4170 Friday, December 10, 2010 17
  • 18. REFLEXIONS SUR LA CONCEPTION Photo par Jean-Pierre Dalbera http://www.flickr.com/people/dalbera/ Friday, December 10, 2010 18
  • 19. 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 Friday, December 10, 2010 19
  • 20. PERFORMANCE VS PARALLELISME • Impact des performances sur le parallelisme • Code sérialisé crée des points de contentions • Manque • Impact de ressources du parallelisme sur les performances • L'utilisation de plus de ressources conduit à plus de contention et impacte les performances • Réglage Friday, December 10, 2010 du goulet d'étranglement 20
  • 21. ATTENTION AUX SECTIONS CRITIQUES • Essayer de minimiser le temps passé en section critique • Mais la bande passante est limitée par le temps passé dans la plus grosse section critique • Exemple • 200 • 20 000 opérations sur processeur x64 000 sur processor T2000 • Utilisée Friday, December 10, 2010 : LinkedBlockingQueue pour la WorkQueue et les Access Logs 21
  • 22. LE CACHE D'ENTRÉES • Un cache pour réduire les accès disques • L'éviction • Un du cache rajoute du travail au GC cache global est point de contention • Cacher uniquement des objets qui vont être réutilisés (et pas peut-être) • Utiliser Friday, December 10, 2010 un cache “thread local”, mais attention aux coûts ! 22
  • 23. LE MONITORING DU SERVEUR • Les statistiques sont indispensables • Mais attention à la contention • Ecritures • Lecture fréquentes (update stats) beaucoup moins • Une stratégie est de garder des statistiques par thread et de les collecter sur demande • Pas encore implémenté dans OpenDS ! Friday, December 10, 2010 23
  • 24. PATTERNS • Utilisation des I/O asynchrones • Utilisation d'Objets Immuables • Thread • Less code • Utilisation • Evite • Avec des “Static Factories” au lieu de Constructeurs la création d'objets • Permet Friday, December 10, 2010 safe des optimisations des objet immuables. 24
  • 25. PATTERNS • Producteurs / Consommateurs • Queues • Pool de Threads • Monitors Friday, December 10, 2010 25
  • 26. ANTI-PATTERNS • Manipulation • Il faut utiliser “StringBuilder” • Le compilateur optimise aussi “Aaa” + “Bbb” • Eviter • Ne les grandes méthodes (Milliers de lignes de code) pas exposer la représentation concrète d'un objet • Set • Ne de chaines (String) vs LinkedHashSet pas définir plus de méthodes que nécessaires Friday, December 10, 2010 26
  • 27. COLLECTIONS JAVA • Vector et Hashtable sont synchronisés (toutes les méthodes) => Un cout à payer, même avec un seul thread • Certaines classes ne sont pas synchronisées par défaut • ArrayList, LinkedList • HashSet, HashMap replacent Vector replacent Hashtable • Pour synchroniser: Enrober dans une classe. Par une méthode “static factory” Collections.synchronizedList(new ArrayList()) • ConcurrentHashMap, pour • Mais Friday, December 10, 2010 la concurrence attention à l'itérateur 27
  • 28. 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 Friday, December 10, 2010 de 10GB ethernet 28
  • 29. LA JVM ET LES PARAMÈTRES DES PERFORMANCES “Tuning GC” est un art ! Photo par Kecko http://www.flickr.com/people/kecko/ Friday, December 10, 2010 29
  • 30. GC DANS LA JVM HOTSPOT •3 GCs disponibles: • Serial GC • Parallel GC / Parallel Old GC • Concurrent • Et Mark-Sweep GC (CMS) bientôt Garbage First (G1) Friday, December 10, 2010 30
  • 31. GESTION DU TAS (POUR TOUS LES GCS) Young Generation Old Generation Permanent Generation Friday, December 10, 2010 31
  • 32. YOUNG GENERATION Allocation (new Object()) Eden Friday, December 10, 2010 Survivor Spaces 32
  • 33. OLD GENERATION Promotion (survivors from the Young Generation) Friday, December 10, 2010 33
  • 34. PERMANENT GENERATION Permanent Generation Allocation (only directly from the JVM) Friday, December 10, 2010 34
  • 35. 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 Photo par Craig Gorcott http://www.flickr.com/photos/craigweb/ • Malheureusement, vous Friday, December 10, 2010 ne pouvez en choisir que 2 ! 35
  • 36. CONSEIL POUR REGLER LA TAILLE DU TAS DE LA JVM LE PLUS GROS POSSIBLE Friday, December 10, 2010 36
  • 37. UN EQUILIBRE A TROUVER • Généralement, plus • Valable gros est l’espace mémoire, le mieux c’est ! 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 Friday, December 10, 2010 37
  • 38. L’IMPACT DES TAILLES DES GENERATIONS • 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 Friday, December 10, 2010 la fréquence des GCs majeurs le plus possible 38
  • 39. 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 Friday, December 10, 2010 39
  • 41. DIMENSIONER LA TAILLE MEMOIRE • -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. Friday, December 10, 2010 41
  • 42. 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) Friday, December 10, 2010 42
  • 43. DIMENSIONNER LES ESPACES MEMOIRES • -XX:NewSize=<size> : Taille initiale de la “Young generation” • -XX:MaxNewSize=<size> generation” • -XX:NewRatio=<ratio> “old generation” : Taille maximale de la “Young : Ratio entre “young generation” et • Pour contrôler les performances, préférer -Xmn qui combine -XX:NewSize et -XX:MaxNewSize Friday, December 10, 2010 43
  • 44. TENURING • -XX:TargetSurvivorRatio=<%>, e.g., 50 • Pourcentage • Laisser d’occupation de l’espace “Survivor” de l’espace pour gérer les pics • -XX:InitialTenuringThreshold=<threshold> • -XX:MaxTenuringThreshold=<threshold> • -XX:+AlwaysTenure • -XX:+NeverTenure Friday, December 10, 2010 - Ne rien garder dans les “Survivor” - Une très mauvaise idée 44
  • 45. TENURING : AVANTAGES & INCONVENIENTS • 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 • Un le cout des GCs mineurs équilibre difficile à trouver • Généralement, il Friday, December 10, 2010 vaut mieux copier que promouvoir 45
  • 47. LE GC GARBAGE FIRST (G1) • Nouveauté de la VM Java HotSpot dans JDK 7 • Une version experimentale de G1 est dans Java SE 6 depuis la version mineur 14 • G1 est vu comme le replacement à long terme du GC “Concurrent Mark-Sweep” (CMS) • Toujours Friday, December 10, 2010 expérimental dans Java SE 6 Update 23 ☹ 47
  • 48. CARACTERISTIQUES 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. Friday, December 10, 2010 48
  • 49. G1: LES OPTIONS DE LA JVM • -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC • Temps de pause (pas garanti, sinon utiliser Java Temps Réel) • -XX:MaxGCPauseMillis=50 (objectif de 50 millisecondes) • -XX:GCPauseIntervalMillis=1000 • Dimension: (objectif de 1000 msecs) -XX:+G1YoungGenSize=512m • Parallélisme: • -XX:+G1ParallelRSetUpdatingEnabled • -XX:+G1ParallelRSetScanningEnabled Friday, December 10, 2010 49
  • 50. OPENDS ET CMS • Les options • CMS + Occupency • NewGenSize = ¼ de la taille mémoire (jusqu’à 2GB) • MaxTenuringThreshold • Temps • Mais =1 de pause maximum GC mineur ~ 100ms Full GC en écriture ! 10 seconds ☹ Friday, December 10, 2010 50
  • 51. OPENDS ET G1 • Objectif: Eviter • Collaboration • OpenDS • Entre tests le GC Complet, meilleur contrôle des pauses entre les équipes HotSpot et OpenDS est utilisé comme application de référence 20 et 30 améliorations integrées dans G1 suite aux • Améliorations par 10 des performances de G1 avec de grandes zones mémoires Friday, December 10, 2010 51
  • 52. LE CONTROLE 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 • Peut •A est aussi un module extension de VisualVM surveiller plusieurs VM dans le même outil posteriori • GC Logging, PrintGCStats, GChisto Friday, December 10, 2010 52
  • 53. LE JOURNAL DU GC ACTIVÉ EN PRODUCTION • Activer • Très • Coût le journal du GC en production sans crainte utile pour analyser, diagnostiquer un problème en performance extrêmement faible • Peut-être • Il quelques gros fichiers à gérer 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!” Friday, December 10, 2010 53
  • 54. PARAMETRES POUR LE JOURNAL DU GC • -XX:+PrintGCTimeStamps • Ajouter -XX:+PrintGCDateStamps si besoin • -XX:+PrintGCDetails • Donne • Mais plus de détails que -verbosegc aussi: • -Xloggc:<fichier> • Permet de séparer les sorties du GC de celles de l’application Friday, December 10, 2010 54
  • 55. PRINTGCSTATS • Analyse • Un et résume les journaux du GC 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 Friday, December 10, 2010 55
  • 56. PRINTGCSTATS PARALLEL GC • what gen0t(s) gen1t(s) GC(s) alloc(MB) promo(MB) used0(MB) used1(MB) used(MB) commit0(MB) commit1(MB) commit(MB) count 193 1 194 193 193 193 1 194 193 193 193 alloc/elapsed_time alloc/tot_cpu_time alloc/mut_cpu_time promo/elapsed_time promo/gc0_time gc_seq_load gc_conc_load gc_tot_load Friday, December 10, 2010 total 11.470 7.350 18.819 11244.609 807.236 16018.930 635.896 91802.213 17854.188 123520.000 141374.188 = = = = = = = = 11244.609 11244.609 11244.609 807.236 807.236 301.110 0.000 301.110 mean 0.05943 7.34973 0.09701 58.26222 4.18257 82.99964 635.89648 473.20728 92.50874 640.00000 732.50874 MB MB MB MB MB s s s / / / / / / / / 77.237 1235.792 934.682 77.237 11.470 1235.792 1235.792 1235.792 max 0.687 7.350 7.350 100.875 96.426 114.375 635.896 736.490 114.500 640.000 754.500 s s s s s s s s stddev 0.0633 0.0000 0.5272 18.8519 9.9291 17.4899 0.0000 87.8376 9.8209 0.0000 9.8209 = 145.586 MB/s = 9.099 MB/s = 12.030 MB/s = 10.451 MB/s = 70.380 MB/s = 24.366% = 0.000% = 24.366% 56
  • 57. PRINTGCSTATS CMS • what gen0(s) gen0t(s) cmsIM(s) cmsRM(s) GC(s) cmsCM(s) cmsCP(s) cmsCS(s) cmsCR(s) alloc(MB) promo(MB) used0(MB) used(MB) commit0(MB) commit1(MB) commit(MB) count 110 110 3 3 113 3 6 3 3 110 110 110 110 110 110 110 alloc/elapsed_time alloc/tot_cpu_time alloc/mut_cpu_time promo/elapsed_time promo/gc0_time gc_seq_load gc_conc_load gc_tot_load Friday, December 10, 2010 total 24.381 24.397 0.285 0.092 24.774 2.459 0.971 14.620 0.036 11275.000 1322.718 12664.750 56546.542 12677.500 70400.000 83077.500 = = = = = = = = 11275.000 11275.000 11275.000 1322.718 1322.718 396.378 18.086 414.464 mean 0.22164 0.22179 0.09494 0.03074 0.21924 0.81967 0.16183 4.87333 0.01200 102.50000 12.02471 115.13409 514.05947 115.25000 640.00000 755.25000 MB MB MB MB MB s s s / / / / / / / / 83.621 1337.936 923.472 83.621 24.397 1337.936 1337.936 1337.936 max 1.751 1.751 0.108 0.032 1.751 0.835 0.191 4.916 0.016 102.500 104.608 115.250 640.625 115.250 640.000 755.250 s s s s s s s s stddev 0.2038 0.2038 0.0112 0.0015 0.2013 0.0146 0.0272 0.0638 0.0035 0.0000 11.8770 1.2157 91.5858 0.0000 0.0000 0.0000 = 134.835 MB/s = 8.427 MB/s = 12.209 MB/s = 15.818 MB/s = 54.217 MB/s = 29.626% = 1.352% = 30.978% 57
  • 58. GCHISTO • Pour une visualisation graphique des journaux du GC • Développement • Affiche • Open • Peut démarré en 2008 (mais arrêté ?) uniquement les temps de pause source sur Java.net : http://gchisto.dev.java.net/ ne pas marcher avec certains paramètres du log du GC Friday, December 10, 2010 58
  • 59. EN RÉSUMÉ • OpenDS: Un serveur LDAP en Java, open source • Simple à installer et utiliser • Conçu pour de hautes performances et haute disponibilité • OpenDJ • Le pour une version supportée (et améliorée) paramètrage de la JVM et du GC est un Art • L'ingénierie des performances, un métier ! • Comprendre • Qui la JVM et les GCs est indispensable a dit que Java est lent ! Friday, December 10, 2010 59
  • 60. MAINTENANT... • Essayez OpenDJ: • http://www.opendj.org • IRC: #opendj • Participez Friday, December 10, 2010 on freenode.net ! 60
  • 61. Concevoir un serveur ultra-performant en Java : l'expérience du projet OpenDS • Ludovic Poitou • ludovic.poitou@ForgeRock.com • Twitter: @LudoMP • Blog: http://ludopoitou.wordpress.com Friday, December 10, 2010 61