Tuning OpenLDAP avec DB_CONFIG

Afin d'améliorer les performances de OpenLDAP, il est recommandé de pouvoir utiliser le plus de cache possible pour monter en mémoire les données OpenLDAP.

Ceci se fait via les réglagles du fichier DB_CONFIG, qui se trouve dans le répertoire contenant les données de l'annuaire, et qui permet de paramétrer la base de données Berkeley, utilisée comme back-end de stockage par OpenLDAP.
Par défaut, il n'y a pas de fichier DB_CONFIG créé. Par contre on peut trouver un exemple dans /usr/share/openldap-servers/DB_CONFIG.example :

# $OpenLDAP$
# Example DB_CONFIG file for use with slapd(8) BDB/HDB databases.
#
# See the Oracle Berkeley DB documentation
#   
# for detail description of DB_CONFIG syntax and semantics.
#
# Hints can also be found in the OpenLDAP Software FAQ
# 
# in particular:
#   

# Note: most DB_CONFIG settings will take effect only upon rebuilding
# the DB environment.

# one 0.25 GB cache
set_cachesize 0 268435456 1

# Data Directory
#set_data_dir db

# Transaction Log settings
set_lg_regionmax 262144
set_lg_bsize 2097152
#set_lg_dir logs

# Note: special DB_CONFIG flags are no longer needed for "quick"
# slapadd(8) or slapindex(8) access (see their -q option). 

 

Un exemple d'un "vrai" fichier DB_CONFIG :

#
# DB_CONFIG
#
# Database size : 2.0 GB
#
# The optimal database cache size "is just the size of the (dn2id.bdb + id2entry.bdb) file, plus about 10% for growth." 
# http://www.openldap.org/doc/admin24/tuning.html (OpenLDAP AdminGuide)
#
# if id2entry.bdb is 700 MB and and dn2id.bdb is 50MB, then size should be (700 + 50)*1,1 = 825 MB at least
# One cache of 1.0 GB
set_cachesize 1 0 1

# Data Directory
#set_data_dir db

# Transaction Log settings
set_lg_regionmax 262144
set_lg_bsize 2097152
set_lg_max   8388608
set_flags DB_LOG_AUTOREMOVE
set_lg_dir /data/logs/ldap-transactions

# Note: special DB_CONFIG flags are no longer needed for "quick"
# slapadd(8) or slapindex(8) access (see their -q option).

set_lk_max_locks 4000
set_lk_max_lockers 200
set_lk_max_objects 2000

Variables du fichier DB_CONFIG

On peut identifier les variables intéressantes :

  • set_cachesize : la taille du cache (GB BYTES #de segments)
  • set_lg-regionmax : taille maximale en mémoire pour cacher les noms de fichier de database
  • set_lg_bsize : taille de la mémoire cache pour les informations de log
  • set_lg_max : taille maximale des fichiers de logs de transaction. Au moins 4 fois la taille de set_lg_bsize. Une rotation de fichier sera déclenchée lorsque le log aura atteint cette taille
  • set_lg_dir : permet de préciser le répertoire où l'on va stocker les fichiers de logs. Il est recommandé (pour des raisons de sécurité) de ne pas les mettre au même endroit que les données
  • set_flags : DB_LOG_AUTOREMOVE (signifie que les logs seront supprimés lorsqu'ils sont inutiles)

On trouve ensuite la configuration concernant les locks (verrous)

  • set_lk_max_locks : nombre maximal de locks
  • set_lk_max_lockers : nombre de gestionnaire de verrous
  • set_lk_max_objects : nombre maximal d'objets "lockés"

Note : si on modifie les valeurs dans le fichier DB_CONFIG, il faut ensuite relancer une commande db_recover pour que la base Berkeley DB prenne en compte les modifications, après avoir arrêté l'annuaire :

service slapd stop
db_recover -h /product/openldap/data/mydomain-fr
service slapd start

Paramétrage au niveau Root Suffix

Il faut aussi modifier le paramètre olcDbCacheSize dans le fichier de configuration du rootSuffix.
Ce paramètre doit être égal aux nombre d'entrées de l'annuaire + 10%.

Le paramètre olcDbIDLcacheSize peut également être positionné. Il s'agit du cache pour les index.

Le guide d'administration OpenLDAP stipule "une taille égale à trois fois la taille du cache des entrées est un bon point de départ".
Par exemple :

olcDbCacheSize: 100000
olcDbIDLcacheSize : 300000


olcDbLinearIndex: FALSE
olcDbMode: 0600
olcDbSearchStack: 16
olcDbShmKey: 0
olcDbCacheFree: 1
olcDbDNcacheSize: 0

Calcul de la taille du cache

La taille du cache (paramètre set_cachesize) doit être égale à la taille des fichiers bdb utilisés par l'instance. On peut les calculer de la manière suivante :

cd /product/openldap/data/mydomain-fr
du -c -h *.bdb

Positionnement du nombre de locks

Pour vérifier le nombre de locks, on peut utiliser les commandes db_stat

db_stat -c -h /product/openldap/data/mydomain-fr | head -20
149 Last allocated locker ID
0x7fffffff  Current maximum unused locker ID
9 Number of lock modes
10000 Maximum number of locks possible
1000  Maximum number of lockers possible
10000 Maximum number of lock objects possible
20  Number of lock object partitions
7 Number of current locks
3661  Maximum number of locks at any one time
20  Maximum number of locks in any one bucket
0 Maximum number of locks stolen by for an empty partition
0 Maximum number of locks stolen for any one partition
34  Number of current lockers
90  Maximum number of lockers at any one time
7 Number of current lock objects
1862  Maximum number of lock objects at any one time

On récupère donc les valeurs pour les locks, lockers et objects (Maximum number of XXX at any time), ce qui donne une indication pour le paramétrage dans le fichier DB_CONFIG.

 

Catégorie