次の方法で共有


LDAP サーバー Cookie の処理方法

LDAP では、一部のクエリによって膨大な結果セットが返されます。 このようなクエリにより、Windows Server に特定の問題が発生します。

この膨大な結果セットの収集および構築は大変な作業です。 属性の多くを内部表現から LDAP ネットワーク表現に変換する必要があります。 多くの属性では、LDAP 応答フレームで、内部の (大抵の場合バイナリ) 形式からテキスト ベースの UTF-8 形式への変換が必要になります。

別の問題として、何万個ものオブジェクトを持つ結果セットは、膨大な記憶領域を必要とするため、簡単に数百メガバイトの巨大なサイズになる点が挙げられます。 そのため、多くの仮想アドレス空間が必要になります。 また、TCP セッションが転送中に停止した場合、すべての作業が失われるため、ネットワークでの転送にも問題があります。

この容量および運用上の問題から、Microsoft LDAP の開発者は、"ページング クエリ" と呼ばれる LDAP 拡張機能を作成しました。 ページング クエリでは、LDAP コントロールを実装し、1 つの膨大なクエリを大量の小さな結果セットに分割します。 ページング クエリは RFC 標準です (RFC 2696)。

ページング クエリ メソッドは、クライアントまたは LDAP ポリシー ("MaxPageSize") のいずれかを使用して設定されたページ サイズを使用します。 クライアントは、LDAP コントロールを送信してページングを常に有効にする必要があります。

多くの結果を照会するクエリを使用する場合、ある時点でオブジェクトの最大許容数に到達します。 LDAP サーバーは、応答メッセージをパッケージ化し、後で検索を継続するために必要な情報を含む Cookie を追加します。

クライアント アプリケーションは、不透明な BLOB として Cookie を処理する必要があります。 応答でオブジェクト数を取得し、Cookie の存在に基づいて検索を続行できます。 検索を続行するために、 クライアントは、前の応答の Cookie 値を含め、同じクエリを LDAP サーバーに送信します。

オブジェクト数がページを満たさない場合、LDAP クエリは終了し、応答にページ Cookie は追加されません。 サーバーから Cookie が返されない場合、クライアントはページング検索が正常に完了したと見なす必要があります。

サーバーからエラーが返された場合、クライアントはページング検索が失敗したと見なす必要があります。 検索を再実行すると、検索が最初のページから再度開始されます。

Windows Server はクライアントに Cookie を返し、Cookie に関連する情報をサーバー上に格納することがあります。 この情報はサーバー上のキャッシュに格納され、一定の制限があります。

この場合、サーバーによってクライアントに送信された Cookie は、サーバー上のキャッシュから情報を参照する場合にもサーバーによって使用されます。 クライアントがページング検索を継続する場合、Windows Server は、クライアントの Cookie とサーバーの Cookie キャッシュのあらゆる関連情報を使用して検索を継続します。 何らかの理由でサーバーがサーバー キャッシュから関連 Cookie 情報を見つけられない場合、検索は中止され、クライアントにエラーが返されます。

当然ながら、LDAP サーバーは一度に複数のクライアントにサービスを提供しています。 また、同時に複数のクライアントがサーバーの Cookie キャッシュの使用を必要とするクエリを実行できます。 したがって、Windows Server の実装では、Cookie プールの使用が追跡され、さらに Cookie プールによるリソースの使用が過剰にならないように制限が設定されます。 管理者は、LDAP ポリシーの次の設定を使用して制限を設定できます。 既定値および説明は次のとおりです。

MinResultSets: 4

サーバーの Cookie キャッシュ内のエントリが MinResultSets よりも少ない場合、LDAP サーバーによって最大プール サイズが確認されることはありません。

MaxResultSetSize: 262、144 バイト

サーバー上の Cookie キャッシュの合計サイズが MaxResultSetSize の最大バイト数を超えてはいけません。 超える場合は、プールが MaxResultSetSize のバイト数より小さくなるか、プール内の Cookie が MinResultSets より少なくなるまで、最も古い Cookie から削除されます。 既定の設定を使用すると、格納されている Cookie が 3 つしかない場合、LDAP サーバーは 450 KB のプールを問題ないと見なすことを意味しています。

MaxResultSetsPerConn: 10

LDAP サーバーは、プール内の 1 つの LDAP 接続に対して、MaxResultSetsPerConn よりも少ない数の Cookie を許可します。

削除された Cookie の処理

LDAP サーバーのキャッシュから Cookie 情報を削除しても、すべての場合においてアプリケーションのエラーが直ちに発生するわけではありません。 アプリケーションは最初からページング検索を再度開始し、別の試行で完了できます。 一部のアプリケーションにはこのような再試行メカニズムがあり、堅牢性が向上しています。

一部のアプリケーションはページ検索を実行し、完了しないこともあります。 未完了の検索により、LDAP サーバーの Cookie キャッシュにエントリが作成される場合があり、前述のメカニズムで処理されます。 このメカニズムは、アクティブな LDAP 検索のために、サーバーでメモリを解放するために必要不可欠です。

サーバー上でこのような Cookie が削除され、クライアントがこの Cookie のハンドルを使用して検索を継続すると何が発生するでしょうか。 LDAP サーバーは、サーバーの Cookie キャッシュ内に Cookie を見つけられず、クエリに対してエラーを返します。 エラー応答は次のようなものになります。

00000057: LdapErr: DSID-xxxxxxxx, comment: Error processing control, data 0, v1db1

注意

"DSID" 以降の 16 進数の値は、LDAP サーバー バイナリのビルド バージョンによって異なります。

LDAP サーバーには、16 Ldap Interface というカテゴリを使用してイベントをログに記録する機能があります。 このカテゴリを 2 に設定した場合、次のイベントを取得できます。

Log Name:      Directory Service
Source:        Microsoft-Windows-ActiveDirectory_DomainService
Event ID:      2898
Task Category: LDAP Interface
Level:         Information
Description:
Internal event: The LDAP server has reached the limit of the number of Result Sets it will maintain for a single connection.  A stored Result Set will be discarded.  This will result in a client being unable to continue a paged LDAP search.
Maximum number of Result Sets allowed per LDAP connection:
10
Current number of Result Sets for this LDAP connection:
11

User Action
The client should consider a more efficient search filter.  The limit for Maximum Result Sets per Connection may also be increased.

Log Name:      Directory Service
Source:        Microsoft-Windows-ActiveDirectory_DomainService
Event ID:      2899
Task Category: LDAP Interface
Level:         Information
Description:
Internal event: The LDAP server has exceeded the limit of the LDAP Maximum Result Set Size. A stored Result Set will be discarded. This will result in a client being unable to continue a paged LDAP search.

Number of result sets currently stored:
4
Current Result Set Size:
263504
Maximum Result Set Size:
262144
Size of single Result Set being discarded:
40876
User Action
The client should consider a more efficient search filter.  The limit for Maximum Result Set Size may also be increased.

このイベントは、格納された Cookie が削除されたことを通知します。 これは、クライアントで LDAP のエラーが発生したのではなく、LDAP サーバーがキャッシュの管理の制限に達したことのみを意味しています。 場合によっては、LDAP クライアントがページング検索を破棄すると、エラーが表示されないことがあります。

ドメインで LDAP 検索エラーが発生したことがない場合は、LDAP サーバーのページ検索 Cookie プールを監視する必要がない可能性があります。 使用する環境で LDAP ページ検索に関連するエラーが確認された場合は、Cookie プールの管理者の制限に問題がある可能性があります。

イベント 2898 および 2899 は、LDAP サーバーが管理者の制限に達したかどうかを確認する唯一の方法です。 制御処理エラーが原因で LDAP クエリにエラーが発生した場合は、1 つ以上の LDAP ポリシー設定で制限を引き上げることを検討する必要があります。 取得するイベントに応じて、「Cookie プールの管理方法」セクションで制限を確認できます。

DC や LDAP サーバーにイベント 2898 が表示された場合は、MaxResultSetsPerConn を 25 に設定することをお勧めします。 1 つの LDAP 接続で 25 を超える並列ページング検索は普通ではありません。 イベント 2898 が引き続き表示される場合は、エラーが発生した LDAP クライアント アプリケーションを調査してみてください。 何らかの理由で追加のページング検索結果を取得できなくなり、Cookie が保留のまま、新しいクエリが再度開始された可能性があります。 ある時点において目的に応じた十分な Cookie がアプリケーションにあるかを確認します。 MaxResultSetsPerConn に 25 よりも大きな値を設定することもできます。 ドメイン コントローラーにイベント 2899 が記録されている場合、対処法は異なります。 DC および LDAP サーバーが、十分なメモリ (数 GB の空きメモリ) を搭載したマシンで稼動する場合、LDAP サーバーの MaxResultsetSize を 250MB 以上に設定することをお勧めします。 この制限は、非常に大規模なディレクトリであっても、大量の LDAP ページ検索に十分に対応できます。

250 MB 以上のプールでイベント 2899 が引き続き表示される場合は、非常に大量のオブジェクトを返す多数のクライアントに、非常に高い頻度でクエリを実行している可能性があります。 Active Directory のデータ コレクター セットを使用して収集できるデータは、LDAP サーバーを常にビジー状態にする、反復ページング クエリを検索するのに役立ちます。 これらのクエリで、使用したページのサイズと一致する多くの "返されたエントリ" の数が示されています。

可能であれば、アプリケーション設計を確認し、頻度、データ ボリューム、このデータを参照するクライアント インスタンスを減らした別のアプローチを使用する必要があります。 ソース コードにアクセスできるアプリケーションの場合、効率的な AD 対応アプリケーションの作成に関する記事を参照して、アプリケーションが AD にアクセスするための最適な方法を理解できます。

クエリの動作を変更できない場合は、必要な名前付けコンテキストの複製インスタンスを複数追加し、クライアントを再配布するアプローチもあります。 インスタンスをレプリケートしてクライアントを分散すると、個々の LDAP サーバーの負荷が軽減されます。