大家好,
我正在运行 SQL Server,其中包含大量更新大量数据(多个表上的数百万条记录)的脚本。但是,我认为存在内存泄漏,因为 RAM 使用量达到可能的 8GB 中的 7.5GB - 这是在 8 核服务器上。页面文件变为 7.28GB,因为我认为 SQL 服务器一直在占用我认为它没有使用的 RAM。
我真的需要建议什么原因导致这个问题或者如何解决这个问题!
我的设置
Microsoft Windows Server 2003
Standard 64-bit edition
Service Pack 2
SQL Server 2005
Microsoft SQL Server Management Studio 9.00.4035.00
Microsoft Analysis Services Client Tools 2005.090.4035.00
Operating System 5.2.3790
SQL Server 的应用和使用
我正在使用带有 PHp 的 SQL 服务器,其中我使用 PHP 的 exec 函数通过 SQLCMD 运行脚本和查询。
造成这么多 RAM 使用和巨大页面文件的可能原因是什么?
我希望我已提供足够的信息来尝试识别问题。如果我还应该添加或尝试找出其他内容,请告诉我。
谢谢大家
答案1
Sql Server 内存管理是一个非常广泛的话题,但这里提到的一些事情应该解决。
我假设您正在查看任务管理器以获取您指的页面文件使用情况。这是不是物理页面文件的大小或使用的物理页面文件空间量 - 这就是所谓的承担责任,这基本上是保存所有VAS(VAS和物理内存不是一回事)。如果您想要查看实际的页面文件使用情况,请查看 PagingFile:%Usage perfmon 计数器 - 它几乎肯定是一个非常小的百分比。提交费用的总大小(即任务管理器将显示为 PF 使用量)基本上是所有可能的 VAS 的总和(即所有页面文件空间 + 系统上的总物理内存)。
Sql Server 确实不是覆盖操作系统的内存管理功能 - 它使用与任何用户模式应用程序相同的 windows 提供的内存 API(主要是虚拟分配家庭和AWE 家族, 哪个仍在 64 位系统上使用), . SQL 服务器确实有一个专门管理自身内存利用率的子系统但是,这个子系统并没有做任何特殊的事情,对于任何用户模式应用程序来说,在从底层操作系统请求、接收、提交等内存方面都是如此。
正如其他人提到的,Sql Server 的设计绝对是为了根据系统/用户定义的约束尽可能多地使用内存。但是,它会根据系统的利用率增长到这个内存占用量(即,它将在启动时保留相对较少的内存,并根据需要继续从操作系统请求/保留内存)。它还被设计为(并且相当擅长)根据需要响应操作系统内存压力,并保持其保留的内存占用量,直到/除非操作系统“请求”它(要更全面地了解这一点,请参阅这个博客和这个博客和这个博客)。
如果你想强制 SQL Server 释放/缩小其当前内存占用,你可以简单地告诉它这样做(假设你正在运行 SQL 2005 及更高版本),通过降低“最大服务器内存”系统配置并运行重新配置。这当然有限制(即此配置仅限制缓冲池,但这是迄今为止最大的内存消耗者)。这是不是连接级别设置,如其他地方所提到的,它是一个系统范围的设置(有与内存相关的连接级别设置,但与这个问题无关)。如果您正在运行 Sql 2000,则需要进行调整,然后重新启动 Sql 服务 - 请注意,在 Sql 2000 上,内存管理几乎在各个方面都有很大不同(可能需要单独的问题/讨论)。
我强烈建议你阅读几篇博客了解基本的 Windows 和 SQL Server 内存管理,不应该花费太长时间,并且在尝试了解这种情况下发生的情况时非常值得了解。
答案2
SQLServer 有自己的内存管理,它会覆盖操作系统的内存管理。您可以限制它占用的内存量,有几种方法可以做到这一点,但最简单的方法可能是启动 SqlServer Management Studio,右键单击 sql 实例,选择属性,然后转到内存选项卡。如果您从托管代码调用数据库,您也可以在连接级别执行此操作。
答案3
SQL Server 是设计使用所有可用的系统内存。正如 slugster 所建议的,如果您的机器上还有其他需要 RAM 的东西,您可以限制这一点,但一般规则是感谢 SQL 正在使用 RAM :-)。