目标/总内存高于 max_server_memory

kev*_*hat 1 sql-server memory configuration sql-server-2012

max_server_memory在我们的生产 SQL Server 上将设置配置为 141 GB,目标/总服务器内存为 144 GB。

我认为max_server_memory代表我愿意让 SQL Server 引擎使用多少内存,如果是这样,为什么它使用更多?

运行 SQL Server 2012 SP3,安装了 160 GB 内存的物理机,机器上没有运行其他实例,但我们也在运行集成服务。

我们有 75 个用户数据库,总大小为 928 GB。我不确定是否正在使用列存储,或者我如何检查它。这是一个供应商应用程序。

现在目标内存 = 144,384,008,总计 = 144,378,261。

该实例自美国东部时间昨晚 2019-05-01 22:20:21.097 以来一直在运行。我们有一些基础设施维护需要停止实例。但是,我注意到很长一段时间以来,总/目标始终为 144,而最大值始终设置为 141。周一至周五主要工作时间的 PLE 平均约为 0.5 到 1 小时,有时会跳至 2 小时.

Joe*_*ish 6

max server memory 设置并不代表您愿意让 SQL 引擎使用多少内存。来自内存管理架构指南

从 SQL Server 2012 (11.x) 开始,SQL Server 分配的内存可能会超过 max server memory 设置中指定的值。当服务器总内存 (KB) 值已达到目标服务器内存 (KB) 设置(由最大服务器内存指定)时,可能会发生此行为。如果由于内存碎片导致连续空闲内存不足,无法满足多页内存请求(超过 8 KB)的需求,SQL Server 可以执行超额分配而不是拒绝内存请求。

执行此分配后,资源监视器后台任务立即开始向所有内存使用者发出信号以释放已分配的内存,并尝试使总服务器内存 (KB) 值低于目标服务器内存 (KB) 规范。因此,SQL Server 内存使用量可能会短暂超过最大服务器内存设置。在这种情况下,总服务器内存 (KB) 性能计数器读数将超过最大服务器内存和目标服务器内存 (KB) 设置。

此行为通常在以下操作期间观察到:

  • 大型列存储索引查询。

  • 列存储索引(重新)构建,使用大量内存来执行哈希和排序操作。

  • 需要大内存缓冲区的备份操作。

  • 必须存储大量输入参数的跟踪操作。