我知道 SQL 喜欢 RAM,但在 Windows 询问时会释放它。我知道这就是 SQL 应该如何工作的。但是我有一个 Windows 管理员,他不相信 SQL 会真正返回 RAM,并且在这个特定的(虚拟)服务器上,一旦 Analysis Services 完成,SQL 就不需要太多了,但是这台服务器上没有其他东西可以打扰多问 SQL。
所以我试图向 Windows 管理员保证虚拟环境的问题不是“因为 SQL 使用了太多的 RAM”,但我似乎无法说服 SQL 在不重新启动服务的情况下释放它。
在处理多维数据集时,SQL 服务很高兴地占用了 8GB 的 RAM,但由于它没有压力,所以它在正常的一天不会释放太多。Windows 的人尖叫,让 SQL 发布这个会更好。
我不想使用最大内存设置,因为我确实希望 SQL 在处理时使用那么多 RAM。我只是希望它之后再次下降。
它可能是SQL Server not release Memory和Reclaiming memory from SQL Server的副本,但我想知道是否有不同的答案。等待 Windows 收回它并不能说服这里的 Windows 人。重新启动服务是一种选择,但我真的不喜欢这个想法。
我想知道如何让 Windows 要求它回来......
我相信你唯一的选择是重新启动 SQL 服务,或者运行一个消耗大量内存的应用程序来强制 SQL 释放它。
我喜欢@Nick Kavadias 的建议:监控内存:页面错误/秒性能计数器,以表明 SQL 并未对操作系统的内存施加压力。
向他们展示它会这样做的一种方法是让 SQL Server 吞噬所有内存。然后通过网络复制一个大文件(大的 SQL 备份文件非常适合这个)。这将导致系统缓存被填满,并且 Windows 将开始向 SQL 请求其内存。SQL 将开始将内存返回给操作系统,直到达到您的最小内存设置。
(很抱歉没有通过 Twitter 得到整个问题,显然需要超过 140 个字符。)
您提到“多维数据集”,因此不清楚您是在谈论 AS 引擎还是关系引擎。关系引擎可以按需释放内存:
其中“缓存名称”取自sys.dm_os_memory_clerks。DBCC FREESYSTEMCACHE的规范只提到了调控器池,但实际上可以驱逐更多的缓存。
但是如果所有内存都被缓冲池使用,那么驱逐整个缓冲池将导致巨大的性能下降和巨大的 IO 负载。最好让 SQL 自己处理。
使用 AS 和 DS 引擎,您可以对内存设置上限,使其保持在安全阈值以下;建议在具有大量 RAM 和/或多个 SQL 实例的 64 位计算机上这样做。至少对于数据库引擎,如果您将内存上限更改为低于当前使用量,它将减少动态内存量而无需重新启动服务,但不确定 SSAS。
我发现最简单的方法是转到服务器内存属性,输入一个较小的值,应用,等待几分钟并调整配置备份。
我们还发现限制 sql 服务器内存使用实际上可以提高服务器的性能,因为它为 Windows 提供了更多的内存用于缓存等