Як я можу достовірно визначити, чи має певний екземпляр SQL Server право "Сторінки блокування в пам'яті"?


12

Право "Сторінки блокування в пам'яті" може бути надано обліковому запису служби, який використовується SQL Server. Це дозволяє SQL Server запобігати пам'яті, що зберігається на диску.

Я помітив, що кілька наших машин SQL Server не мають налаштованої локальної політики, щоб дозволити це право для облікового запису служби, використовуваного SQL Server. Оскільки у нас є велика кількість серверів, то в кращому випадку буде втомлено перевіряти кожного з них за допомогою консолі управління "Місцева системна політика".

Чи є T-SQL-запит, розширена збережена процедура чи якийсь інший метод, який я можу використовувати, щоб визначити, чи має відповідний сервер чи ні?

Я хотів би, щоб НЕ використовувати , EXEC xp_readerrorlog 0, 1, 'lock memory privilege was not granted';так як вона спирається на перевірки поточного журнал помилок SQL Server; і цей журнал помилок може не містити відповідного запису, припускаючи, що журнал був перевернутий з моменту останнього перезапуску сервера. Я усвідомлюю, що міг би перевірити старі журнали, змінивши перший параметр з 0на 1тощо, однак ми зберігаємо лише 10 журналів помилок, і це може бути недостатньо. Я хочу невдалий спосіб підтвердження налаштування.

Відповіді:


11

Якщо xp_cmdshellє варіант, ось сценарій з використанням 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.exeмає можливість повідомляти про всі права, що належать виконуваному обліковому запису whoami. Це в поєднанні з xp_cmdshellнадає надійний спосіб визначити, чи має примірник SQL Server необхідне право блокування сторінок у пам'яті.

Якщо xp_cmdshellне ввімкнено, цей код повертається UNKNOWN. Припускаючи xp_cmdshell , що ввімкнено, а право ввімкнено для облікового запису SQL Server, він повертається ENABLED, інакше повертається DISABLED.


9

Є й інші методи. Можливо, ви можете використовувати два DMV. Зауважте, що обидва будуть працювати лише для SQL Server 2008 і вище.

Ненульове значення для locked_page_allocations_kbозначає, що в обліковому записі SQL Server є заблоковані сторінки в пам'яті.

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'

... і:

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

Якщо стовпець Locked_pages_allocation_KBпоказує ненульове значення, то також обліковий запис служби SQL Server має заблоковані сторінки в пам'яті.

... і:

У розділі "Менеджер пам'яті" на DBCC MEMORYSTATUSвиході буде показано ненульове значення для "Виділеного AWE" або якщо обліковий запис служби SQL Server має заблоковані сторінки в привілеї пам'яті.

ПРИМІТКА:

Якщо обліковий запис служби SQL Server працює з обліковим записом Local System (NT Authority \ System), за замовчуванням SQL Server матиме заблоковані сторінки в привілеї пам'яті.

Оновлення:

Перед SQL Server 2012 для Standard Edition нам потрібно включити прапор трассировки t -845, щоб скористатися LPIM. Навіть якщо ви використовуєте SQL Server з обліковим записом, що має привілей LPIM, SQL Server насправді не використовує перевагу LPIM, якщо не включений прапор сліду.

З 2012 року нам не потрібно вмикати прапор слідів у стандартній редакції, щоб скористатися LPIM-перевагою.


4

Microsoft полегшує це в нових версіях продукту, якщо ви дійсно хочете знати, якщо SQL Server працює з моделлю пам'яті, яка використовує переваги LPIM (на відміну від потрібного дозволу). Ця інформація знаходиться в sys.dm_os_sys_info залежно від вашої версії SQL Server. Про вдосконалення було оголошено у публікації в блозі :

Що стосується SQL Server 2016 SP1 та SQL Server 2012 SP4, до sys.dm_os_sys_info додано два нові стовпці, а саме sql_memory_model та sql_memory_model_desc, які можна використовувати для визначення, чи дозволу блокування сторінок у пам'яті (LPIM) призначено обліковому запису служби SQL Server.

Одне важливе, що слід пам’ятати, це те, що нові стовпці повідомляють про модель пам'яті sql, яка використовується з моменту запуску екземпляра SQL Server, який є бажаною інформацією. Не проводиться перевірок на рівні ОС щодо дозволів LPIM для облікового запису sql послуги. Якщо під час запуску SQL Server привілей LPIM присутній в токені облікового запису послуги сервера SQL-сервера, SQL Server використовує заблоковані сторінки (не-сторінки) для розподілу sql пам'яті. Крім того, якщо ви використовуєте Enterprise Edition SQL Server з правами LPIM, призначеними для облікового запису послуги sql та прапор трасування 834, увімкнено, SQL Server використовує великі сторінки для виділення sql пам'яті.

Щоб перевірити, чи існують привілеї Сторінки блокування в пам'яті для даного екземпляра SQL Server, ви можете запитати sql_memory_model в sys.dm_os_sys_info і шукати значення, що перевищують 1.

Якщо дозволів LPIM відсутній у маркері процесу облікового запису послуги, використовується звичайна модель пам'яті, і про те саме повідомляється DMV (sql_memory_model = 1). Якщо зараз, стопорні сторінки в привілеї пам'яті призначаються SQL серверу, але служба SQL не перезапускається, DMV продовжить звітувати про звичайну модель пам'яті, оскільки ця модель пам'яті діє з моменту запуску. Після перезавантаження SQL Server використовує заблоковані сторінки в моделі пам'яті, і про те саме повідомляється sql_memory_model та sql_memory_model_desc у sys.dm_os_sys_info.

Якщо я запускаю наступний запит на одному з моїх серверів:

SELECT sql_memory_model, sql_memory_model_desc
FROM sys.dm_os_sys_info;

Модель пам'яті, яка зараз використовується CONVENTIONAL, це означає, що LPIM не був наданий під час запуску сервера. Однак можна було б надати LPIM, але не перезапустити послугу SQL Server, тому цей DMV може бути не корисним для вас залежно від конкретного характеру вашого питання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.