openldap slapd が Lock table is out of available lock entries エラーを発生させる
Environment
- Red Hat Enterprise Linux 6
- Red Hat Enterprise Linux 5
- openldap-servers
Issue
多数の属性、または大きな属性を持つ ldap エントリを追加すると、slapd が以下のエラーを表示します。
Jun 20 15:44:10 hostname slapd[2705]: bdb(dc=example,dc=com):Lock table is out of available lock entries
Jun 20 15:44:10 hostname slapd[2705]:=> bdb_idl_insert_key: c_get failed:Cannot allocate memory (12)
Jun 20 15:44:10 hostname slapd[2705]: conn=1038 op=1 RESULT tag=105 err=80 text=index generation failed
Resolution
/var/lib/ldap/DB_CONFIG で、BDB 環境で利用できるロック数を増やします。
たとえば、以下のようになります。
set_lk_max_locks 10000
set_lk_max_lockers 10000
set_lk_max_objects 20000
Red Hat サポートからは適正値を示すことはできませんが、以下の方法を実行すると、現在の設定と統計を確認することができます。
- 現在のステータスと設定を確認します。
1-1. ディレクトリを /var/lib/ldap に変更します。
# cd /var/lib/ldap
1-2. db_stat (RHEL6) または slapd_db_stat (RHEL5) にて、現在のステータスを確認します。
たとえば、RHEL6 の場合は以下のコマンドを実行してください。
# db_stat -h . -c
<..SNIP..>
1000 Maximum number of locks possible
1000 Maximum number of lockers possible
1000 Maximum number of lock objects possible
<..SNIP..>
XXX Maximum number of locks at any one time
<..SNIP..>
YYYY Maximum number of lockers at any one time
<..SNIP..>
ZZZZ Maximum number of lock objects at any one time
[Maximum number of locks possible ]
Berkeley DB 環境でサポートされている最大のロック数の設定
この値の統計は、"Maximum number of locks at any one time" 行の値で確認できます。
[Maximum number of lockers ]
Berkeley DB 環境でサポートされている最大のロッキング エンティティの設定
この値の統計は、"Maximum number of lockers at any one time" 行の値で確認できます。
[Maximum number of lock objects possible ]
Berkeley DB 環境でサポートされている最大のロックされたオブジェクトの設定
この値の統計は、"Maximum number of lock objects at any one time" 行の値で確認できます。
-
slapd サービスを停止します。
# service slapd stop
-
/var/lib/ldap ディレクトリの DB_CONFIG ファイルを修正 (または作成) してください。
set_lk_max_locks 10000 // set Maximum number of locks set_lk_max_lockers 10000 // set Maximum number of lockers set_lk_max_objects 20000 // set Maximum number of objects
少なくとも、上の手順
1-2
で確認した値よりも高く設定する必要があります。 -
/var/lib/ldap ディレクトリで、db_recover (RHEL6) または slapd_db_recover (RHEL5) を実行します。
たとえば、RHEL6 の場合は以下のコマンドを実行してください。
# db_recover -h .
必ず"." を入力してください。これにより、この場所が db_recover のホームディレクトリとして設定されます。
-
slapd サービスを再度開始します。
# service slapd restart
-
手順
1-2
で db_stat コマンドを実行して設定したように、lock パラメータの数を変更したかどうかを確認できます。注意: 各パラメーターの詳細については、/usr/share/doc/db4-devel-/<parameter-name>.html を参照してください。
db_stat ユーティリティの詳細については、/usr/share/doc/db4-utils-/utility/<utility-name>.html を参照してください。
Root Cause
slapd がエントリを新しく追加するのに、ロックオブジェクトが足りません。
Diagnostic Steps
- syslog を有効にして log level4 メッセージを取得します。
- 「問題」セクションに表示されているメッセージを確認します。
This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.
Comments