Sunday, May 17th, 2009...11:55 pm
OU a wydajność zapytań LDAP
Karol (przy okazji okazało się że prowadzi bloga, o którym nie wiedziałem ale już dodałem do subskrypcji) podrzuca mi czasami przy okazji spotkań lub przez e-mail ciekawe pytania. Tym razem podesłał mi pytanie następujące:
Co jest wydajniejsze dla samego LDAP w AD:
* duża ilość obiektów w jednym OU ( jakieś 10-20tys. kont)
* wiele OU w obrębie głównego OU i w nich mniejsze ilości
obiektów(20 OU i w każdym po 1000 kont)?
Odpowiedziałem mu również przez e-mail ale pomyślałem, że temat może jeszcze kogoś zainteresować więc i tutaj go opiszę.

Krótka odpowiedź na tak postawione pytanie jest następująca: “Z punktu widzenia operacji LDAP na bazie danych katalogu to nie ma znaczenia”. Kropka.
To teraz odpowiedź dłuższa, czyli klasyczne szkolne rozwinięcie i uzasadnienie ;).
Laboratorium …
Na potrzeby ćwiczenia utworzyłem dwa OU, w jednym umieściłem 20 tys obiektów użytkowników, w drugim 20 następnych OU a w każdym z nich po 1 tys użytkowników.
Mała dygresja – w celach czysto ćwiczebnych pierwsze 20 tys użytkowników założyłem korzystając z admod.exe w drugim zaś przypadku, zarówno OU jak i użytkowników założyłem korzystając z nowych poleceń Powershell z W2008R2. Wygoda podobna, polecenie admod było krótkie (dzięki wbudowanym skrótom), skrypt PoSh miał jakieś 4 linijki. Następnym razem zmierzę jeszcze czas operacji dla porównania.
Krótkie ćwiczenie polegało na wykonaniu podobnego zapytania LDAP, wyszukującego 1 użytkownika po jego nazwie logowania w każdym z OU. Wykonałem je przy pomocy ADFIND i następującej składni:
adfind -b <OU> -s subtree -f "(samaccountname=<nazwa użytkownika>)" -stats+only
Przełącznik -statst+only powoduje, że wynikiem zapytania będą tylko statystyki zapytania (dla tych od SQLa, na przykład Pawła gdyby się tutaj zabłąkał – to coś jak execution plan ;))
#1 – wyszukanie użytkownika w ramach 20 tys. obiektów w pojedynczym OU
Statistics
=================================
Elapsed Time: 47 (ms)
Returned 1 entries of 1 visited - (100.00%)Used Filter:
(sAMAccountName=1038_testusr)Used Indices:
idx_sAMAccountName:1:NPages Referenced : 31
Pages Read From Disk : 1
Pages Pre-read From Disk: 0Analysis
———————————
Hit Rate of 100.00% is EfficientIndices used:
Index Name : idx_sAMAccountName
Record Count: 1 (estimate)
Index Type : Normal Attribute Index
#2 – wyszukanie użytkownika w ramach 20 tys. obiektów rozłożonych po wielu OU
Statistics
=================================
Elapsed Time: 0 (ms)
Returned 1 entries of 1 visited - (100.00%)Used Filter:
(sAMAccountName=11520_user)Used Indices:
idx_sAMAccountName:1:NPages Referenced : 33
Pages Read From Disk : 0
Pages Pre-read From Disk: 0Analysis
———————————
Hit Rate of 100.00% is EfficientIndices used:
Index Name : idx_sAMAccountName
Record Count: 1 (estimate)
Index Type : Normal Attribute Index
Na pierwszy rzut oka widać że zarówno efektywność zapytań, jak i użyte indeksy nie różnią się pomiędzy sobą. W drugim przypadku jednak czas zapytania jest o wiele dłuższy. Czy winę za to ponosi fakt, że 20 tys. obiektów znajdowało się w pojedynzym kontenerze? Otóż nie i mogłem tutaj przedstawić dw aidentyczne wyniki ale wybrałem ten właśnie w celach dydaktycznych. W pierwszym przypadkiem elementem kluczowym dla wydajności zapytania jest ten element:
Pages Read From Disk : 1
Oznacza to, że wynik zapytania nie znajdował się w pamięci operacyjnej i konieczne było odczytanie z dysku jednej strony bazy danych katalogu. Powtórzmy to zapytanie raz jeszcze:
Statistics
=================================
Elapsed Time: 0 (ms)
Returned 1 entries of 1 visited - (100.00%)Used Filter:
(sAMAccountName=1038_testusr)Used Indices:
idx_sAMAccountName:1:NPages Referenced : 27
Pages Read From Disk : 0
Pages Pre-read From Disk: 0Analysis
———————————
Hit Rate of 100.00% is EfficientIndices used:
Index Name : idx_sAMAccountName
Record Count: 1 (estimate)
Index Type : Normal Attribute Index
Jak widać w tym wypadku wynik już jest zdecydowanie lepszy. Wynika to z faktu, że raz odczytane dane są (o ile to możliwe) w pamięci operacyjnej w ramach cache procesu lsass.exe.
Przy okazji, możliwość prezentacji statystyk dostępu do dysków (w zasadzie stron bazy danych) w statystykach LDAP to nowość w Windows 2008.
Wnioski …
Czego to ćwiczenie dowodzi? Jeżeli spojrzymy tylko i wyłącznie na wydajność operacji LDAP to widzimy, że przy odpowiednio zadanym zapytaniu (indeksy) rozłożeni obiektów w katalogu nie ma znaczenia. Należy pamiętać, że pod warstwą LDAP katalogu jest silnik bazy danych ESE i to tam wykonywane są operacje związane z wyszukiwaniem obiektów itp. Tak więc hierarchia obiektów nie będzie miała tutaj większego znaczenia. To co ma znaczenie to efektywność zadawanych zapytań oraz ewentualnie konfiguracja i wykorzystanie zasobów systemowych.
Wnioski z ćwiczenia są więc następujące:
- Dla wydajności operacji wykonywanych na bazie danych katalogu nie jest ważne rozłożenie obiektów w strukturze logicznej tegoż. To co jest istotne, jak w przypadku każdej bazy danych, to wykorzystanie odpowiednich indeksów i zadawanie efektywnych zapytań LDAP oraz o ile to możliwe ograniczenie odwołań do dysku (patrz następny punkt).
- W przypadku serwerów pełniących rolę kontrolerów domeny warto zadbać o to, aby posiadały one taką ilość pamięci RAM aby jak najwięcej danych z bazy DIT mogło zostać umieszzone w pamięci podręcznej. W przypadku baz danych DIT zbliżających się do 3GB należy użyć systemów 64-bitowych w celu zapewnienia odpowiednich możliwości adresowania pamięci > 3GB.
I tym dzisiejsze laboratorium zakończymy.

2 Comments
May 18th, 2009 at 8:44 am
Kurcze i narobiłem ci pracy związanej z przygotowaniem labu:( Wpis fajny, dzięki wielkie:)
May 18th, 2009 at 10:50 am
@Kaarol
Spoko, żadnej pracy dodatkowej nie było - i tak przebudowywałem wszystko na Hyper-V
Leave a Reply