在我们具有32 GB RAM的服务器上,我们有一个正在运行的SQL server实例,其最大内存上限为80%。
当内存利用率较低时,一切工作正常。请看下面的屏幕截图

但随着时间的推移,3-4天后SQL将使用全部RAM (占总数的80%)。
在这3-4天内,我们没有对服务器进行任何更改,但它每天都在消耗更多的RAM。
当它达到最大限制时,整个性能都会发生变化,我们的网站上会出现查询超时。在毫秒内执行相同的查询需要很多秒。
在这一点上,我们别无选择,只能重新启动整个服务器,一切都恢复正常。(仅重新启动服务不起作用)
这将工作一周左右,之后我们必须重新启动它
我在网上读到,SQL server不释放内存。但他们也提到,这是SQL的功能,但不会影响性能。在我的情况下,它是这样的,性能会受到影响。
是否存在内存泄漏?或者一个存储的进程消耗了大量的内存,并且永远不会释放它?如果是这样,我该如何调试它呢?
发布于 2017-08-01 14:13:59
默认情况下,如果未设置上限,SQL server将消耗整个内存,并在capped.This为Normal.You时使用所有可用内存。SQL server还必须确保SQLSERVER是机器(推荐)和also try to cap memory as per best practices上唯一的应用程序。
我将使用以下方法开始故障排除
1.开始查找消耗内存最多的查询,看看是否可以减少查询的内存使用量..memory消耗查询可以通过下面的查询找到。
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既然您发现了导致高内存的查询,那么您需要对它们进行微调,看看是否可以减少内存使用量。
例如:查询可能由于不合适的索引而执行多次读取,或者您的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; 如果缓冲池持续使用更多的内存,我不会担心这个问题,但是如果是cachestore_obcp.then,可能会有许多即席查询填满缓存存储,这是不好的
调查的一部分导致另一部分,因此您将不得不根据线索进行故障排除,因为没有单击解决方案
旁注:不推荐:
我们的一个开发实例曾经面临过同样的问题,所以我们过去常常运行下面的命令来有效地释放内存immediately..but,而不是执行所有的调优工作。对于生产实例,根本不建议这样做,因为这会刷新缓存中存储的计划,并且您可能会面临轻微的CPU压力。
DBCC FREEPROCCACHE WITH NO_INFOMSGS; 参考:
发布于 2017-08-01 14:19:26
你需要找出最昂贵的查询,并需要审查查询代码,很多时候查询代码没有得到有效的优化。您需要进行性能调优。
https://stackoverflow.com/questions/45429953
复制相似问题