Operating system 为什么可以';DMB是否依赖操作系统缓冲池?

Operating system 为什么可以';DMB是否依赖操作系统缓冲池?,operating-system,filesystems,database,Operating System,Filesystems,Database,Stonebraker的论文()解释说,“从缓冲池管理器获取块的开销通常包括系统调用和核心到核心的移动。”忘记缓冲区替换策略等吧。我唯一要问的是引用的 我的理解是,当DBMS想要读取块x时,它会发出一条公共读取指令。这与任何其他请求读取的应用程序都没有区别 我不是在寻找一般的答案(我得到了答案,并且阅读了论文)。我寻求所描述问题的详细答案。 请参见操作系统磁盘i/o必须通用化,以适用于各种情况。DBMS有时可以使用针对自身需求进行优化的通用性较差的代码来获得显著的性能 DBMS有自己的缓存,因此

Stonebraker的论文()解释说,“从缓冲池管理器获取块的开销通常包括系统调用和核心到核心的移动。”忘记缓冲区替换策略等吧。我唯一要问的是引用的

我的理解是,当DBMS想要读取块x时,它会发出一条公共读取指令。这与任何其他请求读取的应用程序都没有区别

我不是在寻找一般的答案(我得到了答案,并且阅读了论文)。我寻求所描述问题的详细答案。
请参见

操作系统磁盘i/o必须通用化,以适用于各种情况。DBMS有时可以使用针对自身需求进行优化的通用性较差的代码来获得显著的性能

DBMS有自己的缓存,因此不希望通过O/S缓存工作。它“拥有”磁盘补丁,因此不必担心与其他进程共享

更新 这篇论文的链接是一个帮助

首先,这篇论文已经有将近三十年的历史了,它所指的是长期过时的硬件。尽管如此,这本书读起来还是很有趣的

首先,了解磁盘i/o是一个分层过程。那是1981年,现在更是如此。在最低点,设备驱动程序将向硬件发出物理读/写指令。上面可能是o/s内核代码,然后是o/s用户空间代码,然后是应用程序。在C程序的fread()和磁头移动之间,至少有三到四个级别,可能更多。DBMS可能寻求提高性能,也可能寻求绕过某些层,直接与内核对话,甚至更低


我记得几年前在太阳箱上安装Oracle。它可以选择将一个磁盘作为一个“原始”分区,Oracle可以用自己的方式格式化磁盘,然后直接与设备驱动程序对话。O/S根本无法访问磁盘。

这主要是性能问题。dbms具有非常特殊的I/O需求

操作系统可能有任意数量的进程进行I/O,并用由此产生的各种缓存数据填充其缓冲区

当然,还存在大小和缓存内容的问题(dbms可能比更通用的设备缓冲缓存更好地满足其需求)

还有一个问题是,一个通用的“块”实际上可能相当于一个比dbms理想情况下要承受的更大的I/O负担(这取决于分区等);它自己的缓存可以调整为更好地配合磁盘上的数据布局,从而能够最大限度地减少I/O


另一个问题是索引和类似的加速查询的方法,如果缓存一开始就知道这些方法的含义,当然效果会更好。

真正的问题是文件缓冲缓存不在DBMS使用的文件系统中;并由驻留在系统中的所有文件系统共享。任何从内核读取的内存都必须复制到用户空间:这是您所读到的核心到核心的移动

除此之外,还有其他一些无法依赖系统缓冲池的原因:

  • 通常,DBMS对即将到来的访问模式有很好的了解,但它无法将这些模式与内核通信。这可能会导致性能降低
  • 传统上,缓冲缓存存储在固定大小的内核内存范围内,因此它不能增长或收缩。这也意味着缓存比主存小得多,因此通过使用缓冲缓存,DBMS将无法利用系统资源

  • 阅读你的另一个问题,并继续努力:

    当DBMS必须从磁盘带来一个页面时,它将至少涉及一个系统调用。在这一点上,大多数DBMS将页面放入自己的缓冲区。(它们最终也会进入操作系统的缓冲区,但这并不重要)

    所以,我们有一个系统调用。但是,我们可以避免任何进一步的系统调用。这是可能的,因为DBMS正在自己的内存空间中缓存页面。当DBMS决定它需要一个页面时,首先要做的是检查它是否在缓存中。如果有,它将从那里检索它,而不调用系统调用


    DBMS可以以最有利于其IO需求的任何方式使缓存中的页面过期。操作系统的缓存以一种更普遍的方式过期,因为操作系统还有其他事情要担心。一个例子是DBMS通常会使用大量内存来缓存页面,因为它知道磁盘IO是它能做的最昂贵的事情之一。操作系统不会这样做,因为它必须平衡磁盘IO的成本和其他应用程序使用的内存。

    我知道这很旧,但它没有得到回答

    基本上:

  • 操作系统为每个进程使用单独的地址空间
  • 从任何其他地址空间检索信息需要系统调用或页面错误**(见下文)
  • DBMS是一个有自己地址空间的进程
  • Stonebraker描述的操作系统缓冲池位于内核地址空间中 所以。。。要将数据从内核地址空间获取到DBMS的地址空间,系统调用或页面错误是不可避免的

    您认为从OS缓冲池管理器访问数据并不比普通的read()调用昂贵,这是正确的。(事实上,这是通过正常的读取调用完成的。)然而,Stonebraker并没有谈论这一点。他特别讨论了DBMS的缓存需求,在从磁盘读取数据并存在于RAM中之后

    本质上,他是说操作系统的缓冲池缓存太慢,DBMS无法使用,因为它存储在不同的地址空间中。他建议在同一进程中使用本地缓存(因此使用相同的地址空间),这样可以