繁体   English   中英

哪些页面可以固定数据库缓冲池中的操作系统?如何固定页面?

[英]Which operating systems, and how, can pin pages in a database buffer pool?

大多数关系数据库构造教科书都讨论了能够固定页面的概念,即防止操作系统将其交换出内存。 这个概念是为了使数据库软件可以使用其自己的缓冲区替换算法,该算法可能比操作系统虚拟内存策略提供的更合适。

我不清楚典型的台式机操作系统是否实际上为程序员提供了固定页面的功能。 例如,我在OS X上可以找到的最好的内容是有线页面,但是这些页面似乎只能由超级用户使用。

固定页面,定义适当的缓冲区替换策略(取代操作系统)的概念只是理论上的考虑,而没有真正的关系数据库系统真正实现的概念吗? 还是典型的台式机OS(Linux,Windows,OS X)确实包含用于固定的挂钩,而典型的关系数据库软件(Oracle,SQL Server,PostgreSQL,MySQL等)使用它们吗?

在PostgreSQL中,数据库服务器将页面从文件(或实际上是从OS)复制到PostgreSQL控制的共享内存段中。 操作系统不知道文件系统块和共享内存块之间的映射是什么,因此,即使PostgreSQL愿意,操作系统也无法将这些页面写回到它们的磁盘位置,直到PostgreSQL指示这样做为止。发出seekwrite

操作系统可以决定将部分共享内存从磁盘中交换出到交换分区中(例如,如果处于严重的内存压力下),但由于不知道,因此无法将它们写回到磁盘上的本机位置那是什么位置。

有一些方法可以告诉操作系统不要分页内存的某些部分,例如shmctl(shmid,SHM_LOCK,NULL) 但是这些主要是出于安全目的,而不是性能目的。 例如,您使用它来防止非常敏感的信息(例如私钥的解密副本)意外写入交换分区,以防坏人从中将其恢复。

@jjanes是正确的说法,表示操作系统无法真正写出Pg的共享内存缓冲区,也无法控制PostgreSQL读入的内容,因此“固定”它没有任何意义。 但这只是故事的一半。

PostgreSQL没有提供任何功能来固定其共享内存段中的表中的页面。 它可以这样做,并且可以说是有用的,但是没有人实现它。 在大多数情况下,缓冲区替换算法本身就可以很好地完成工作。

部分原因是因为PostgreSQL严重依赖于操作系统的缓冲区高速缓存,而不是尝试实现自己的缓冲区。 数据可能会从shared_buffers中逐出,但通常仍会缓存在OS中。 shared_buffers视为第一级缓存,将OS磁盘缓存视为第二级缓存并非没有道理。

操作系统提供的功能可用来控制操作系统磁盘缓存中保留的内容。 通常,这并不多,因为如果您不理会现代OS,让它们自己管理事情,现代OS往往会做得更好。

手动缓冲区管理等概念在很大程度上是IMO的遗迹,当时系统具有更简单,效率更低的算法来自动管理缓存和缓冲区。

自动化失败的主要时间是,如果您只断断续续地使用某些东西,但是您想确保它在使用时具有非常好的响应时间。 也就是说,您希望降低整个系统的吞吐量,以使其一部分响应更快。 PostgreSQL对此没有太多控制; 大多数人只是简单地确保他们定期查询感兴趣的数据以使其在高速缓存中保持温暖。

您可以为mmap()文件编写一个相对简单的扩展名,然后为mlock()其范围编写一个扩展名,但是这样做会很浪费,而且您必须弄乱默认的操作系统限制,该限制旨在阻止您锁定过多的内存。

(FWIW,我认为Oracle提供了很多对固定关系,索引等的控制,以适应其“手动控制所有内容,不管您是否愿意”的理念,并且在此过程中绕过了很多操作系统。)

对于SQL Server(很明显在Windows上),有一个OS设置,允许SQL引擎忽略OS的请求以响应内存压力。 该设置称为“内存中的锁定页面(LPIM)”。 该权限是按帐户授予的,并且在启动服务时需要授予运行SQL服务的帐户的权限。

请记住,这并不总是一个好主意。 例如,在虚拟化环境中,管理程序通过来宾中的气球驱动程序进程传达其内存需求。 如果虚拟机管理程序需要更多的内存,则会增加客户机中气球的内存需求。 如果您的SQL进程已打开LPIM,它将不会响应,因此管理程序可以开始进行标记。 而且,如果系统管理程序不满意,也不会没人高兴。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM