Как я могу надежно определить, имеет ли данный экземпляр SQL Server право «Блокировать страницы в памяти»?

12

Право «Блокировать страницы в памяти» может быть предоставлено учетной записи службы, используемой SQL Server. Это позволяет SQL Server предотвращать разбиение памяти на диск.

Я заметил, что на некоторых наших машинах с SQL Server локальная политика не настроена так, чтобы разрешать это право для учетной записи службы, используемой SQL Server. Поскольку у нас большое количество серверов, в лучшем случае будет утомительно проверять каждый из них вручную с помощью консоли управления «Local System Policy».

Существует ли запрос 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.

FilamentUnities
источник
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 работает с учетной записью локальной системы (NT Authority \ System), по умолчанию SQL Server будет иметь заблокированные страницы в привилегии памяти.

Обновить:

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

С 2012 года нам не нужно включать флаг трассировки в стандартной версии, чтобы использовать преимущества LPIM.

Shanky
источник
4

Microsoft облегчает эту задачу в новых версиях продукта, если вы действительно хотите знать, работает ли SQL Server с моделью памяти, использующей преимущества LPIM (в отличие от наличия правильного разрешения). Эта информация находится в sys.dm_os_sys_info в зависимости от вашей версии SQL Server. Улучшение было объявлено в блоге :

В SQL Server 2016 с пакетом обновления 1 (SP1) и SQL Server 2012 с пакетом обновления 4 (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 Server, SQL Server использует заблокированные страницы (нестраничные) для выделения памяти sql. Кроме того, если вы используете SQL Server Enterprise Edition с привилегиями 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 может оказаться бесполезным для вас, в зависимости от точного характера вашего вопроса.

Джо Оббиш
источник