占用完整内存后SQL Server完全放慢速度

Sun*_*nny 15 sql sql-server sql-server-2008

在我们的32 GB RAM服务器上,我们有一个运行SQL Server的实例,其最大内存为80%.

当内存利用率很低时,一切正常.见下面的截图 在此输入图像描述

但随着时间的推移,3-4天因此SQL将使用完整的RAM(占总数的80%).

在这3-4天内,我们不对服务器进行任何更改,但是它日复一日地占用更多内存.

当它达到最大限制时,整个性能都会折腾,我们会在网站上面临查询超时.执行在毫秒内执行的相同查询需要几秒钟.

此时我们别无选择,只能重启整个服务器,事情恢复正常.(仅重新启动服务不起作用)

这将工作一周左右,之后我们必须重新启动它

我在网上看过,SQL服务器没有释放内存.但他们也提到它是SQL的功能,但不会影响性能.在我的情况下它确实和性能受损.

有内存泄漏吗?或者存储过程消耗大量内存并且从不释放它?如果是这样我该怎么调试呢?

The*_*war 20

默认情况下,如果没有上限,SQL服务器将占用整个内存,并使用上限时可用的所有内存.这是正常的.您还必须确保SQLSERVER是该框中的唯一应用程序(建议使用),并根据最佳实践尝试限制内存.

我将使用以下方法开始故障排除

1.启动查找顶级内存消耗查询并查看是否可以减少查询的内存使用量.可以通过以下查询找到消耗查询的内存.

SELECT TOP 10 SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.TEXT)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2)+1),
qs.execution_count,
qs.total_logical_reads, qs.last_logical_reads,
qs.total_logical_writes, qs.last_logical_writes,
qs.total_worker_time,
qs.last_worker_time,
qs.total_elapsed_time/1000000 total_elapsed_time_in_S,
qs.last_elapsed_time/1000000 last_elapsed_time_in_S,
qs.last_execution_time,
qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY qs.total_logical_reads DESC -- logical reads
-- ORDER BY qs.total_logical_writes DESC -- logical writes
-- ORDER BY qs.total_worker_time DESC -- CPU time
Run Code Online (Sandbox Code Playgroud)

既然您发现了导致高内存的查询,则需要对它们进行微调以查看是否可以减少内存使用量.

EX:由于索引不合适,查询可能正在进行多次读取,或者您的IO设备可能因为缓冲池多次刷新而出现问题

2.您还可以找到使用内存的顶级组件,这可以让您了解RAM的使用情况

SELECT TOP(20) [type], [name], SUM(single_pages_kb) AS [SPA Mem, Kb] 
FROM sys.dm_os_memory_clerks 
GROUP BY [type], [name]  
ORDER BY SUM(single_pages_kb) DESC; 
Run Code Online (Sandbox Code Playgroud)

如果缓冲池一致地使用更多的内存,我不担心,但如果它是cachestore_obcp.then你可能有很多临时查询填满缓存存储这是坏的

调查的一部分导致另一部分,因此您将不得不根据潜在客户进行故障排除,因为没有单击解决方案

附注:不推荐:
我们的一个开发实例曾经面临同样的问题,因此我们不再进行所有调整工作,而是运行以下命令,可以立即有效地释放内存..但这根本不适用于生产例如,因为这会刷新存储在缓存中的计划,您可能会面临轻微的CPU压力

DBCC FREEPROCCACHE WITH NO_INFOMSGS; 
Run Code Online (Sandbox Code Playgroud)

参考文献: