服务器内存配置选项

使用两个服务器内存选项 (最小服务器内存最大服务器内存)重新配置 SQL Server 内存管理器为 SQL Server 实例使用的 SQL Server 进程管理的内存量(以兆字节为单位)。

最小服务器内存的默认设置为 0,最大服务器内存的默认设置为 2147483647 MB。 默认情况下,SQL Server 可以根据可用的系统资源动态更改其内存要求。

注释

将最大服务器内存设置为最小值可能会严重降低 SQL Server 性能,甚至阻止其启动。 如果更改此选项后无法启动 SQL Server,请使用 -f 启动选项启动它,并将 最大服务器内存 重置为其以前的值。 有关详细信息,请参阅 数据库引擎服务启动选项

当 SQL Server 动态使用内存时,它会定期查询系统以确定可用内存量。 维护此空闲内存可防止操作系统(OS)分页。 如果内存不足,SQL Server 会将内存释放到 OS。 如果内存更多可用,SQL Server 可能会分配更多内存。 仅当 SQL Server 的工作负荷需要更多内存时,SQL Server 才会添加内存;静态服务器不会增加其虚拟地址空间的大小。

请参阅示例 B 以获取返回当前使用的内存的查询。 最大服务器内存 控制 SQL Server 内存分配,包括缓冲池、编译内存、所有缓存、qe 内存授予、锁管理器内存和 clr 内存(实质上是 sys.dm_os_memory_clerks中找到的任何内存 clerk)。 线程堆栈、内存堆、除 SQL Server 以外的链接服务器提供程序以及非 SQL Server DLL 分配的任何内存不受最大服务器内存的控制。

SQL Server 使用内存通知 API QueryMemoryResourceNotification 来确定 SQL Server 内存管理器何时可以分配内存和释放内存。

建议允许 SQL Server 动态使用内存;但是,可以手动设置内存选项,并限制 SQL Server 可以访问的内存量。 在为 SQL Server 设置内存量之前,请通过从总物理内存、OS 所需的内存和其他任何 SQL Server 实例中减去适当的内存设置(如果计算机不完全专用于 SQL Server),来确定适当的内存设置。 此差异是可以分配给 SQL Server 的最大内存量。

手动设置内存选项

服务器选项 最小服务器内存最大服务器内存 可以设置为跨越一系列内存值。 此方法适用于系统或数据库管理员将 SQL Server 实例与其他应用程序或其他在同一主机上运行的 SQL Server 实例的内存要求结合使用。

注释

最小服务器内存最大服务器内存选项是高级选项。 如果使用 sp_configure 系统存储过程更改这些设置,则只有在 显示高级选项 设置为 1 时,才能更改这些设置。 这些设置会立即生效,无需重启服务器。

使用 min_server_memory 保证 SQL Server 实例的 SQL Server 内存管理器可用的最小内存量。 SQL Server 不会在启动时立即分配 在最小服务器内存中指定的内存 量。 但是,由于客户端负载,内存使用率达到此值后,除非 最小服务器内存 的值减少,否则 SQL Server 无法释放内存。 例如,当 SQL Server 的多个实例可以同时存在于同一主机中时,请设置min_server_memory参数,而不是max_server_memory来保留实例的内存。 此外,在虚拟化环境中设置 min_server_memory 值非常重要,以确保基础主机的内存压力不会试图从来宾 SQL Server 虚拟机(VM)的缓冲池中解除分配超过所需的内存,从而保持可接受的性能。

注释

不保证 SQL Server 分配 最小服务器内存中指定的内存量。 如果服务器上的负载从不要求分配 在最小服务器内存中指定的内存量,则 SQL Server 将以更少的内存运行。

使用 max_server_memory 保证 OS 不会遇到有害的内存压力。 若要设置最大服务器内存配置,请监视 SQL Server 进程的总体消耗,以确定内存需求。 若要更准确地计算单个实例:

  • 从 OS 内存总量中,将 1GB-4GB 保留到 OS 本身。
  • 然后减去在 最大服务器内存 控制之外的潜在 SQL Server 内存分配的等值,该分配由 堆栈大小 1 * 计算的最大工作线程数 2 + -g 启动参数 3 (如果未设置 -g ,则默认为 256MB)。 剩余的内容应该是单个实例设置的max_server_memory设置。

1 有关每个体系结构的线程堆栈大小的信息,请参阅 内存管理体系结构指南

2 请参阅有关如何 配置最大工作线程服务器配置选项的文档页,了解有关当前主机中给定数量的关联 CPU 的计算默认工作线程的信息。

3 有关 -g 启动参数的信息,请参阅数据库引擎服务启动选项上的文档页。 仅适用于 32 位 SQL Server(SQL Server 2005 到 SQL Server 2014)。

OS 类型 max server memory的允许最小内存量
32 位 64 MB
64 位 128 MB

如何使用 SQL Server Management Studio 配置内存选项

使用两个服务器内存选项 (最小服务器内存最大服务器内存)重新配置 SQL Server 内存管理器为 SQL Server 实例管理的内存量(以兆字节为单位)。 默认情况下,SQL Server 可以根据可用的系统资源动态更改其内存要求。

配置固定内存量的过程

设置固定内存量:

  1. 在对象资源管理器中,右键单击服务器并选择 “属性”

  2. 单击 “内存 ”节点。

  3. “服务器内存选项”下,输入所需的 最小服务器内存最大服务器内存量。

    使用默认设置允许 SQL Server 根据可用的系统资源动态更改其内存要求。 最小服务器内存的默认设置为 0,最大服务器内存的默认设置为 2147483647 MB。

最大化网络应用程序的数据吞吐量

若要优化 SQL Server 的系统内存使用,应限制系统用于文件缓存的内存量。 若要限制文件系统缓存,请确保未选择 “最大化文件共享的数据吞吐量 ”。 可以通过选择“ 最小化已用内存 ”或“ 平衡”来指定最小的文件系统缓存。

检查你操作系统上的当前设置

  1. 单击“ 开始”,单击 “控制面板”,双击“ 网络连接”,然后双击“ 局域网连接”。

  2. 在“ 常规 ”选项卡上,单击“ 属性”,选择“ 文件和打印机共享Microsoft网络”,然后单击“ 属性”。

  3. 如果选择了 网络应用程序的数据吞吐量最大化 ,请选择任何其他选项,单击“ 确定”,然后关闭对话框的其余部分。

锁定内存中的页

此 Windows 策略将确定哪些帐户可以使用进程将数据保留在物理内存中,从而阻止系统将数据分页到磁盘的虚拟内存中。 当将内存分页到磁盘时,锁定内存中的页可能会使服务器保持响应状态。 当具有运行 sqlservr.exe 权限的帐户获得 Windows “内存中锁定页” (LPIM) 用户权限时,SQL Server 2014 Standard版及更高版本的 32 位和 64 位实例中的 SQL Server 锁定页 选项已启用。 在早期版本的 SQL Server 中,为 32 位 SQL Server 实例设置锁定页选项要求具有运行权限的帐户 sqlservr.exe 具有 LPIM 用户权限,并将“awe_enabled”配置选项设置为 ON。

若要禁用 SQL Server 的 “锁定页内存” 选项,请删除 SQL Server 启动帐户的“内存中锁定页”用户权限。

禁用锁定内存页

若要禁用内存中的锁页选项,请执行以下作:

  1. “开始” 菜单上,单击 “运行” 。 在“打开”框中,键入 gpedit.msc

    将打开 “组策略” 对话框。

  2. 组策略控制台上,展开“计算机配置”,然后展开“Windows 设置”。

  3. 展开 “安全设置”,然后展开 “本地策略”。

  4. 选择 “用户权利指派” 文件夹。

    细节窗格中随即显示出策略。

  5. 在该窗格中,双击“锁定内存页”

  6. “本地安全策略设置” 对话框中,选择具有运行 sqlservr.exe 特权的帐户,然后单击“ 删除”。

虚拟内存管理器

32 位作系统提供对 4 GB 虚拟地址空间的访问权限。 每个进程 2 GB 的虚拟内存是专用的,可用于应用程序使用。 为作系统使用保留 2 GB。 所有作系统版本都包含一个交换机,该交换机可为应用程序提供高达 3 GB 的虚拟地址空间的访问权限,将作系统限制为 1 GB。 有关如何使用交换机内存配置的详细信息,请参阅有关 4 GB 优化 (4GT) 的 Windows 文档。 当 32 位 SQL Server 在 64 位作系统上运行时,其用户可用的虚拟地址空间为完整的 4 GB。

地址空间的已提交区域由 Windows 虚拟内存管理器(VMM)映射到可用的物理内存。

有关不同作系统支持的物理内存量的详细信息,请参阅 Windows 文档“Windows 版本的内存限制”。

虚拟内存系统允许物理内存过度承诺,使虚拟内存与物理内存的比例可以超过 1:1。 因此,大型程序可以在具有各种物理内存配置的计算机上运行。 但是,使用比所有进程的合并平均工作集更多的虚拟内存可能会导致性能不佳。

最小服务器内存最大服务器内存选项是高级选项。 如果使用 sp_configure 系统存储过程更改这些设置,则只有在 显示高级选项 设置为 1 时,才能更改这些设置。 这些设置在不需要服务器重启的情况下立即生效。

运行 SQL Server 的多个实例

运行数据库引擎的多个实例时,可以使用三种方法来管理内存:

  • 使用 最大服务器内存 来控制内存使用情况。 为每个实例建立最大设置,请注意总限额不超过计算机上的物理内存总量。 你可能希望为每个实例内存提供与其预期工作负荷或数据库大小成正比的内存。 此方法的优点是,当新进程或实例启动时,可用内存将立即可供它们使用。 缺点是,如果未运行所有实例,则任何正在运行的实例都无法利用剩余的可用内存。

  • 使用 最小服务器内存 来控制内存使用情况。 为每个实例建立最小设置,使这些最小值的总和小于计算机上的总物理内存 1-2 GB。 同样,可以将这些最小值与该实例的预期负载成比例建立。 此方法的优点是,如果并非所有实例同时运行,则正在运行的实例可以使用剩余的可用内存。 当计算机上存在另一个内存密集型进程时,此方法也很有用,因为它可确保 SQL Server 至少获得合理的内存量。 缺点是,当新实例(或任何其他进程)启动时,运行实例可能需要一些时间才能释放内存,尤其是在必须将修改的页面写回数据库以执行此作时。

  • 不执行任何操作(不推荐)。 显示工作负荷的第一个实例倾向于分配所有内存。 空闲实例或稍后启动的实例最终可能仅用最小的可用内存运行。 SQL Server 不会尝试跨实例平衡内存使用情况。 但是,所有实例都将响应 Windows 内存通知信号,以调整其内存占用大小。 Windows 不会使用内存通知 API 在应用程序中平衡内存。 它只是提供有关系统上内存可用性的全局反馈。

无需重启实例即可更改这些设置,以便轻松试验以查找最佳使用模式设置。

为 SQL Server 提供最大内存量

32 位 64 位
传统内存 在所有 SQL Server 版本中,最多处理虚拟地址空间限制:

2 GB

具有 /3gb 启动参数的 3 GB *

WOW64 上的 4 GB**
在所有 SQL Server 版本中,最多处理虚拟地址空间限制:

在 x64 体系结构中 8 TB

* /3gb 是操作系统的启动参数。 有关详细信息,请访问 MSDN 库

**WOW64 (Windows 64 上的 Windows)是在 64 位作系统上运行 32 位 SQL Server 的模式。 有关详细信息,请访问 MSDN 库

例子

示例 A

以下示例将 max server memory 选项设置为 4 GB:

sp_configure 'show advanced options', 1;  
GO  
RECONFIGURE;  
GO  
sp_configure 'max server memory', 4096;  
GO  
RECONFIGURE;  
GO  

示例 B. 确定当前内存分配

以下查询返回有关当前分配内存的信息。

SELECT  
(physical_memory_in_use_kb/1024) AS Memory_usedby_Sqlserver_MB,  
(locked_page_allocations_kb/1024) AS Locked_pages_used_Sqlserver_MB,  
(total_virtual_address_space_kb/1024) AS Total_VAS_in_MB,  
process_physical_memory_low,  
process_virtual_memory_low  
FROM sys.dm_os_process_memory;  

另请参阅

监视和优化性能
RECONFIGURE (Transact-SQL)
服务器配置选项 (SQL Server)
sp_configure(Transact-SQL)