![我的 SQL 需要多少内存?](https://linux22.com/image/656849/%E6%88%91%E7%9A%84%20SQL%20%E9%9C%80%E8%A6%81%E5%A4%9A%E5%B0%91%E5%86%85%E5%AD%98%EF%BC%9F.png)
我有一台虚拟机(SQL 数据库服务器),我认为它的内存比它需要的多,但是我不确定我可以将其减少到多少,因为我不明白“使用中”、“可用”、“已提交”和“缓存”内存到底是什么意思。
以下是我进行负载测试后任务管理器的屏幕截图。我们假设负载不会比这更强烈。
对我来说,64GB 的 RAM 显然太多了。我想知道在不降低性能的情况下可以减少多少内存。
这是否意味着我只需要 8GB,因为这比“正在使用”的数量要多?或者当我确定需要多少时,我是否需要包括“缓存”的数量?
答案1
SQL Server 将保留其分配的 RAM,因此由于它似乎不会超过 6-7 GB,在这种情况下,我将为 SQL 分配 8GB,并为操作系统保留 2-4 GB 额外的内存(SQL 总是在其分配的内存之外执行一些任务sqlserver.exe
。
将此值(8 GB)放入 SQL Server 实例的最小内存设置中是一个好主意。这样,当 SQL 需要内存时,它不会因为在启动时“占用”8GB 而浪费时间先分配内存。
在处理 RAM 时,您可以随时检查页面预期寿命。这将告诉您某些内容在 RAM 中停留的时间。这是一个以秒为单位的值,只要它持续增加,您就没问题。
SELECT object_name, counter_name, cntr_value
FROM sys.dm_os_performance_counters
WHERE [object_name] LIKE '%Buffer Manager%'
AND [counter_name] = 'Page life expectancy'
只要它保持在 300 以上,就没问题。较低的值表示存在一些内存压力。这可能发生在进行大量排序、更新/重建索引之后……如果重新启动实例后此值较低,请不要惊慌,它永远不会大于 SQL 运行的时间。
第二个有趣的计数器是缓冲区缓存命中率,它将告诉您有多少先前的请求(最近几秒)是从内存中提取的。
SELECT CAST(A.cntr_value1 AS NUMERIC) /
CAST(B.cntr_value2 AS NUMERIC)* 100 AS Buffer_Cache_Hit_Ratio_Percentage, A.cntr_value1 As Cache_Hits, B.cntr_value2 AS Cache_Lookups
FROM ( SELECT cntr_value AS cntr_value1
FROM sys.dm_os_performance_counters
WHERE object_name = 'MSSQL$SQL01:Buffer Manager' AND counter_name = 'Buffer cache hit ratio'
) AS A,
(SELECT cntr_value AS cntr_value2
FROM sys.dm_os_performance_counters
WHERE object_name = 'MSSQL$SQL01:Buffer Manager' AND counter_name = 'Buffer cache hit ratio base'
) AS B;
在此示例中,我的 SQL 实例是一个命名实例SQL01
,因此将其更改为您的实例名称,或者如果您有一个默认实例,则更MSSQL$SQL01:Buffer Manager
改为。MSSQLServer:Buffer Manager
越高越好。理想情况下,您会在这里得到 100%,这意味着整个数据库都在内存中。
答案2
下面的链接中有很好的定义。一种策略是先估计答案,然后留意页面错误。随着页面错误增加和可用内存减少,您就知道需要增加虚拟机可用的内存量。VMware 还应该允许您设置虚拟机是否限制为指定的内存量,或者是否允许它超过该限制进入共享资源池。