我在云服务器上有三个 SQL 数据库实例:A、B 和 C,服务器安装的物理内存 (RAM) 为 32GB。A(数据+日志文件)的大小为 44GB,B(数据+日志文件)为 41GB。我们忽略 C,因为它没有数据库并且最大内存设置为 500MB。
两个实例 A 和 B 的内存都设置为默认大小:2147483647 MB。尽管我们没有遇到任何问题,但这绝对是不切实际的。
经过一些研究,基于数据库活动,我决定将实例 A 的内存分配设置为 20GB,将 B 设置为 10GB。总共是系统中最大物理内存的 30/32。下面显示了实际的内存消耗。恐怕如果我设置最大内存它会减慢响应时间。此配置在为此类数据库设置 SQL Max Server 内存时是否最佳?在应用之前如何进行模拟?
Jonathan的一般建议(来自 SQLSkills)
您可以使用 powershell dbatools
Test-DbaMaxMemory
为您计算。dbatools 必须set-DbaMaxMemory
为您在所有服务器上设置最大内存。我会先
Test-DbaMaxMemory
检查建议,一旦你感到舒服,使用 set 在所有服务器上设置它。您将看到可以缓存的数据更少,因此,某些查询将具有分离的性能。RAM 的默认值在某种程度上意味着 SQL Server 将“尽其所能”使用。一旦它上升,它在服务重新启动之前不会恢复,因为它会保留所有 RAM(因为它会在上面缓存数据。)
这是我最喜欢的用于确定服务器真正需要多少 RAM 的资源。我唯一的问题是它并没有真正考虑到更小的基于 VM 的机器,只是假设你可以在服务器上抛出 128gb+。
https://www.brentozar.com/archive/2014/05/much-memory-sql-server-need/
一般的经验法则是 10% 或 8GB 专用于操作系统/辅助,其余专用于 SQL Server(通过 MAX Ram 设置。)(10% 或 8GB,以较大者为准。)
在我看来,你没有为操作系统留下足够的空间:在32GB 的系统上,我可能会留下 4GB 左右。请记住,本地登录、SQL 作业和 SSIS 包以及第 3 方备份软件等都使用为 SQL 引擎本身分配的空间之外的内存。如果我知道有内存占用 SSIS 包定期运行,我会为操作系统留出更多内存。
如何在 3 个实例之间拆分剩余部分取决于您。通过动态更改这些没有(严重的)影响风险,它们甚至不需要重新启动 SQL 即可生效。
不要担心您计划的最大尺寸与您在图中看到的尺寸有细微差别。SQL 是一头猪,它会使用尽可能多的内存。如果降低最大值,它将不得不释放一些内存,但它只是放弃了一部分本地数据缓存。对于某些查询,它可能需要稍早返回磁盘,但我怀疑您会注意到差异。
编辑:在评论中进行了一些讨论后,似乎不需要重新启动 SQL,即使 MaxMem 降低到当前使用的数量以下。
您是否进行过分析以查看每个实例需要多少实际内存?避免使用任务管理器来确定 SQL 内存要求,有适当的性能指标可用于 SQL 内存使用情况。