为什么DMBS不能依赖OS缓冲池?

时间:2010-07-03 15:26:27

标签: operating-system filesystems database

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

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

我不是在寻找通用答案(我得到了它们,并阅读了论文)。我寻求所述问题的详细答案。 见Does a file read from a Java application invoke a system call?

5 个答案:

答案 0 :(得分:2)

必须推广操作系统磁盘i / o以适用于各种情况。 DBMS有时可以使用针对其自身需求而优化的不太通用的代码来获得显着的性能。

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

<强>更新 该论文的链接是一个帮助。

首先,该论文已有近三十年的历史,指的是长期过时的硬件。尽管如此,它仍然非常有趣。

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

我记得几年前在Sun机箱上安装Oracle。它可以选择将磁盘专用于“原始”分区,Oracle将以自己的方式格式化磁盘,然后直接与设备驱动程序通信。操作系统根本无法访问磁盘。

答案 1 :(得分:2)

从您的其他问题中读取并继续前进:

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

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

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

答案 2 :(得分:1)

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

除此之外,您还不能依赖系统缓冲池的其他一些原因:

  1. 通常,DBMS对其即将到来的访问模式有一个非常好的想法,它无法将这些模式传递给内核。这可能会导致性能下降。
  2. 缓冲区缓存传统存储在固定大小的内核内存范围内,因此无法增长或缩小。这也意味着缓存比主内存小得多,因此通过使用缓冲区缓存,DBMS将无法利用系统资源。

答案 3 :(得分:1)

我知道这是旧的,但它没有得到答复。

本质:

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

    你是正确的,从OS缓冲池管理器访问数据并不比普通的read()调用贵。 (实际上,它是完成并且具有正常的读取调用。)但是,Stonebraker并没有谈论这个问题。他专门讨论了DBMS的缓存需求, 数据从磁盘读取后出现在RAM中。

    从本质上讲,他说OS的缓冲池缓存对于DBMS来说太慢了,因为它存储在不同的地址空间中。他建议在同一进程中使用本地缓存(因此相同的地址空间),这可以为像DBMS这样大量访问缓存的应用程序提供显着的加速,因为它将消除该系统调用开销。

    以下是他在同一过程中讨论使用本地缓存的确切段落:

      

    然而,许多DBMS包括INGRES   [20]和系统R [4]选择放一个   DBMS管理用户空间中的缓冲池   减少开销。因此,每一个   这些系统已经进入了   构建自己的麻烦   缓冲池管理器来增强   性能

    他还在上面引用的摘录中提到了多核问题。类似的效果也适用于此,因为如果每个核心只有一个缓存,那么当多个CPU读取和写入相同数据时,可能能够避免CPU缓存刷新速度减慢。

    **顺便说一下,我相信Stonebraker 1981年的论文实际上是pre-mmap。他提到它是未来的工作。 “将文件系统作为共享虚拟内存的一部分提供的趋势(例如,Pilot [16])可以为这个问题提供解决方案。”

答案 4 :(得分:0)

这主要是性能问题。 dbms具有高度特定和不寻常的I / O需求。

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

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

然后存在一个问题,即通用“块”实际上可能相当于一个相当大的I / O负担(这取决于分区等),而不是dbms理想情况下要承担的;可以调整自己的缓存,以便更好地处理磁盘上数据的布局,从而最大限度地减少I / O.

另一个问题是加速查询的索引和类似方法的问题,如果缓存实际上首先知道这些意味着什么,这当然会更好。