最大服务器内存选项仅限制 SQL Server 缓冲池的大小。 最大服务器内存选项不限制 SQL Server 为分配其他组件(例如,扩展存储过程、COM 对象、非共享 DLL 和 EXE)而保留的剩余未预留内存区域。
SQL Server 可动态使用内存。 但是,也可手动设置内存选项并限制 SQL Server 可访问的内存量。 在设置 SQL Server 的内存量之前,请确定适当的内存设置,方法是从总物理内存中减去操作系统 (OS) 所需的内存(即不受“最大服务器内存(MB)”设置控制的内存分配)和任何其他 SQL Server 实例所需的内存(如果服务器上有其他使用内存的应用程序,包括其他 SQL Server 实例,则还要减去其他系统使用的内存量)。 这个差值就是可以分配给当前 SQL Server 实例使用的最大内存量。
SQL Server 不会在启动时立即分配在“最小服务器内存(MB)”中指定的内存量。 不过,除非调低“最小服务器内存(MB)”的值,否则当内存使用量由于客户端负载而达到该值后,SQL Server 不能释放内存。 例如,在同一台服务器上同时安装多个 SQL Server 实例时,请考虑设置“最小服务器内存(MB)”参数,使其为实例预留内存。
为了确保来自基础主机的内存压力不会尝试从来宾虚拟机 (VM) 上的缓冲池释放超过可接受性能所需的内存,在虚拟环境中设置“最小服务器内存(MB)”值非常有必要。 理想情况下,虚拟机中的 SQL Server 实例不必与虚拟主机主动内存解除分配进程竞争。
SQL Server 并不一定分配“最小服务器内存(MB)”中指定的内存量。 如果服务器上的负载从不需要分配“最小服务器内存(MB)”中指定的内存量,则 SQL Server 将使用更少的内存。
最大服务器内存
使用“最大服务器内存(MB)”保证 OS 和其他应用程序不会遇到来自 SQL Server 的不利内存压力。
在设置“最大服务器内存(MB)”配置之前,在正常操作期间监视托管 SQL Server 实例的服务器的总体内存消耗,以确定内存可用性和要求。 对于初始配置,或者当没有机会收集一段时间内的 SQL Server 进程内存使用情况时,请使用以下通用最佳做法方法,为单个实例配置最大服务器内存 (MB):
从总 OS 内存中减去“最大服务器内存(MB)”控制之外的潜在 SQL Server 线程内存分配量的同等值,这个量是堆栈大小1乘以计算出的最大工作线程数2。
基于 Windows 的应用程序可使用 Windows 地址窗口扩展 (AWE) API 来分配物理内存并将其映射到进程地址空间。 LPIM Windows 策略将确定哪些帐户可以访问 API 以将数据保留在物理内存中,从而阻止系统将数据分页到磁盘的虚拟内存中。 使用 AWE 分配的内存被锁定,直到应用程序显式释放该内存或退出。 在 64 位 SQL Server 中使用 AWE API 进行内存管理也经常称为锁定页。 锁定内存中的页可以在发生将内存分页到磁盘时保持服务器的响应能力。 已向有权运行 的帐户授予 Windows 锁定内存页 (LPIM) 用户权限时,SQL Server Standard Edition 及更高版本的实例中已启用“锁定内存页”选项。
若要对 SQL Server 禁用“锁定内存页”选项,请为有权运行 (SQL Server 启动帐户)启动帐户的帐户删除“锁定内存页”用户权限。
A significant part of sql server process memory has been paged out. This may result in a performance degradation. Duration: #### seconds. Working set (KB): ####, committed (KB): ####, memory utilization: ##%.
SELECT osn.node_id,
osn.memory_node_id,
osn.node_state_desc,
omn.locked_page_allocations_kb
FROM sys.dm_os_memory_nodes AS omn
INNERJOIN sys.dm_os_nodes AS osn
ON (omn.memory_node_id = osn.memory_node_id)
WHERE osn.node_state_desc <> 'ONLINE DAC';
当前 SQL Server 错误日志在服务器启动期间 Using locked pages in the memory manager 报告消息。
不执行任何操作(不推荐)。 带有工作负载的第一个实例通常分配所有的内存。 空闲实例或稍后启动的实例最终可能会只使用最少的可用内存量运行。 SQL Server 不会尝试均衡分配各个实例的内存使用量。 但是,所有实例均将响应 Windows 内存通知信号以调整它们内存需求量的大小。 Windows 不会使用内存通知 API 来平衡各个应用程序使用的内存。 它只提供有关系统内存可用性的全局反馈。
您可以在不重新启动实例的情况下更改这些设置,以便可以轻松地进行尝试以找到适合使用模式的最佳设置。
示例
答: 将最大服务器内存选项设置为 4 GB
以下示例将“最大服务器内存(MB)”选项设置为 4096 MB (4 GB)。 虽然 sp_configure 将选项的名称指定为 max server memory (MB),但你也可省略 (MB)。
SQL
EXECUTE sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXECUTE sp_configure 'max server memory', 4096;
GO
RECONFIGURE;
GO
这将输出类似于 Configuration option 'max server memory (MB)' changed from 2147483647 to 4096. Run the RECONFIGURE statement to install. 的语句。新的内存限制在执行 RECONFIGURE 时立即生效。 有关详细信息,请参阅 sp_configure。
B. 确定当前内存分配
以下查询返回有关当前分配内存的信息。
SQL
SELECT physical_memory_in_use_kb / 1024AS sql_physical_memory_in_use_MB,
large_page_allocations_kb / 1024AS sql_large_page_allocations_MB,
locked_page_allocations_kb / 1024AS sql_locked_page_allocations_MB,
virtual_address_space_reserved_kb / 1024AS sql_VAS_reserved_MB,
virtual_address_space_committed_kb / 1024AS sql_VAS_committed_MB,
virtual_address_space_available_kb / 1024AS sql_VAS_available_MB,
page_fault_count AS sql_page_fault_count,
memory_utilization_percentage AS sql_memory_utilization_percentage,
process_physical_memory_low AS sql_process_physical_memory_low,
process_virtual_memory_low AS sql_process_virtual_memory_low
FROM sys.dm_os_process_memory;