我了解,在 64 位系统上将锁定页面内存权限设置为包含 SQL2005/2008 服务的服务帐户会使用 AWE API,并有效地阻止 SQL 的缓冲池被分页到磁盘 - 从而提高稳定性。
但是如果您有一个具有足够可用内存的专用盒子,那么您确信 SQL 不会分页 - 本机 SQL 64 位内存管理是否更快?
答案1
简短的回答是,如果使用正确地,锁定内存页可以增强 64 位系统上的 SQL Server 性能。
长答案让我们退后几步。
首先,你需要了解分页和分页到磁盘之间的区别。在现代操作系统中,所有内存都按页分配在增值服务(虚拟地址空间)。这不是什么坏事,这就是它的工作原理。
有两个问题当不使用锁定页时,SQL Server 使用缓冲池内存的方式如下:
首先,分配内存的成本很高。当进程启动或请求更多内存时,操作系统会根据需要为其创建新页面。因此,通常情况下,SQL Server 在运行时会一直通过与操作系统通信来请求、获取和释放页面,这很昂贵。
其次,NUMA 工作得不是很好。正确的 NUMA 支持意味着应用程序可以依赖页面驻留在最靠近线程所在处理器的物理内存中,但当操作系统接管分页时,SQL Server 无法保证这一点。它必须检查每个页面请求的 NUMA 驻留,这是很昂贵的也一样。
当您启用“内存中的锁定页面”时,SQL Server 不必处理缓冲池的这些问题,因为它使用 AWE API 进行内存管理。
首先,当它请求内存时,它只这样做一次,并一次性从操作系统获取页面列表。然后,将来它可以根据需要分配这些页面,而无需向操作系统索要。
其次,由于它锁定了操作系统的页面,因此知道这些页面的属性不会改变。因此,如果该页面是 NUMA 页面,它会将其放入 NUMA 缓冲池中,而不必担心下次检查时验证它是否在 NUMA 中。
您会注意到这些改进,无论是在数据库加速时(当发生内存分配时),还是随着时间的推移(当通常 SQL Server 会处理操作系统进行页面分配/释放时)。
如果你想要更多详细信息,可以优秀的技术文章斯拉瓦·奥克斯(Slava Oks)在 SQL Server 团队工作时撰写了此书。他还有问答发表关于该主题的另一篇精彩文章NUMA 在 SQL Server 中的工作原理。
答案2
据我从与 SQL Server 产品团队的对话中了解到“内存中的锁定页面”设置,此设置控制的唯一事情是,它允许 SQL Server 忽略操作系统将所有数据分页到磁盘并刷新内存的指令。
在正常情况下,禁用“内存中的锁定页面”设置不会对您有任何好处或坏处。只有在极少数情况下,锁定内存中的页面才能帮到您。例如,Windows 2003 RTM 中存在一个错误,当运行 SQL Server 并且您在服务器上启动远程桌面会话时,操作系统会毫无理由地告诉 SQL Server 将所有内存刷新到磁盘。如果您启用了“内存中的锁定页面”设置,则 SQL Server 将忽略此指令,如果您未设置此设置,则 SQL Server 将按照指示将其缓冲区缓存刷新到磁盘。
还有其他情况,即 RAID 驱动程序和 HBA 驱动器存在错误,也会导致同样的问题。
答案3
根据我的经验,任何性能提升都会被一个问题所抵消,即有一天它会困扰你。我想说,如果你的数据增长相对较慢,并且数据库代码更改很少,那么你可以有效地实现这一点并获得一点好处。但是,如果你的数据库使用频繁,有时 sql 页会溢出,我建议不要打开它。正如向绩效团队询问的那样文章指出:
“一旦您根据性能监视器分析的结果配置了服务器,这个决定权就真正掌握在您手中了。”
我还没有找到在任何系统上打开它的理由