如何可靠地确定给定的 SQL Server 实例是否具有“内存中的锁定页面”?

Han*_*non 13 sql-server sql-server-2008-r2 sql-server-2012

可以将“Lock Pages in Memory”权限授予 SQL Server 使用的服务帐户。这允许 SQL Server 防止内存被分页到磁盘。

我注意到我们的一些 SQL Server 机器没有配置本地策略来为 SQL Server 使用的服务帐户允许此权限。由于我们拥有大量服务器,因此使用“本地系统策略”管理控制台手动检查每台服务器至多是乏味的。

是否有 T-SQL 查询、扩展存储过程或其他一些我可以用来确定有问题的服务器是否正确的方法?

不想使用,EXEC xp_readerrorlog 0, 1, 'lock memory privilege was not granted';因为它依赖于检查当前的 SQL Server 错误日志;并且该错误日志可能不包含相关条目,假设自服务器上次重新启动以来日志已被翻转。我意识到我可以通过修改第一个参数0to1等来检查旧日志,但是我们只保留 10 个错误日志,这可能还不够。我想要一种确认设置的故障安全方式。

Fil*_*ies 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;
Run Code Online (Sandbox Code Playgroud)

whoami.exe有能力报告执行帐户所拥有的所有权利whoami。这与xp_cmdshell提供了一种可靠的方法来确定 SQL Server 实例是否具有在内存中锁定页面的必要权限。

如果xp_cmdshell未启用,则此代码返回UNKNOWN。假设xp_cmdshell 启用,并且为 SQL Server 帐户启用了权限,则返回ENABLED,否则返回DISABLED


Sha*_*nky 11

还有其他方法。也许您可以使用两个 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'
Run Code Online (Sandbox Code Playgroud)

...和:

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
Run Code Online (Sandbox Code Playgroud)

如果列Locked_pages_allocation_KB显示非零值,则 SQL Server 服务帐户也具有内存权限中的锁定页面。

...和:

输出的“内存管理器”部分DBCC MEMORYSTATUS将显示“AWE 分配”的非零值,或者如果 SQL Server 服务帐户在内存特权中具有锁定页面。

笔记:

如果 SQL Server 服务帐户使用本地系统 (NT Authority\System) 帐户运行,默认情况下 SQL Server 将具有内存中的锁定页面特权。

更新:

在 SQL Server 2012 for Standard Edition 之前,我们需要启用跟踪标志 t -845 以利用 LPIM。即使您使用具有 LPIM 权限的帐户运行 SQL Server,SQL Server 也不会实际使用 LPIM 优势,除非启用了跟踪标志。

从 2012 年开始,我们不需要在标准版中启用跟踪标志来利用 LPIM。


Joe*_*ish 6

如果您真正想知道的是 SQL Server 是否使用利用 LPIM 的内存模型运行(而不是拥有正确的权限),则 Microsoft 在该产品的较新版本中使这更容易。此信息位于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 Server 实例启动以来使用的 sql 内存模型,这是所需的信息。没有在操作系统级别对 sql 服务帐户的 LPIM 权限执行检查。如果在 SQL Server 启动期间,SQL Server 服务帐户进程令牌中存在 LPIM 权限,则 SQL Server 使用锁定页面(不可分页)来分配 sql 内存。此外,如果您正在运行企业版 SQL Server,并将 LPIM 权限分配给 sql 服务帐户并打开跟踪标志 834,则 SQL Server 使用大页面来分配 sql 内存。

要检查内存中的锁定页面权限是否对给定的 SQL Server 实例有效,您可以查询 sys.dm_os_sys_info 中的 sql_memory_model 并查找大于 1 的值。

如果服务帐户进程令牌中缺少 LPIM 权限,则使用常规内存模型,并且 DMV 报告相同(sql_memory_model = 1)。如果现在,内存权限中的锁定页被分配给 SQL 服务器,但 SQL 服务没有重新启动,DMV 将继续报告常规内存模型,因为这是自启动以来生效的内存模型。重新启动后,SQL Server 使用内存模型中的锁定页面,并且 sys.dm_os_sys_info 中的 sql_memory_model 和 sql_memory_model_desc 报告相同。

如果我在其中一台服务器上运行以下查询:

SELECT sql_memory_model, sql_memory_model_desc
FROM sys.dm_os_sys_info;
Run Code Online (Sandbox Code Playgroud)

当前使用的内存模型是CONVENTIONAL,这意味着在服务器启动时未授予 LPIM。但是,可以授予 LPIM 但不重新启动 SQL Server 服务,因此根据您问题的确切性质,此 DMV 可能对您没有用。