我有一个VM(sql数据库服务器),我认为它有更多的内存,然后它需要,但我不知道我可以减少它,因为我不明白什么“使用中”,“可用”,“承诺“和”缓存“记忆意味着.
以下是我进行一些负载测试后任务管理器的屏幕截图.让我们假设负载不会比这更强烈.
我觉得64GB的RAM太多了.我想了解在不降低性能的情况下我能带走多少.
这是否意味着我只需要8GB,因为这超过了“使用中”金额?或者,当我确定需要多少时,我是否需要包含“缓存”金额?
解决方法
sql Server将保留它分配的RAM,因此它似乎不超过6-7 GB,我会为sql分配8GB并在这种情况下为操作系统保留2-4 GB(sql总是会做一些它为sqlserver.exe分配的内存之外的任务.
将此值(8 GB)放在sql server实例的最小内存设置中是个好主意.这样,当sql需要内存时,它不会浪费时间首先分配它,因为它在启动时需要8GB.
在玩RAM时,您可以随时查看Page Life Expectancy.这将告诉你什么东西留在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%,这意味着整个数据库都在内存中.