你好呀,
我们有一个相当新的 2008 服务器,配备 4GB 内存和 SQL Server 2008。我们目前正在服务几个网站,每个网站每天的点击量只有大约 300 次,因此流量非常低。
然而,随着时间的推移,SQL Server 会慢慢消耗 RAM(几天内),直到相关网站的运行速度变得非常缓慢。
解决该问题的唯一方法是重新启动 SQM 服务器进程和应用程序池。
在 SQL Server 中,最大并发连接数设置为“0”——无限制。
我的 DBA 不在,所以有人能帮助我建议我如何开始找出问题所在吗?
非常感谢
本
答案1
您需要检查以确保 SQL Server 的内存分配设置正确: http://support.microsoft.com/kb/321363
另外,检查一下是否有大量连接被打开但未被处理。运行 sp_who2 存储过程,查看连接数是否急剧增加。如果是这种情况,则说明您的代码中存在错误,您没有正确处理连接。
答案2
很可能没有任何泄漏。这是 SQL Server 的“设计”行为:将所有物理 RAM 分配给缓冲池,不给其他应用程序留下任何东西。有关详细信息,请参阅我的回复什么时候可以在同一台机器上托管 IIS 和 SQL Server?(简短回答:绝不)。
更新
如果您的数据库是 20mb,那么罪魁祸首就不太可能是缓冲池。首先要做的是检查错误日志和系统事件日志,以查找内存压力发生时的消息。每当 SQL 无法分配内存时,它都会转储详细的内部分配图,这可以帮助识别任何可能的问题。此外,您应该开始检查系统.dm_os_memory_clerks并查看哪些职员随着时间的推移而成长:
select type, sum(single_page), sum(multi_page)
from sys.dm_os_memory_clerks
group by type
order by sum(single_page+multi_page) desc;
答案3
SQL SERVER 2008 - 存储数百万条记录时发生内存泄漏
有人可以解释一下我的 Windows/SQL Server 内存使用情况吗
除此之外:
您是否有一个服务器用于 Web 和 SQL Server?不推荐
4GB RAM 是 32 位还是 64 位。3GB 是否启用了 AWE 或 PAE?
您的数据库有多大?它是否得到维护?
您是否使用过类似
sp_xml_preparedocument
的导致内存泄漏的代码?最新服务包等?
答案4
这里的诀窍是,如果 SQL Server 与您的网站位于同一台机器上(这种情况很常见,但远非最佳实践),那么 SQL Server 和 IIS 将不断争夺内存。但是,与 IIS 不同,SQL Server 不喜欢在获得内存后释放内存。可以将 IIS 中的应用程序池配置为定期回收/释放内存。在此处设置一个相当激进的值将有助于您降低应用程序池大小,但无法解决 SQL Server 问题。
解决方案是通过运行脚本(比如上面 RickNZ 发布的脚本)来限制 SQL Server 可以声明的内存量,该脚本将 SQL Server 使用的内存限制为 2048MB(2GB) - 即服务器内存的一半。
正如其他受访者所提到的:MS SQL Server 将(如果任其发展)自动申请 RAM 来满足其各种缓存需求(数据缓冲区、过程缓存、惰性写入队列等),最多占用操作系统可用内存的 95% 左右,然后才会逐渐停止使用。这本身并不是内存泄漏 - SQL Server 默认设计为作为服务器上的主要应用程序服务运行。共享服务器场景绝对是“按配置”的情况。每个从磁盘拉回一组新页面的数据查询都可能驱动以下缓存:
- 数据页
- 索引页
- 查询计划(如果表/索引中的关键数据分布不均匀,则每个存储过程可能有多个查询计划,并且还计划执行原始 SQL 查询)
如果您希望最小化缓存占用空间而不是调整内存,则需要了解参数嗅探、查询计划缓存等主题,并使用函数和视图等代码对象来最小化返回到查询的数据量。
希望有所帮助。
奥齐米德斯