如何让 SQL Server 释放其内存?

如何让 SQL Server 释放其内存?

我知道 SQL 喜欢 RAM,但会在 Windows 要求时释放它。我知道这就是 SQL 的工作方式。但我有一个 Windows 管理员,他不相信 SQL 会真正归还 RAM,并且在这个特定的(虚拟)服务器上,一旦 Analysis Services 完成,SQL 就不需要太多,但这个服务器上没有其他东西需要向 SQL 索要太多。

因此,我试图向 Windows 管理员保证,虚拟环境的问题不是“因为 SQL 使用了太多 RAM”,但我似乎无法说服 SQL 在不重新启动服务的情况下释放它。

在处理多维数据集时,SQL 服务会占用 8GB 的​​ RAM,但由于没有压力,因此在正常情况下不会释放太多 RAM。Windows 用户尖叫道,如果 SQL 能够释放这些 RAM,那就更好了。

我不想使用最大内存设置,因为我确实希望 SQL 在处理时使用那么多 RAM。我只是希望它之后再次下降。

它可能与两者重复SQL Server 不释放内存从 SQL Server 回收内存,但我想知道是否有其他答案。等待 Windows 收回它不会说服这里的 Windows 人员。重新启动服务是一种选择,但我真的不喜欢这个想法。

我想知道如何让 Windows 要求它归还......

答案1

我相信您唯一的选择是重新启动 SQL 服务,或者运行一个消耗大量内存的应用程序来强制 SQL 释放它。

我喜欢@Nick Kavadias 的建议:监控内存:页面错误/秒性能计数器显示 SQL 尚未对操作系统的内存造成压力。

答案2

向他们展示它将做到这一点的一种方法是让 SQL Server 占用所有内存。然后通过网络复制一个巨大的文件(大型 SQL 备份文件非常适合此操作)。这将导致系统缓存填满,Windows 将开始要求 SQL 归还其内存。SQL 将开始将内存归还给操作系统,直到达到您的最小内存设置。

(抱歉,没有通过 Twitter 收到整个问题,显然需要超过 140 个字符。)

答案3

您提到了“多维数据集”,因此不清楚您是在谈论 AS 引擎还是关系引擎。关系引擎可以根据需求释放内存:

DBCC FREESYSTEMCACHE('<cache name>');

“缓存名称”取自系统.dm_os_memory_clerks. 规格数据库缓存数据库只提到了调节器池,但实际上可以驱逐更多的缓存。

但是如果所有内存都被缓冲池使用,那么驱逐整个缓冲池将导致性能大幅下降和巨大的 IO 负载。最好让 SQL 自己处理这个问题。

答案4

我发现最简单的方法是转到服务器内存属性,输入一个较小的值,应用,等待几分钟并重新调整配置。

我们还发现限制 SQL Server 内存使用量实际上可以提高服务器的性能,因为它为 Windows 提供了更多的 RAM 用于缓存等

相关内容