对于我们的 SQL Server 之一,我们最近添加了更多内存。初始值为 12GB。服务器出现物理内存不足,因此我们又增加了 12GB,总共 24GB。然后我设置了以下值:分钟。服务器内存 1024MB - 最大服务器内存:19456。一切都运行良好,但我对 SQL Server 内存使用情况几乎没有疑问。事实上,SQL 服务器突然使用了所有分配的内存:
我有一本好书,上面写着:“一旦内存使用量增加到超过最小服务器内存设置,SQL Server 将不会释放低于该数量的任何内存” - 与最大服务器内存发生同样的事情吗?
我想知道(再次)如何测量 SQL 实际使用了多少内存。我对参数“ Total server memory (KB) ”(“这个计数器测量 SQL Server 的总缓冲池使用量”)感到困惑。根据 perfmon,它只有 2MB:
也许我们可以为 ESX 节省一些 RAM 和 SQL Server 内存(即 PLE)仍将显示良好的值 - 如何确定?在这种情况下 SQL 内存如何工作的一个很好的解释将非常感激!
你的配置没问题。24GB 总 RAM,19GB 用于 SQL Server,5GB 用于操作系统。
SQL Server 内存不足,将消耗所有可用的 19GB,这是完全正常的。
您可以将最大服务器内存从 19GB 降低。但是,如果您在使用 12GB 内存时遇到内存压力,我不会这样做。
问题是该服务器执行哪些其他角色会使用您可能从 SQL Server 释放的内存?可以将这些角色(可能是 SSIS、SSRS、SSAS 等)移动到备用服务器吗?
查看“总服务器内存 (KB)”计数器的刻度:它是 0.0001。这意味着您看到的数字除以 10000,所以它是 20 GB 而不是 2 MB。
也就是说,Max Server Memory 控制可以分配给 SQL Server 进程的最大内存量。根据您使用的版本,该设置仅控制缓冲池或所有分配。SQL Server 版本 < 2012 仅使用该设置控制缓冲池的大小,而版本 >= 2012 控制所有内存分配。
这很正常,也是意料之中的,您发现物理内存不足,您添加了物理内存并更改了最大服务器内存设置,现在 SQL Server 可以看到它已被允许使用额外的内存,所以它继续并抓住了所有的内存。当新的内存需求出现时,这将有助于 SQL Server 使事情变得更快,因为它已经缓存了内存,需要内存的新进程会立即获得。
虽然这是正确的,但实际上与您所看到的内容无关。上面所说的是最小服务器内存是 SQL Server 将在内存压力的情况下尝试减少其内存消耗的点,您所看到的是当更多内存可用时 SQL Server 的默认行为。
如果您使用 SQL Server 2008 及更高版本,查看 SQL Server 正在使用多少内存的简单方法是查询 DMV sys.dm_os_process_memory
Phy_Memory_usedby_Sqlserver_MB
-- 以 MB 为单位给出 SQL Server 使用的总物理内存Total_Memory_UsedBySQLServer_MB
-- 以 MB 为单位给出 SQL Server 使用的总内存(RAM+页面文件)我还可以看到您正在使用任务管理器查看 SQL Server 内存利用率,不要使用任务管理器,因为当内存中的锁定页面权限分配给 SQL Server 服务帐户时,它不会显示正确使用的内存
总服务器内存:这只是 SQL Server 使用的总内存,但它不会跟踪所有使用的内存,可能会错过几 MB,这就是 DMV 出现的地方,所以总是依赖我发布的查询。
现在,如果您看到测量服务器总内存的刻度为 0.0001,在这种情况下,无论您得到什么值,您都必须将其乘以 10000 才能得到您需要的刻度 1 的值。我看不出你是如何获得 2 MB 的,你能给我看一下吗?
Long Back 我写了一篇关于SQL Server 内存和故障排除的文章,这应该让你开始了解 SQL Server 内存管理的基础知识。
如果您使用的是 SQL Server 2012 及更高版本,则必须阅读
在您的情况下,为 OS 和 ESX 留出足够的 RAM 很重要。如果您想为最大服务器内存设置理想值,这里是stackexchange 链接