我的问题针对 Postgres,但来自任何数据库背景的答案可能就足够了。
我的假设是否正确:
- 磁盘有固定的块大小?
- RAID 控制器可以有不同的块大小?一个 RAID 块是否会拆分为多个真实磁盘块?
- 文件系统也有一个独立的块大小,它又被分割成 RAID 块大小?
- Postgres 使用固定的 8k 块。到文件系统块大小的映射如何在这里发生?Postgres 8k 块是否由文件系统批处理在一起?
设置系统时最好将所有块都设置为 8k?还是设置不重要?我还想知道一些“错误”的块大小设置是否会在崩溃时危及数据完整性?也许如果必须将 Postgres 8k 块拆分为多个磁盘块?
或者没有任何东西被批处理在一起,因此我会因为定义的块大小之间的每一次不匹配而失去磁盘空间?
磁盘扇区
磁盘具有固定的扇区大小,在某些现代磁盘上通常为 512 字节或 4096 字节;这些磁盘还将具有模拟 512 字节扇区的模式。磁盘将具有不同数量的扇区的磁道;靠近磁盘外部的磁道具有更多扇区,因为它们有更多空间容纳给定的位密度。这样可以更有效地使用磁盘空间;通常,一个磁道在现代磁盘上会有 1,000 个 512 字节的扇区。
一些格式化结构还可以在 sectrs 中包含纠错信息,这体现在磁盘被低级格式化为 520 或 528 字节扇区。在这种情况下,该扇区仍有 512 字节的用户数据。尽管 i5OS (IBM iSeries) 和各种 SAN 控制器支持,但 Windows 和 Linux 都不直接支持这一点。
通常扇区/磁头/磁道被翻译成逻辑块地址;由于向后兼容性的历史问题,操作系统(特别是在 IDE 和 SATA 磁盘上)看到的几何形状(磁头 x 扇区 x 磁道)通常与其物理结构无关。
RAID 条带大小
RAID 控制器可以为使用条带化的阵列设置条带大小(例如 RAID-5 或 RAID-10)。如果阵列有(例如)一个 128k 的条带,则每个磁盘有 128k 的连续数据,然后下一组数据在下一个磁盘上。通常,您可以期望磁盘每转一圈获得大约一个条带,因此条带大小可能会影响某些工作负载的性能。
分区对齐
磁盘分区可能与 RAID 条带完全对齐,也可能不完全对齐,如果未对齐,可能会因拆分读取而导致性能下降。某些系统(例如 Windows 2008 服务器)会自动配置分区以与磁盘卷条带大小对齐。有些(例如 Windows 2003 服务器)不会,您必须使用支持条带对齐的分区实用程序来确保它们支持。
文件系统块大小
文件系统将以一定大小的块分配存储块。通常这是可配置的——例如 NTFS 将支持从 (IIRC) 4K 到 64K 的分配单元。分区和文件系统块与 RAID 条带未对齐可能会导致单个文件系统块读取产生多个磁盘访问,如果文件系统块与 RAID 条带正确对齐,则只需要一次访问。
数据库块大小
数据库将以给定的块大小在表或索引中分配空间。对于 SQL Server,这是 8K,而 8K 是许多系统的默认值。在某些系统(例如 Oracle)上,这是可配置的,而在 PostgreSQL 上,它是构建时选项。在大多数系统上,对表的空间分配通常是在较大的块中完成的,块在这些块中分配。
文件系统和数据分配块的未对齐可能会为单个块写入生成多个 I/O,这可能会导致性能下降。
I/O 分块
通常,DBMS 实际上会以多于一个块的块的形式执行其 I/O。例如,在 SQL Server 上,所有 I/O 都以 8 个块的块完成,总共 64k)。在 Oracle 上,这是可配置的。对 PostgreSQL 文档的随意检查并没有揭示 PostgreSQL 是否这样做的具体描述,所以我不确定它在这个平台上是如何工作的。
当 I/O 块大于文件系统块大小或与 RAID 条带边界未对齐时,从 DB 写入磁盘可能会导致多个磁盘写入,从而产生性能损失。
磁盘空间使用
不会浪费磁盘空间 - 数据库 I/O 将使用磁盘上的一个或多个物理 I/O 操作来完成 - 但不正确地调整 I/O 会导致效率低下,从而降低数据库速度。必须对齐的主要内容是:
RAID 条带和分区 - 分区应从 RAID 条带边界开始。
文件系统 I/O 分配和 RAID 条带/分区边界 - RAID 条带边界必须与文件系统分配单元对齐,并且应该是文件系统分配单元大小的倍数。
磁盘写入大小和文件系统分配单元大小。数据库 I/O 操作和文件系统 I/O 操作之间应该存在 1:1 的关系。
与其他情况相比,错位不会产生更大的数据完整性问题。数据库和文件系统有适当的机制来确保文件系统操作是原子的。通常,磁盘崩溃会导致数据丢失,但不会导致数据完整性问题。