如何使SQL Server释放其内存?


19

我知道SQL喜欢RAM,但是在Windows询问时释放它。我知道这就是SQL应该如何工作的方式。但是我有一个Windows管理员,他不相信SQL会真正返回RAM,并且在此特定(虚拟)服务器上,一旦Analysis Services完成,SQL并不需要太多,但是此服务器上没有其他问题困扰着向SQL索要很多钱。

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

在处理多维数据集时,SQL服务会很高兴地占用8GB的RAM,但是由于没有压力,因此在正常情况下不会释放太多内存。Windows人士大喊大叫,让SQL发布它会更好。

我不想使用最大内存设置,因为我确实希望SQL在处理时使用那么多的RAM。我只希望它以后再回落。

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

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


2
什么...系统管理员抱怨正在使用RAM?当我不使用RAM时,我会变得很糟糕,因为如果不使用它
Mark Henderson

如果机器不需要内存,我也不会得到它-问题出在哪里?这就是操作系统及其应用程序正常工作的方式...给定具有空闲SQL服务的工作负载在没有其他需求的情况下保留了大多数内存,这可能会增加下一个SQL作业的响应时间和/或性能吗?
Oskar Duveborn

Windows管理员认为SQL正在使计算机承受压力,因为该进程具有大量RAM。我知道该框不会受到SQL的压力,可以通过重新启动SQL服务来演示它,这表明在获取用于SSAS处理的数据时,它仅消耗大量RAM。因此,我希望SQL释放内存以显示SQL在一天中其余时间使用的RAM量。这并不是要让他们提供更多的RAM,只是要让他们停止将SQL归咎于SQL。
罗布·法利

2
同意Farseeker的意见,sysadmin应该很高兴使用RAM。如果不对其进行回收,则服务器不需要它。也许要求系统管理员查看页面错误以表明系统没有压力?
尼克·卡瓦迪亚斯

2
如果您的系统管理员不了解页面错误代表什么,为什么不消耗内存却没有真正的页面错误发生,那么我不知道该如何帮助您。你不能解决愚蠢的问题。但是,您可以做的一件事是使用sp_configure在不使用系统时配置最大内存,并在需要时备份它。但是,这似乎很愚蠢。 sp_configure通常,您应该设置一次,然后独自离开。
培根片

Answers:


12

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

我喜欢@Nick Kavadias的建议:监视内存:Page Faults / Sec性能计数器,以表明SQL并没有使操作系统的内存处于压力之下。


2
谢谢米奇...让我找到记事本的10GB文本文件。
罗伯·法利

大声笑!,实际上这不是一个坏主意!
米奇小麦

也许使用2GB的文件...
米切尔·麦特

5

向他们表明这样做的一种方法是让SQL Server占用所有内存。然后,通过网络复制一个巨大的文件(大型SQL备份文件对此非常有用)。这将导致系统缓存填满,并且Windows将开始要求SQL返回其内存。SQL将开始将内存返回给操作系统,直到达到您的最小内存设置为止。

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


1
我希望可以使用一些过程,该过程将要求SQL退回内存(在清理并删除缓冲区之后),但不必为此费力。
罗伯·法利

我不认为有一种方法可以强制Windows内存管理器要求返回内存,而不用其他方式强制该问题。您可能会写一些直接打Win32 API的方法来这样做,但是据我所知,触发Windows请求内存的唯一方法是导致它需要更多的内存用于另一个进程。请与Bob或Paul联系,他们可能有更多信息。
mrdenny'2

3
VMware的气球驱动程序正是这样做的-它要求Windows提供越来越多的内存,以使SQL Server(或任何其他应用程序)放弃其内存。
布伦特·奥扎尔

是的-我希望我不必做类似的事情。
罗伯·法利

@ BrentOzar,VMware的Ballon驱动程序仅从系统缓存中回收内存,而不是实际进程内存;它被设计为告诉操作系统“不要将所有可用内存用于琐碎的事情”,而不是降低内存消耗。
Massimo 2012年

2

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

DBCC FREESYSTEMCACHE('<cache name>');

“缓存名称”来自sys.dm_os_memory_clerksDBCC FREESYSTEMCACHE的规范仅提到了调控器池,但是实际上可以驱除更多的缓存。

但是,如果缓冲池使用了所有内存,那么逐出整个缓冲池将导致性能大幅下降和大量IO负载。最好让SQL自己处理。


1
嗨,雷木思(Remus),在处理多维数据集之后,关系缓冲区高速缓存很大。之后,我确实希望清除,删除缓存并将内存返回给Windows。DBCC DROPCLEANBUFFERS和FREESYSTEMCACHE清空了缓存,但是不将内存返回给Windows,所以这不是我想要的。
罗伯·法利

2
从理论上讲,您可以伪造内存压力(例如,您可以蹦床QueryMemoryResourceNotification msdn.microsoft.com/en-us/library/aa366799%28VS.85%29.aspx),但我真的不会真的去那里。如果SQL不释放已提交的内存,则是因为操作系统不需要它。操作系统不需要内存,因为SQL是主机上唯一的应用程序(stackoverflow.com/questions/1401834/…),对吗?如果您沿着SQL运行其他应用程序,那么它就来了。
Remus Rusanu'2

2

通过AS和DS引擎,您可以对内存设置上限,以使它们保持在安全阈值以下;建议在具有大量RAM和/或多个SQL实例的64位计算机上使用此方法。至少对于数据库引擎而言,如果将内存上限更改为低于当前使用量,它将在不需重新启动服务的情况下即时减少内存量,尽管不确定SSAS。


有上限是可以的,但是我想在处理后将最大内存拉低,然后再将其推回去,这时我宁愿清理缓冲区,放下缓冲区并向Windows要求一些内存压力。
罗伯·法利

1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.