リモート LDAP サーバーで USNChanged ポーリングを実行し、レコードをWindows Server 2008R2 上のローカル AD LDS に同期する.NET 4.5コンソール アプリケーションを実行しています。DirSync コントロールはリモート サーバーのオプションではありませんでしたが、レコードの取得は問題ではありません。
ディレクトリは非常に大きく、何百万ものユーザー レコードが含まれています。コンソール アプリは正常にレコードを取得し、ローカル キャッシュを構築します。次に、キャッシュを介してストリーミングし、ローカル ディレクトリの各レコードに対して必要に応じて検索/更新/挿入を行います。環境内のさまざまなネットワークの制約により、1 秒あたり 8 ~ 80 レコードのパフォーマンスが実行されました。その結果、Task Parallel Library を使用してパフォーマンスを向上させました。
var totalThreads = Environment.ProcessorCount *2;
var options = new ParallelOptions { MaxDegreeOfParallelism = totalThreads };
Parallel.ForEach(Data.ActiveUsersForSync.Batch(250), options, (batch, loopstate) =>
{
if (!loopstate.IsExceptional
&& !loopstate.IsStopped
&& !loopstate.ShouldExitCurrentIteration)
{
ProcessBatchSync(batch);
}
});
このブロックを導入した後、パフォーマンスは 1 秒あたり 1000 ~ 1500 レコードに向上しました。いくつかの重要な注意事項:
- これは 8 コア マシンで実行されているため、最大 16 の操作を同時に実行できます。
Environment.ProcessorCount * 2;
- MoreLinq ライブラリのバッチ処理メカニズムが使用されるため、並列セット内の各タスクは、(プールからの) 特定の接続で 250 レコードを処理してから戻ります。
- 各バッチは同期的に処理されます (追加の並列処理はありません)
- 実装は、System.DirectoryServices (ADSI) ではなく、System.DirectoryServices.Protocols (Win32) に依存しています。
定期的な完全同期が実行されるたびに、システムは約 110 万のレコードを取得し、AD LDS は「サーバーはビジーです」を返し、システムは DirectoryOperationException をスローします。エラーになる前に完了する数は一定ではありませんが、常に 110 万近くになります。
Microsoft ( http://support.microsoft.com/kb/315071 ) によると、AD LDS の MaxActiveQueries 値は、Windows Server 2008 以降では適用されなくなりました。とにかく値を変更することはできません。表示されません。また、「サーバーがビジーです」というエラーが、その値に違反した場合、または接続ごとに開いている通知要求が多すぎる場合にのみ返されることも示しています。このコードは単純な検索/更新/挿入 LDAP コマンドのみを送信し、何かが変更されたときにサーバーからの通知を要求しません。
私が理解しているように、LDS をクエリするために、最大 16 のスレッドが連携して動作しています。彼らはそれを非常に迅速に行っていますが、これらはそれぞれシングルスレッドで処理されるため、これは特定のティックで受信するクエリの最大数です。
マイクロソフトのドキュメントは間違っていますか? ここで別のコンポーネントを誤解していますか? 任意の支援をいただければ幸いです。