Sql server 哪些操作系统以及如何将页面固定在数据库缓冲池中?

Sql server 哪些操作系统以及如何将页面固定在数据库缓冲池中?,sql-server,oracle,postgresql,operating-system,relational-database,Sql Server,Oracle,Postgresql,Operating System,Relational Database,大多数关系数据库构造教科书都讨论了能够锁定页面的概念,即防止操作系统将其从内存中交换出去。其概念是,数据库软件可以使用自己的缓冲区替换算法,这可能比操作系统虚拟内存策略提供的任何算法都更适合 我不清楚典型的桌面操作系统是否真的为程序员提供了锁定页面的能力。例如,我在OSX上能找到的最好的页面是有线页面,但这些页面似乎只能由超级用户使用 锁定页面和定义适当的缓冲区替换策略以取代操作系统的缓冲区替换策略的概念是否仅具有理论意义,而不是真正由真正的关系数据库系统实现?或者是典型的桌面操作系统(Linu

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

我不清楚典型的桌面操作系统是否真的为程序员提供了锁定页面的能力。例如,我在OSX上能找到的最好的页面是有线页面,但这些页面似乎只能由超级用户使用

锁定页面和定义适当的缓冲区替换策略以取代操作系统的缓冲区替换策略的概念是否仅具有理论意义,而不是真正由真正的关系数据库系统实现?或者是典型的桌面操作系统(Linux、Windows、OS X)确实包含用于固定的挂钩,而典型的关系数据库软件(Oracle、SQL Server、PostgreSQL、MySQL等)使用它们?

对于SQL Server(显然是在Windows上),有一个操作系统设置,允许SQL引擎根据内存压力忽略来自操作系统的请求。该设置称为内存中的锁定页面(LPIM)。该权限是基于每个帐户授予的,并且需要在启动服务时授予运行SQL服务的帐户

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

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


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

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

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


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

在PostgreSQL中,数据库服务器从文件(或者从操作系统)复制页面进入PostgreSQL控制的共享内存段。操作系统不知道文件系统块和共享内存块之间的映射是什么,因此即使操作系统愿意,也无法将这些页面写回它们的磁盘位置,直到PostgreSQL发出一个
seek
和一个
write
命令它这样做

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


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

@jjanes说操作系统不能真正写出Pg的共享内存缓冲区是正确的,而且无法控制PostgreSQL读入的内容,所以“锁定”它是没有意义的。但这只是故事的一半

PostgreSQL不提供任何功能来固定共享内存段中表中的页面。它可以做到这一点,而且可以说是有用的,但还没有人实现它。在大多数情况下,缓冲区替换算法本身做得相当好

部分原因是PostgreSQL严重依赖于操作系统的缓冲区缓存,而不是试图实现自己的缓存。数据可能会从
共享缓冲区中移出,但它通常仍缓存在操作系统中。将
共享_缓冲区
视为一级缓存,将操作系统磁盘缓存视为二级缓存并非不合理

无论操作系统提供什么,都可以控制操作系统磁盘缓存中的内容。总的来说,这并不多,因为现代操作系统往往做得更好,如果你不去管他们,让他们去做