设置最大服务器内存上限以避免内存压力 - AWS 规范性指导

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

设置最大服务器内存上限以避免内存压力

出于性能考虑,SQL Server 不会释放已经分配的内存。启动 SQL Server 时,它会慢慢占用 min_server_memory 选项下指定的内存,然后继续增长,直到达到 max_server_memory 选项中指定的值。(有关这些选项设置的更多信息,请参阅 SQL Server 文档中 Server 内存配置选项。)

SQL Server 内存由两个部分组成:缓冲池和非缓冲池(也称为待留内存或 MTL)。max_server_memory 选项的值确定 SQL Server 缓冲池的大小,该缓冲池由缓冲区缓存、过程缓存、计划缓存、增益结构和其他缓存组成。

从 SQL Server 2012 开始,min_server_memorymax_server_memory 会考虑所有缓存的所有内存分配,包括 SQLGENERALSQLBUFFERPOOLSQLQUERYCOMPILESQLQUERYPLANSQLQUERYEXECSQLOPTIMIZERSQLCLR。有关 max_server_memory 下的内存管理员的完整列表,请参阅微软 SQL Server 文档中的 sys.dm_os_memory_clerks

要检查当前的 max_server_memory 值,请使用以下命令:

$ sp_configure 'max_server_memory'

我们建议您将 max_server_memory 的上限设置为一个不会造成全系统内存压力的值。没有适用于所有环境的通用公式,但我们在本节中提供了一些指南。max_server_memory 是一个动态选项,因此可以在运行时对其进行更改。

首先,您可以按如下方式确定 max_server_memory

max_server_memory = total_RAM – (memory_for_the_OS + MTL)

其中:

  • 操作系统的内存为 1-4 GB。

  • MTL(待留内存)包括堆栈大小,在 64 位计算机上,每个工作线程为 2 MB,计算方法如下:MTL = stack_size * max_worker_threads

或者,您也可以使用:

max_server_memory = total_RAM – (1 GB for the OS + memory_basis_amount_of_RAM_on_the_server)

其中 RAM 的内存基础量按如下方式确定:

  • 如果服务器上的 RAM 介于 4 GB 到 16 GB 之间,则每 4 GB 内存留出 1 GB。例如,对于容量为 16 GB 的服务器,留出 4 GB。

  • 如果服务器上的 RAM 超过 16 GB,则每 4 GB 的 RAM 留出 1 GB 不超过 16 GB,16 GB 以上每 8 GB RAM 留出 1 GB。

例如,如果一台服务器有 256 GB 的 RAM,则计算结果为:

  • 操作系统为 1 GB

  • 最大 16 GB RAM:16/4 = 4 GB

  • 剩余 RAM 超过 16 GB:(256-16) /8 = 30

  • 剩下的总 RAM:1 + 4 + 30 = 35 GB

  • max_server_memory:256 - 35 = 221 GB

初始配置后,监视在典型工作负载持续时间内可以腾出的内存,以确定是否需要增加或减少分配给 SQL Server 的内存。

注意

Windows 以 96 MB 的速度发出低内存资源通知信号,因此您需要一个缓冲区,但您可以将具有 256 GB 或更高内存的大型服务器上的 可用兆字节设置为 1 GB 以上。

有关更多信息,请参阅 Microsoft SQL Server 文档中的内存管理架构指南