SQL 2008R2在Windows 2008R2上的推荐页面文件大小是多少?

这篇微软文章 - 如何确定64位版本的Windows Server 2008或Windows 2008 R2适当的页面文件大小 提供了计算64位Windows 2008和Windows 2008R2页面文件大小的指导。这对于一般用途的服务器无疑是有效的。 我想知道在运行在Windows 2008/R2 64位上的SQL Server 2008R2的情况下,该怎么指导? 我假设我们希望尽量减少内存中的数据进入页面文件,否则SQL可能会对数据进行两次磁盘访问。 SQL Server是否允许将数据存放在内存中并进入页面文件?我已经在SQL Server 2008 R2 Books Online中搜索了很多,但还没有找到关于页面文件使用的任何提到。

这是一个潜在的使用情景:如果有一台具有64GB内存的物理服务器,是否需要一整个64GB的页面文件呢?我们应该将它配置为96GB的页面文件吗?对于一个单个文件来说,这似乎过于冗余。我知道传统观点是Windows将页面文件与内存耦合在一起,以便更轻松地交换应用程序的RAM,但这是真的吗?少于64GB的页面文件会影响性能吗?

3个回答

通常情况下,SQL Server没有特殊的设置,只使用物理内存。

按照微软的建议来配置Windows就可以了。

哦,顺便说一句,在这个话题上,不管怎样还是多买点内存吧... ;-)


了解一下锁定内存中的页面。这样,您可以优先让SQL服务账户使用可用的RAM而不是分页到磁盘上。要了解更多关于锁定内存中的页面,请查看链接。以下是一段摘录:

Windows策略“锁定内存中的页面”选项默认情况下是禁用的。必须启用此特权才能配置地址窗口扩展(AWE)。该策略确定哪些帐户可以使用进程将数据保留在物理内存中,防止系统将数据分页到虚拟内存磁盘上。在32位操作系统上,如果不使用AWE而设置此特权,可能会严重影响系统性能。在64位操作系统上不需要锁定内存中的页面。

请在使用之前先测试此功能。


4“锁定内存页面”可能更好地描述为一种保护措施,以防止操作系统将SQL内存分页。http://support.microsoft.com/kb/918483 - Mark Storey-Smith

是的,对于64GB的RAM,您至少需要64GB的交换文件(建议使用96GB)。这不是因为潜在的交换问题,而是由于Windows内存管理器的设计。我之前在System pagefile size on machines with large RAM中写过这个问题:

当一个进程通过VirtualAlloc/VirtualAllocEx请求MEM_COMMIT内存时,所请求的大小需要在页面文件中保留。这在第一个Win NT系统中是正确的,今天仍然如此,请参阅Managing Virtual Memory in Win32

当内存被提交时,物理内存页被分配,并在页面文件中保留空间。

另一种选择可能是类似于oom_killer

所以请遵循建议,有时候事情比看起来的要复杂一些。而且我甚至还没有涉及由AWE和锁定页面特权带来的复杂性...

非常有趣...那么,当你在机器上设置一个比RAM更小的交换文件时,它是如何工作的呢?如果确实需要为每个内存分配保留页面文件中的空间,那么我们将无法使用超过页面文件大小的内存?我不确定这是否符合实际情况。 - shlomoid
1这就是实际运作的方式。一个承诺的VA区域必须有真实的交换预留支持。一个“保留”的VA区域不一定需要,但SQL Server几乎从不请求非承诺的预留。 - Remus Rusanu
2我不认为这是正确的。根据我从各种来源(如《Windows Internals》书籍)了解到的情况,承诺的虚拟地址空间必须由某种物理资源支持,无论是页面文件还是RAM。因此,如果您尝试提交超过([Windows可见的物理内存] + [分页文件大小])的虚拟内存,您将收到臭名昭著的“系统虚拟内存不足”错误消息。Mark Russinovich在标题为“committed memory”的部分中谈到了这个问题,详情请参阅此处 - James Lupolt
5我认为你可以自己确认,承诺的虚拟地址(VA)区域不一定需要由交换空间预留支持,只需启动一个没有分页文件的系统并确认Windows能够正常启动,因此必然存在超过0字节的承诺虚拟地址空间。 - James Lupolt
这篇文章是错误的-如果您有超过最大提交需求的内存,完全可以在没有页面文件的情况下运行。不过这意味着您将无法编写崩溃转储文件。 - Steve365