Как избежать DirectoryOperationException: сервер занят, когда USNChange Poll-Синхронизация каталога AD LDS

Мы запускаем консольное приложение .NET 4.5, которое выполняет опрос USNChanged на удаленном сервере LDAP, а затем синхронизирует записи в локальном AD LDS на Windows Server 2008R2. Элемент управления DirSync не был опцией на удаленном сервере, но получение записей не является проблемой.

Каталог довольно большой, содержит миллионы пользовательских записей. Консольное приложение успешно записывает записи и создает локальный кеш. Затем он проходит через кэш и выполняет поиск / обновление / вставку, как требуется для каждой записи в локальном каталоге. Различные сетевые ограничения в среде имели производительность от 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);
            }
     });

После введения этого блока производительность возросла до 1000-1500 записей в секунду. Некоторые важные замечания:

  1. Это выполняется на восьмиъядерном компьютере, поэтому позволяет одновременно выполнять до 16 операций. Environment.ProcessorCount * 2;
  2. Используется механизм пакетирования библиотеки MoreLinq, поэтому каждая задача в параллельном наборе обрабатывает 250 записей для данного соединения (из пула) перед возвратом.
  3. Каждая партия обрабатывается синхронно (без дополнительного параллелизма)
  4. Реализация опирается на System.DirectoryServices.Protocols (Win32), а не System.DirectoryServices (ADSI)

Всякий раз, когда выполняется периодическая полная синхронизация, система проходит около 1,1 миллиона записей, а затем AD LDS возвращает "Сервер занят", и система выдает исключение DirectoryOperationException. Число, которое он завершает до появления ошибки, не является постоянным, но всегда составляет около 1,1 миллиона.

Согласно Microsoft ( http://support.microsoft.com/kb/315071) значение MaxActiveQueries в AD LDS больше не применяется в Windows Server 2008+. Я не могу изменить значение в любом случае, это не показывает. Они также показывают, что ошибка "Сервер занят" возвращается только из-за нарушения этого значения или из-за слишком большого количества открытых уведомлений на соединение. Этот код отправляет только простые команды поиска / обновления / вставки LDAP и не запрашивает уведомления от сервера, когда что-то меняется.

Насколько я понимаю, у меня есть не более 16 потоков, работающих в тандеме для запроса LDS. Хотя они делают это очень быстро, это максимальное количество запросов, приходящих на данный тик, поскольку каждый из них обрабатывается однопоточным.

Документ Microsoft неверен? Я неправильно понимаю другой компонент здесь? Любая помощь приветствуется.

0 ответов

Другие вопросы по тегам