如何處理 LDAP 伺服器 Cookie

適用於:Windows Server 2022、Windows Server 2019、Windows Server 2016、Windows Server 2012 R2、Windows Server 2012

在 LDAP 中,某些查詢會產生大型結果集。 此類查詢會對 Windows Server 帶來某些挑戰。

收集和建置這些巨型結果集是很重要的工作。 許多屬性必須從內部表示法轉換為 LDAP 有線表示法。 對於許多屬性,必須從通常為二進位的內部格式轉換為 LDAP 回應框架中的 UTF-8 文字格式。

另一個挑戰是擁有成千上萬個物件的結果集需要大量的儲存空間,至少有數百 MB。 然後,這些需要大量的虛擬位址空間。 透過網路的傳輸會遇到問題,因為當 TCP 工作階段在傳輸中中斷時,會遺失整個工作。

這些容量和傳輸問題促使 Microsoft LDAP 開發人員創造出稱為「分頁查詢」的 LDAP 延伸模組。 「分頁查詢」會實作一個 LDAP 控制項,將一個大型查詢拆開成為較小型的結果集區塊。 分頁查詢是 RFC 標準:RFC 2696

分頁查詢方法使用由用户端設定或透過 LDAP 原則 ("MaxPageSize")。 用户端一律需要透過傳送 LDAP 控制項才能啟用分頁。

在處理具有許多結果的查詢時,某些時候會達到允許的物件數目上限。 LDAP 伺服器會將回應訊息封裝起來,再加上一個 Cookie,其中包含稍後繼續搜尋所需的資訊。

用户端應用程式必須將 Cookie 視為不透明的 Blob。 其可以擷取回應中的物件計數,並根據 Cookie 的存在繼續搜尋。 以繼續搜尋。 用戶端會將相同的查詢傳送至 LDAP 伺服器,包括來自先前回應的 Cookie 值。

如果物件數目無法填滿頁面,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 的最大值 (以位元組為單位)。 如果超過,則會從最舊的 Cookie 開始刪除,直到集區小於 MaxResultSetSize 位元組或集區中少於 MinResultSets 個 Cookie。 使用預設設定時,LDAP 伺服器會認為只儲存了 3 個 Cookie 的 450KB 集區是適當的。

MaxResultSetsPerConn: 10

LDAP 伺服器不允許集區中每個 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" 後面的十六進位值會依 LDAP 伺服器二進位的建置版本而異。

LDAP 伺服器能夠透過 NTDS 診斷金鑰中的 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 查詢錯誤時,您應該考慮增加一或多個 LDAP 原則設定的限制。 您可以根據您取得的事件,在 Cookie 集區管理方式一節中找到限制。

如果您的 DC/LDAP 伺服器上出現事件 2898,建議您將 MaxResultSetsPerConn 設為 25。 單一 LDAP 連線中超過 25 個並行分頁搜尋並不常見。 如果您持續看到事件 2898,請調查發生錯誤的 LDAP 用戶端應用程式。 有可能在擷取其他分頁結果時停滯住了,因而讓 Cookie 擱置,並重新啟動一個新查詢。 查看應用程式在某些時候是否有足夠的 Cookie 可供其用途使用。 您也可以將 MaxResultSetsPerConn 的值增加到 25 以上。 當您看到事件 2899 已登入網域控制站時,方案會有所不同。 如果 DC/LDAP 伺服器在具有足夠記憶體 (數 GB 可用記憶體) 的機器上執行,建議您將 LDAP 伺服器的 MaxResultsetSize 設定為 >=250MB。 此上限已夠大,足以容納在極大目錄上進行的大量 LDAP 頁面搜尋。

如果在 250MB 以上的集區中仍然出現事件 2899,則您可能有許多用戶端以很頻繁的方式進行查詢,並傳回大量物件。 您可以使用 Active Directory 資料收集器集合工具收集的資料,可協助您尋找重複的分頁查詢,讓您的 LDAP 伺服器保持忙碌。 這些查詢會顯示出符合所用頁面大小的「傳回的項目」數。

可能的話,您應該檢閱應用程式設計,並使用較低的頻率、資料量和/或較少的用戶端執行個體來實作不同的方法,以查詢此資料。 如果您有原始程式碼存取的應用程式,請參閱建立有效率的 AD 啟用應用程式,以協助了解應用程式存取 AD 的最佳方式。

如果無法變更查詢行為,還有另一個方法,您可以增加所需命名內容的複寫執行個體,並重新分配用戶端。 複寫執行個體並散發用戶端可降低各 LDAP 伺服器上的負載。