我知道 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 用于缓存等