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
On peut identifier les variables intéressantes :
On trouve ensuite la configuration concernant les locks (verrous)
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
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
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
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.