在具有 64 GB RAM 的服务器上使用带有 SP2 的 SQL 2008 R2。考虑到 SQL Server 仅限于仅与数据库引擎相关的服务,我已将最大服务器内存设置为 58GB。我有一个关于设置最小服务器内存的问题
如果我将最小服务器内存设置为 48 GB,这是否意味着
a) 如果 Windows 向 SQL 发送内存不足通知 - SQL 服务器将修剪其所有池并尝试将内存使用量保持在 48 GB 内存?
b) 在 Windows 进行激进的工作集修剪的情况下——它会将 SQL 服务器的内存使用量保留为 48 GB,从而为 SQL 的内存使用量设置一个“下限”。
c) 对最小服务器内存有什么建议吗?
搜索网络——互联网上有大量关于最大服务器内存的信息,但我读过的只有几个地方(Brent Ozar 博客的配置最佳实践)将最小服务器内存设置为服务器上总可用 RAM 的 50%。
我建议您将 MIN 服务器内存保留为 DEFAULT。
Min server memory 控制 sql server 将尝试保持提交的最小物理内存量。当 SQL Server 服务启动时,它不会获取在 Min Server Memory 中配置的所有内存,而是仅以所需的最小值启动,并根据需要增长。一旦内存使用量增加到超过 Min Server Memory 设置,SQL Server 将不会释放任何低于该数量的内存。
Bob Dorr将此设置解释为:
这是因为,此设置调整最少(人们只是将其设置为默认值),而是通常调整最大内存,因为它是缓冲池的“上限”。一个好的 max memory 值将确保在服务器上运行的 windows 和其他进程将有足够的物理内存来执行它们的工作,而不会强制 sql server修剪。
关于您关于“内存不足通知”和“积极的工作集修剪”的问题,SQL Server 将尝试修剪回定义的最小内存量。有几件好事要知道:
我同意对于大多数 SQL Server 来说,50% 可能是一个很好的最小内存设置。
从 SQL Server 2019 CTP3.1 开始,您可以在设置期间设置 MIN 和 MAX 内存并使用
Recommended values
:根据文档,SQL Server 无法释放低于最小值的内存。
至于最小内存的建议,50% 应该是一个很好的基础,但这取决于服务器和它的负载类型。
只有当我们知道每天都会发生需要高内存的负载/活动时,我才会看到设置最小值,这样当活动发生时,SQL SERVER 不必每天都请求更多内存。(尽管它必须第一次请求)。
回答您的问题,“如果 Windows 向 SQL 发送内存不足通知 - SQL 服务器将修剪其所有池并尝试将内存使用量保持在 48 GB 内存?”
如果 SQL Server 已经获得了最小值,则它不会低于最小值。(不管它现在是否正在使用)所以这表明 MIN 值设置不合适。
“在 Windows 进行积极的工作集修剪的情况下——它是否会将 SQL Server 的内存使用量设置为 48 GB,从而为 SQL 的内存使用量设置一个“下限”?我不确定这一点。但我的猜测是它不能强制 SQL 服务器重新分配获取/提交的内存。到目前为止,我还没有找到一种方法来告诉 sql server 向 Windows 释放任何未使用的内存。我已经看到由于 SQL 服务器的 MAX 值不合适,服务器变得无响应,然后服务器本身就没有任何东西可以运行了。
“有没有关于最小服务器内存的建议?” 正如我之前所说,除非您知道服务器需要特定内存量的频率,否则无需设置高于默认值的任何内容。