Como são tratados os cookies de servidor LDAP
No protocolo LDAP, algumas consultas resultam em um grande conjunto de resultados. Essas consultas apresentam alguns desafios para o Windows Server.
Coletar e criar esses grandes conjuntos de resultados é um trabalho significativo. Muitos dos atributos precisam ser convertidos de uma representação interna para a representação eletrônica do protocolo LDAP. Para muitos atributos, uma conversão de um formato interno, geralmente binário, deve acontecer em um formato de texto UTF-8 no quadro da resposta do protocolo LDAP.
Outro desafio são os conjuntos de resultados com dezenas de milhares de objetos que se tornam enormes, chegando facilmente a várias centenas de megabytes. Estes, então, exigem muito espaço de endereço virtual. A transferência pela rede encontra problemas porque todo o esforço é perdido quando a sessão TCP é interrompida em trânsito.
Essas questões de capacidade e logística encorajaram os desenvolvedores do Microsoft LDAP a criar uma extensão LDAP conhecida como "Consulta Paginada". A Consulta Paginada implementa um controle LDAP para separar uma consulta enorme em blocos de conjuntos de resultados menores. A Consulta Paginada é um padrão RFC: RFC 2696.
Manipulação de cookies no cliente
O método de Consulta Paginada usa o tamanho da página definida pelo cliente ou por uma Política LDAP ("MaxPageSize"). O cliente sempre precisa habilitar a paginação enviando um controle LDAP.
Ao trabalhar em uma consulta com muitos resultados, eventualmente o número máximo de objetos permitidos será atingido. O servidor LDAP empacota a mensagem de resposta e adiciona um cookie que contém as informações necessárias para continuar posteriormente a pesquisa.
O aplicativo cliente deve tratar o cookie como um blob opaco. Ele pode recuperar a contagem de objetos na resposta e pode continuar a pesquisa com base na presença do cookie. Para continuar a pesquisa. o cliente envia a mesma consulta para o servidor LDAP, incluindo o valor de cookie da resposta anterior.
Se o número de objetos não preencher uma página, a consulta LDAP será concluída e a resposta não conterá nenhum cookie na página. Se nenhum cookie for retornado pelo servidor, o cliente deve considerar a pesquisa paginada como concluída com êxito.
Se o servidor retornar um erro, o cliente deverá considerar a pesquisa paginada malsucedida. Repetir a pesquisa resultará no reinício da pesquisa na primeira página.
Manipulação de cookie do lado do servidor
O Windows Server retorna o cookie para o cliente e, às vezes, armazena informações relacionadas ao cookie no servidor. Essas informações são armazenadas no servidor em um cache e estão sujeitas a determinados limites.
Nesse caso, o cookie enviado ao cliente pelo servidor também é usado pelo servidor para pesquisar as informações do cache no servidor. Quando o cliente continua a pesquisa paginada, o Windows Server usa o cookie do cliente e qualquer informação relacionada do cache do cookie do servidor para continuar a pesquisa. Se o servidor não conseguir localizar as informações relacionadas ao cookie no cache do servidor por qualquer motivo, a pesquisa será interrompida e o erro será retornado ao cliente.
Como o pool de cookies é gerenciado
Obviamente, o servidor LDAP está atendendo mais de um cliente por vez. Além disso, mais de um cliente por vez pode iniciar consultas que requerem o uso do cache de cookie do servidor. Portanto, na implementação do Windows Server, há um rastreamento do uso do pool de cookies e os limites são estabelecidos para que o pool de cookies não consuma muitos recursos. Os administradores podem definir limites usando as seguintes configurações na Política LDAP. As explicações e os padrões são como a seguir.
MinResultSets: 4
O servidor LDAP não examina o tamanho máximo do pool quando há menos do que MinResultSets entradas no cache de cookies do servidor.
MaxResultSetSize: 262.144 bytes
O tamanho do cache total de cookie no servidor não deve exceder o máximo de MaxResultSetSize em bytes. Em caso afirmativo, os cookies são excluídos começando pelos mais antigos até que o pool seja menor do que MaxResultSetSize bytes ou menor que MinResultSets cookies estejam no pool. Ao usar as configurações padrão, o servidor LDAP considerará um pool de 450 KB como OK se houver apenas 3 cookies armazenados.
MaxResultSetsPerConn: 10
O servidor LDAP permite no máximo MaxResultSetsPerConn cookies por conexão LDAP no pool.
Manuseio de cookies excluídos
A remoção de informações de cookies do cache do servidor LDAP não resulta em um erro imediato para os aplicativos em todos os casos. Os aplicativos podem reiniciar a pesquisa paginável desde o início e concluí-la em outra tentativa. Alguns aplicativos têm esse tipo de um mecanismo de repetição para maior robustez.
Alguns aplicativos podem passar por uma pesquisa de página e nunca concluí-la. Essa pesquisa incompleta pode deixar entradas no cache de cookies do servidor LDAP, que são tratadas por meio do mecanismo descrito anteriormente. Esse mecanismo é essencial para liberar memória no servidor para pesquisas LDAP ativas.
O que acontece quando esse cookie é excluído do servidor e o cliente continua a pesquisa com esse identificador de cookie? O servidor LDAP não encontra o cookie no cache de cookie do servidor e retorna um erro para a consulta. A resposta de erro é semelhante a:
00000057: LdapErr: DSID-xxxxxxxx, comment: Error processing control, data 0, v1db1
Observação
O valor hexadecimal por trás do "DSID" varia dependendo da versão de build dos binários do servidor LDAP.
Relatórios sobre o pool de cookies
O servidor LDAP tem a capacidade de registrar eventos por categoria 16 Ldap Interface
na Chave de diagnóstico NTDS. Se você definir esta categoria como 2
, poderá obter os seguintes eventos:
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.
Os eventos sinalizam que um cookie armazenado foi removido. Isso NÃO significa que um cliente obteve o erro de LDAP, mas apenas que o servidor LDAP atingiu os limites de administração para o cache. Em alguns casos, um cliente LDAP pode ter abandonado a pesquisa paginável e nunca mostrará o erro.
Monitorando o pool de cookies
Se você nunca tiver erros de pesquisa LDAP no seu domínio, pode nunca ser necessário monitorar o pool de cookies de pesquisa de página do servidor do LDAP. Caso receba erros relacionados à pesquisa de página de LDAP no seu ambiente, pode haver um problema com os limites de administrador do pool de cookies.
Os eventos 2898 e 2899 são a única maneira de saber que o servidor LDAP atingiu os limites de administrador. Quando você tiver esse erro de consulta LDAP devido ao erro de processamento de controle, considere aumentar os limites em uma ou mais configurações de política LDAP. Você pode encontrar os limites na seção Como o pool de cookies é gerenciado, dependendo de qual evento você está obtendo.
Se você estiver vendo o evento 2898 em seu servidor DC/LDAP, recomendamos definir MaxResultSetsPerConn como 25. Mais de 25 pesquisas em páginas paralelas em uma única conexão LDAP não são comuns. Se você continuar vendo eventos 2898, investigue o aplicativo de cliente LDAP que encontra o erro. A suspeita seria que, de alguma forma, ele trave ao recuperar mais resultados paginados, deixe o cookie pendente e reinicie uma nova consulta. Veja se o aplicativo teria, em algum momento, cookies suficientes para suas finalidades. Você também pode aumentar o valor de MaxResultSetsPerConn para além de 25. Quando você vir os eventos 2899 registrados em seus controladores de domínio, o plano seria diferente. Se o servidor LDAP/DC é executado em um computador com memória suficiente (vários GBs de memória livre), recomendamos que você defina o MaxResultsetSize no servidor LDAP como >= 250 MB. Esse limite é grande o suficiente para acomodar grandes volumes de pesquisas de página LDAP mesmo em diretórios muito grandes.
Se você ainda estiver vendo os eventos 2899 com um pool de 250 MB ou mais, provavelmente terá muitos clientes com um número muito alto de objetos retornados, consultados com frequência. Os dados que você pode obter com o Conjunto de coletores de dados de diretório ativo podem ajudar a localizar consultas paginadas repetitivas que mantêm seus servidores LDAP ocupados. Essas consultas são exibidas com um número de "Entradas retornadas" que corresponde ao tamanho da página usada.
Se possível, você deve revisar o design do aplicativo e implementar uma abordagem diferente com menor frequência, volume de dados e/ou menos instâncias de cliente consultando esses dados. Se houver aplicativos para os quais você tem acesso ao código-fonte, confira Criação de aplicativos habilitados para AD eficientes para obter ajuda para entender a maneira ideal para os aplicativos acessarem o AD.
Se o comportamento da consulta não puder ser alterado, uma abordagem também é adicionar mais instâncias replicadas dos contextos de nomenclatura necessários e redistribuir os clientes. Replicar a instância e distribuir o cliente poderá reduzir a carga nos servidores LDAP individuais.