Jak mogę w wiarygodny sposób ustalić, czy dana instancja programu SQL Server ma prawo „Blokuj strony w pamięci”?

12

Prawo „Zablokuj strony w pamięci” może zostać przyznane dla konta usługi używanego przez SQL Server. Dzięki temu SQL Server zapobiega stronicowaniu pamięci na dysk.

Zauważyłem, że kilka naszych maszyn SQL Server nie ma skonfigurowanych lokalnych zasad, aby zezwolić na to prawo dla konta usługi używanego przez SQL Server. Ponieważ mamy dużą liczbę serwerów, w najlepszym wypadku nudne będzie ręczne sprawdzanie każdego z nich za pomocą konsoli zarządzania „Lokalne zasady systemowe”.

Czy istnieje zapytanie T-SQL, rozszerzona procedura składowana lub inna metoda, której mogę użyć do ustalenia, czy dany serwer ma prawo, czy nie?

Chciałbym aby nie używać EXEC xp_readerrorlog 0, 1, 'lock memory privilege was not granted';, ponieważ opiera się na sprawdzeniu aktualny dziennik błędów SQL Server; a ten dziennik błędów może nie zawierać odpowiedniego wpisu, zakładając, że dziennik został przywrócony od ostatniego uruchomienia serwera. Zdaję sobie sprawę, że mogłem sprawdzić starsze dzienniki, modyfikując pierwszy parametr od 0do 1itp., Jednak zachowujemy tylko 10 dzienników błędów, co może nie wystarczyć. Chcę w bezpieczny sposób potwierdzić ustawienie.

Max Vernon
źródło

Odpowiedzi:

11

Jeśli xp_cmdshelljest to opcja, oto skrypt wykorzystujący whoami:

DECLARE @LockPagesInMemory VARCHAR(255);
SET @LockPagesInMemory = 'UNKNOWN';
DECLARE @Res TABLE
(
    [output] NVARCHAR(255) NULL
);

IF (SELECT value_in_use
    FROM sys.configurations c
    WHERE c.name = 'xp_cmdshell'
    ) = 1
BEGIN
    INSERT INTO @Res
    EXEC xp_cmdshell 'WHOAMI /PRIV';

    IF EXISTS (SELECT *
        FROM @Res 
        WHERE [output] LIKE 'SeLockMemoryPrivilege%'
        )
        SET @LockPagesInMemory = 'ENABLED';
    ELSE
        SET @LockPagesInMemory = 'DISABLED';
END

SELECT LockPagesInMemoryEnabled = @LockPagesInMemory;

whoami.exema możliwość zgłaszania wszystkich praw posiadanych przez wykonującego konto whoami. W połączeniu z tym xp_cmdshellzapewnia niezawodny sposób ustalenia, czy wystąpienie programu SQL Server ma niezbędne prawo do blokowania stron w pamięci.

Jeśli xp_cmdshellnie jest włączony, ten kod zwraca UNKNOWN. Zakładając, że xp_cmdshell jest włączone, i prawo jest włączone dla konta SQL Server, zwraca ENABLED, w przeciwnym razie zwraca DISABLED.

FilamentUnities
źródło
9

Istnieją również inne metody. Być może możesz użyć dwóch DMV. Należy pamiętać, że oba będą działać tylko dla SQL Server 2008 i nowszych wersji.

Niezerowa wartość dla oznacza locked_page_allocations_kb, że konto SQL Server ma Zablokowane strony w pamięci.

select osn.node_id, 
osn.memory_node_id, 
osn.node_state_desc, 
omn.locked_page_allocations_kb
from sys.dm_os_memory_nodes omn
inner join sys.dm_os_nodes osn on (omn.memory_node_id = osn.memory_node_id)
where osn.node_state_desc <> 'ONLINE DAC'

...i:

select
(physical_memory_in_use_kb/1024)Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 )Locked_pages_used_Sqlserver_MB,
(total_virtual_address_space_kb/1024 )Total_VAS_in_MB,
process_physical_memory_low,
process_virtual_memory_low
from sys.dm_os_process_memory

Jeśli kolumna Locked_pages_allocation_KBpokazuje niezerową wartość, wówczas również konto usługi SQL Server ma Zablokowane strony w pamięci.

...i:

Sekcja „Menedżer pamięci” danych DBCC MEMORYSTATUSwyjściowych pokaże niezerową wartość dla „AWE Allocated” lub jeśli konto usługi SQL Server ma zablokowane strony w pamięci.

UWAGA:

Jeśli konto usługi SQL Server działa z kontem System lokalny (NT Authority \ System), domyślnie SQL Server będzie miał zablokowane strony z uprawnieniami do pamięci.

Aktualizacja:

Przed SQL Server 2012 dla Standard Edition musimy włączyć flagę śledzenia t-845, aby skorzystać z LPIM. Nawet jeśli korzystasz z SQL Server z kontem mającym uprawnienia LPIM, SQL Server tak naprawdę nie skorzystałby z zalet LPIM, chyba że włączona jest flaga śledzenia.

Od 2012 roku nie musimy włączać flagi śledzenia w standardowej edycji, aby skorzystać z LPIM.

Shanky
źródło
4

Microsoft ułatwia to w nowszych wersjach produktu, jeśli tak naprawdę chcesz wiedzieć, czy SQL Server działa z modelem pamięci korzystającym z LPIM (w przeciwieństwie do posiadania odpowiednich uprawnień). Te informacje są w sys.dm_os_sys_info w zależności od wersji SQL Server. Ulepszenie zostało ogłoszone w poście na blogu :

W SQL Server 2016 SP1 i SQL Server 2012 SP4 istnieją dwie nowe kolumny, a mianowicie sql_memory_model i sql_memory_model_desc dodane do sys.dm_os_sys_info, których można użyć do określenia, czy uprawnienia blokady stron w pamięci (LPIM) są przypisane do konta usługi SQL Server.

Jedną ważną rzeczą, o której należy pamiętać, są nowe kolumny raportujące używany model pamięci SQL od uruchomienia instancji SQL Server, która jest pożądaną informacją. Na poziomie systemu operacyjnego nie są sprawdzane uprawnienia LPIM dla konta usługi sql. Jeśli podczas uruchamiania programu SQL Server przywilej LPIM jest obecny w tokenie procesu konta usługi serwera SQL, SQL Server używa zablokowanych stron (nie stronicowanych) do przydzielenia pamięci SQL. Ponadto, jeśli korzystasz z wersji SQL Server Enterprise z uprawnieniami LPIM przypisanymi do konta usługi SQL i włączoną flagą śledzenia 834, SQL Server używa dużych stron do przydzielania pamięci SQL.

Aby sprawdzić, czy dla danej instancji programu SQL Server obowiązuje uprawnienie Blokuj strony w pamięci, można wykonać kwerendę model_pamięci_sql w sys.dm_os_sys_info i poszukać wartości większych niż 1.

Jeśli w tokenie procesu konta usługi brakuje uprawnień LPIM, używany jest konwencjonalny model pamięci i to samo raportuje DMV (sql_memory_model = 1). Jeśli teraz zablokowane strony z uprawnieniami do pamięci są przypisane do serwera SQL, ale usługa SQL nie zostanie ponownie uruchomiona, DMV będzie nadal raportować konwencjonalny model pamięci, ponieważ jest to model pamięci obowiązujący od momentu uruchomienia. Po ponownym uruchomieniu SQL Server używa zablokowanych stron w modelu pamięci i to samo jest zgłaszane przez sql_memory_model i sql_memory_model_desc w sys.dm_os_sys_info.

Jeśli uruchomię następujące zapytanie na jednym z moich serwerów:

SELECT sql_memory_model, sql_memory_model_desc
FROM sys.dm_os_sys_info;

Obecnie używany model pamięci CONVENTIONAL, co oznacza, że ​​LPIM nie został przyznany w momencie uruchamiania serwera. Można jednak przyznać LPIM, ale nie zrestartować usługi SQL Server, więc ten DMV może nie być dla Ciebie przydatny w zależności od dokładnej natury pytania.

Joe Obbish
źródło