下一页 上一页 目录

8. 性能、工具和一般性愚蠢问题

  1. : 我在 /dev/sda2/dev/sda3 上创建了一个 RAID-0 设备。这个设备比单个分区慢很多。难道 md 不是一堆垃圾吗?
    : 要使 RAID-0 设备全速运行,你必须使用来自不同磁盘的分区。此外,将镜像的两个部分放在同一磁盘上,无法为你提供任何针对磁盘故障的保护。
  2. : 既然 RAID-0 能做同样的事情,而且提供更高的性能,那么 RAID-linear 有什么用处?
    : RAID-0 总是提供更好性能这一点并不明显;事实上,在某些情况下,它可能会使情况更糟。ext2fs 文件系统将文件分散在整个分区中,并尝试保持一个文件的所有块是连续的,这基本上是为了防止碎片。因此,ext2fs 的行为“就像”每个文件都有一个(可变大小的)条带。如果将多个磁盘连接成一个 RAID-linear,这将导致文件在统计上分布在每个磁盘上。因此,至少对于 ext2fs 而言,RAID-linear 的行为将非常像条带大小很大的 RAID-0。相反,如果同时访问多个大型文件,条带大小很小的 RAID-0 可能会导致过度的磁盘活动,从而导致性能严重下降。

    在许多情况下,RAID-0 可能是一个明显的优势。例如,想象一个大型数据库文件。由于 ext2fs 尝试将一个文件的所有块聚集在一起,因此如果使用 RAID-linear,它很可能最终只在一个驱动器上,但如果使用 RAID-0,则会被切成许多条带。现在想象一下,许多(内核)线程都在尝试随机访问这个数据库。在 RAID-linear 下,所有访问都将转到一个磁盘,这不如 RAID-0 所带来的并行访问效率高。

  3. : RAID-0 如何处理不同条带分区大小不同的情况?条带是否均匀分布?
    : 为了理解这一点,让我们看一个包含三个分区的例子;一个 50MB,一个 90MB,一个 125MB。我们称 50MB 磁盘为 D0,90MB 磁盘为 D1,125MB 磁盘为 D2。当你启动设备时,驱动程序会计算“条带区域”。在这种情况下,它找到 3 个区域,定义如下
                Z0 : (D0/D1/D2) 3 x 50 = 150MB  total in this zone
                Z1 : (D1/D2)  2 x 40 = 80MB total in this zone
                Z2 : (D2) 125-50-40 = 35MB total in this zone.
                
    
    你可以看到,区域的总大小是虚拟设备的大小,但是,根据区域的不同,条带化是不同的。Z2 相当低效,因为它只有一个磁盘。由于 ext2fs 和大多数其他 Unix 文件系统将文件分布在整个磁盘上,因此你有 35/265 = 13% 的几率,一个填充最终会落在 Z2 上,并且无法获得任何条带化的好处。(DOS 尝试从头到尾填充磁盘,因此,最旧的文件将最终落在 Z0 上。但是,这种策略会导致严重的文件系统碎片,这就是为什么除了 DOS 之外没有人这样做。)
  4. : 我有一些 X 品牌硬盘和一个 Y 品牌控制器。并正在考虑使用 md。这是否会显著提高吞吐量?性能真的明显吗?
    : 答案取决于你使用的配置。

    Linux MD RAID-0 和 RAID-linear 性能

    如果系统负载很重,有大量的 I/O,从统计学上讲,其中一部分将转到一个磁盘,另一部分将转到其他磁盘。因此,性能将比单个大型磁盘有所提高。实际的改进很大程度上取决于实际数据、条带大小和其他因素。在 I/O 使用率较低的系统中,性能与单个磁盘的性能相同。

    Linux MD RAID-1 (镜像) 读取性能

    MD 实现了读取平衡。也就是说,RAID-1 代码将在镜像中的每个(两个或多个)磁盘之间交替,对每个磁盘进行交替读取。在低 I/O 情况下,这根本不会改变性能:你将不得不等待一个磁盘完成读取。但是,在具有两个磁盘的高 I/O 环境中,这可能会使读取性能提高一倍,因为可以并行地向每个磁盘发出读取请求。对于镜像中的 N 个磁盘,这可以将性能提高 N 倍。

    Linux MD RAID-1 (镜像) 写入性能

    必须等待写入操作发生在镜像中的所有磁盘上。这是因为必须将数据副本写入镜像中的每个磁盘。因此,性能将大致等于写入单个磁盘的性能。

    Linux MD RAID-4/5 读取性能

    从统计学上讲,给定的块可以位于多个磁盘驱动器中的任何一个上,因此 RAID-4/5 的读取性能很像 RAID-0。这将取决于数据、条带大小和应用程序。它不会像镜像阵列的读取性能那样好。

    Linux MD RAID-4/5 写入性能

    通常,这将比单个磁盘慢得多。这是因为奇偶校验位必须写入一个驱动器,数据也必须写入另一个驱动器。但是,为了计算新的奇偶校验位,必须首先读取旧的奇偶校验位和旧数据。旧数据、新数据和旧奇偶校验位都必须进行异或运算才能确定新的奇偶校验位:除了大量的磁盘访问之外,这还需要大量的 CPU 周期。

  5. : 我应该使用哪种 RAID 配置以获得最佳性能?
    : 目标是最大化吞吐量,还是最小化延迟?没有简单的答案,因为有很多因素会影响性能
    • 操作系统 - 是一个进程/线程,还是多个进程/线程执行磁盘访问?
    • 应用程序 - 是以顺序方式访问数据,还是随机访问?
    • 文件系统 - 是聚集文件还是分散文件(ext2fs 将一个文件的块聚集在一起,并分散文件)
    • 磁盘驱动程序 - 预读的块数(这是一个可调参数)
    • CEC 硬件 - 一个驱动器控制器,还是多个?
    • 硬盘控制器 - 能够对多个请求进行排队吗?它是否提供缓存?
    • 硬盘驱动器 - 缓冲缓存内存大小 -- 它是否足够大以处理你想要的写入大小和速率?
    • 物理盘片 - 每柱面块数 -- 访问不同柱面上的块将导致寻道。
  6. : RAID-5 的最佳性能配置是什么?
    : 由于 RAID-5 的 I/O 负载在多个驱动器之间平均分配,因此当 RAID 集通过使用相同的驱动器、相同的控制器以及每个控制器上相同(低)数量的驱动器来平衡时,将获得最佳性能。但是请注意,使用相同的组件会增加同时发生多次故障的可能性,例如由于突然的震动或跌落、过热或雷雨期间的电源浪涌。混合品牌和型号有助于降低这种风险。
  7. : RAID-4/5 阵列的最佳块大小是多少?
    : 当使用当前的(1997 年 11 月)RAID-4/5 实现时,强烈建议使用 mke2fs -b 4096 而不是默认的 1024 字节文件系统块大小来创建文件系统。

    这是因为当前的 RAID-5 实现为每个磁盘块分配一个 4K 内存页;如果磁盘块只有 1K 大小,那么 RAID-5 为挂起的 I/O 分配的内存将有 75% 未被使用。如果磁盘块大小与内存页大小匹配,则驱动程序可以(潜在地)使用所有页。因此,对于具有 4096 块大小而不是 1024 字节块大小的文件系统,RAID 驱动程序可能会将 4 倍的挂起 I/O 排队到低级驱动程序,而无需分配额外的内存。

    注意:以上评论不适用于软件 RAID-0/1/linear 驱动程序。

    注意: 关于 4K 内存页大小的声明适用于 Intel x86 架构。Alpha、Sparc 和其他 CPU 上的页大小是不同的;我相信它们在 Alpha/Sparc 上是 8K (????)。相应地调整上述数字。

    注意: 如果你的文件系统有很多小文件(小于 10KB 大小的文件),则可能会浪费相当一部分磁盘空间。这是因为文件系统以块大小的倍数分配磁盘空间。为小文件分配大块显然会导致磁盘空间浪费:因此,你可能希望坚持使用小块大小,获得更大的有效存储容量,而不必担心由于块大小/页大小不匹配而导致的“浪费”内存。

    注意: 大多数“典型”系统没有那么多小文件。也就是说,尽管可能有成千上万的小文件,但这只会导致大约 10 到 100MB 的空间浪费,这对于多 GB 磁盘上的性能来说可能是可以接受的权衡。

    但是,对于新闻服务器,可能存在成千上万个小文件。在这种情况下,较小的块大小,以及由此带来的改进的存储容量,可能比更高效的 I/O 调度更重要。

    注意: 存在一个用于 Linux 的实验性文件系统,它将小文件和文件块打包到一个块中。当平均文件大小远小于块大小时,它显然具有一些非常积极的性能影响。

    注意:未来的版本可能会实现使上述讨论过时的方案。但是,这很难实现,因为动态运行时分配可能导致死锁;当前的实现执行静态预分配。

  8. : 块大小(条带大小)如何影响我的 RAID-0、RAID-4 或 RAID-5 设备的速度?
    : 块大小是虚拟设备上连续的数据量,也是物理设备上连续的数据量。在本 HOWTO 中,“块”和“条带”指的是同一事物:在其他 RAID 文档中通常称为“条带”的内容在 MD 手册页中称为“块”。条带或块仅适用于 RAID 0、4 和 5,因为镜像 (RAID-1) 和简单连接 (RAID-linear) 中不使用条带。条带大小会影响读取和写入延迟(延迟)、吞吐量(带宽)以及独立操作之间的争用(同时服务重叠 I/O 请求的能力)。

    假设使用 ext2fs 文件系统,以及当前内核关于预读的策略,大的条带大小几乎总是比小的条带大小更好,条带大小从大约四分之一到整个磁盘柱面大小可能是最佳的。为了理解这一说法,让我们考虑大条带对小文件的影响,以及小条带对大文件的影响。条带大小不影响小文件的读取性能:对于 N 个驱动器的阵列,文件有 1/N 的几率完全位于任何一个驱动器上的一个条带内。因此,读取延迟和带宽都将与单个驱动器相当。假设小文件在文件系统周围统计分布良好(并且,使用 ext2fs 文件系统,它们应该是),则应该可以大致同时进行 N 倍以上的重叠并发读取,而它们之间没有明显的冲突。相反,如果使用非常小的条带,并且顺序读取一个大文件,则会向阵列中的所有磁盘发出读取请求。对于单个大文件的读取,延迟几乎会加倍,因为块位于 3/4 圈或更远处的概率会增加。但是,请注意权衡:读取单个大文件的带宽可能会提高近 N 倍,因为 N 个驱动器可以同时读取(也就是说,如果使用预读以保持所有磁盘都处于活动状态)。但是,还有另一个相互抵消的权衡:如果所有驱动器都已忙于读取一个文件,那么尝试同时读取第二个或第三个文件将导致严重的争用,从而破坏性能,因为磁盘寻道算法会导致盘片上的寻道。因此,大的条带几乎总是会导致最佳性能。唯一的例外是每次流式传输单个大文件的情况,并且需要尽可能高的带宽,并且还使用了良好的预读算法,在这种情况下,需要小的条带。

    请注意,本 HOWTO 之前建议新闻 spool 或其他具有大量小文件的系统使用小的条带大小。这是一个糟糕的建议,原因如下:新闻 spool 不仅包含许多小文件,还包含大型摘要文件以及大型目录。如果摘要文件大于条带大小,则读取它将导致访问许多磁盘,从而减慢速度,因为每个磁盘都执行寻道。同样,当前的 ext2fs 文件系统以线性顺序方式搜索目录。因此,要查找给定的文件或 inode,平均会读取一半的目录。如果此目录分布在多个条带(多个磁盘)上,则目录读取(例如,由于 ls 命令)可能会变得非常慢。感谢 Steven A. Reisman < sar@pressenter.com> 的这一更正。Steve 还补充道

    我发现使用 256k 条带可以获得更好的性能。我怀疑最佳大小将是磁盘柱面大小(或者可能是磁盘驱动器的扇区缓存大小)。但是,现在的磁盘具有带有不同扇区计数的记录区(并且扇区缓存因不同的磁盘型号而异)。无法保证条带不会跨越柱面边界。

    这些工具接受以 KB 为单位指定的条带大小。你将需要指定 CPU 的页面大小的倍数(x86 上为 4KB)。

  9. : 在 RAID 分区上创建 ext2fs 文件系统时,要使用的正确步幅因子是什么?我所说的步幅是指 mke2fs 命令上的 -R 标志
    mke2fs -b 4096 -R stride=nnn  ... 
            
    
    nnn 的值应该是什么?
    : -R stride 标志用于告诉文件系统 RAID 条带的大小。由于只有 RAID-0、4 和 5 使用条带,而 RAID-1(镜像)和 RAID-linear 不使用,因此此标志仅适用于 RAID-0、4、5。了解条带的大小使 mke2fs 可以分配块和 inode 位图,以便它们不会都最终落在同一物理驱动器上。一位不知名的贡献者写道
    我去年春天注意到,一对驱动器中的一个驱动器的 I/O 计数总是更高,并将其追溯到这些元数据块。Ted 添加了 -R stride= 选项,以响应我的解释和解决方法请求。
    对于 4KB 块文件系统,条带大小为 256KB,将使用 -R stride=64

    如果你不信任 -R 标志,你可以用不同的方式获得类似的效果。Steven A. Reisman < sar@pressenter.com> 写道

    另一个考虑因素是在 RAID-0 设备上使用的文件系统。ext2 文件系统每个组分配 8192 个块。每个组都有自己的一组 inode。如果有 2、4 或 8 个驱动器,这些 inode 会聚集在第一个磁盘上。我通过告诉 mke2fs 每个组只分配 7932 个块,将 inode 分布在所有驱动器上。
    某些 mke2fs 页面没有描述此操作中使用的 [-g blocks-per-group] 标志。
  10. : 我可以将 md 命令放在启动脚本中的什么位置,以便在启动时一切都自动启动?
    : Rod Wilkens < rwilkens@border.net> 写道
    我所做的是将 ``mdadd -ar'' 放在 ``/etc/rc.d/rc.sysinit'' 中,就在内核加载模块之后,磁盘检查 ``fsck'' 之前。这样,你就可以将 ``/dev/md?'' 设备放在 ``/etc/fstab'' 中。然后,我将 ``mdstop -a'' 放在 ``/etc/rc.d/init.d/halt'' 文件中,就在 ``umount -a'' 卸载磁盘之后。
    对于 raid-5,你将需要查看 mdadd 的返回代码,如果它失败了,则执行
    ckraid --fix /etc/raid5.conf
                
    
    来修复任何损坏。
  11. : 我想知道是否可以在 md0 中设置超过 2 个设备的条带化?这是用于新闻服务器的,我有 9 个驱动器... 不用说,我需要的远不止两个。这可能吗?
    : 是的。(描述如何做到这一点)
  12. : 软件 RAID 何时优于硬件 RAID?
    : 通常,硬件 RAID 被认为优于软件 RAID,因为硬件控制器通常具有大型缓存,并且可以更好地并行调度操作。但是,集成的软件 RAID 可以(并且确实)从靠近操作系统中获得某些优势。

    例如,...嗯... 缓冲区缓存中重建块的缓存的不透明描述被省略...

    据报道,在双 PPro SMP 系统上,软件 RAID 的性能超过了著名硬件 RAID 板供应商的性能 2 到 5 倍。

    软件 RAID 也是高可用性冗余服务器系统的一个非常有趣的选择。在这种配置中,两台 CPU 连接到一组 SCSI 磁盘。如果一台服务器崩溃或无响应,则另一台服务器可以 mdaddmdrunmount 软件 RAID 阵列,并接管操作。由于硬件 RAID 控制器维护的状态配置,这种双端操作对于许多硬件 RAID 控制器来说并不总是可能的。

  13. : 如果我升级我的 raidtools 版本,它是否会难以操作旧的 raid 阵列?简而言之,升级 raid 实用程序时,我应该重新创建我的 RAID 阵列吗?
    : 不,除非主版本号发生更改。MD 版本 x.y.z 由三个子版本组成
         x:      Major version.
         y:      Minor version.
         z:      Patchlevel version.
                
    
    如果 (x1 == x2) 并且 (y1 >= y2),则 RAID 驱动程序版本 x1.y1.z1 支持版本为 x2.y2.z2 的 RAID 阵列。同一 (x.y) 版本的不同补丁级别 (z) 版本旨在基本兼容。

    每当 RAID 阵列布局以与旧版本驱动程序不兼容的方式更改时,次版本号就会增加。新版本的驱动程序将保持与旧 RAID 阵列的兼容性。

    如果在新内核代码中不再支持旧 RAID 阵列,则主版本号将增加。

    对于 RAID-1,磁盘布局和超级块结构都不太可能在短期内发生变化。几乎所有优化和新功能(重建、多线程工具、热插拔等)都不会影响物理布局。

  14. : 命令 mdstop /dev/md0 说设备正忙。
    : 有一个进程在 /dev/md0 上打开了一个文件,或者 /dev/md0 仍然挂载。终止该进程或 umount /dev/md0
  15. : 有性能工具吗?
    : 在 linux/iotrace 目录中还有一个名为 iotrace 的新实用程序。它读取 /proc/io-trace 并分析/绘制其输出。如果你觉得系统的块 IO 性能太低,只需查看 iotrace 输出。
  16. : 我正在阅读 RAID 源代码,并看到值 SPEED_LIMIT 定义为 1024K/秒。这是什么意思?这会限制性能吗?
    : SPEED_LIMIT 用于限制自动重建期间的 RAID 重建速度。基本上,自动重建允许你在不干净的关机后立即 e2fsckmount,而无需首先运行 ckraid。自动重建也在更换故障硬盘驱动器后使用。

    为了避免在重建发生时使系统不堪重负,重建线程会监视重建速度,并在速度过快时减慢速度。1M/秒的限制是任意选择的合理速率,该速率允许重建在合理的时间内完成,同时仅在系统上创建轻微的负载,以便不干扰其他进程。

  17. : 那么“主轴同步”或“磁盘同步”呢?
    : 主轴同步用于保持多个硬盘驱动器以完全相同的速度旋转,以便它们的磁盘盘片始终完美对齐。一些硬件控制器使用它来更好地组织磁盘写入。但是,对于软件 RAID,不使用此信息,主轴同步甚至可能损害性能。
  18. : 如何使用 raid 0 设置交换空间?在 4 个以上的驱动器上条带化交换区域不是会非常快吗?
    : Leonard N. Zubkoff 回复:它确实非常快,但你不需要使用 MD 来获得条带化交换。内核会自动跨优先级相等的交换空间进行条带化。例如,以下来自 /etc/fstab 的条目跨越三个组中的五个驱动器条带化交换空间
    /dev/sdg1       swap    swap    pri=3
    /dev/sdk1       swap    swap    pri=3
    /dev/sdd1       swap    swap    pri=3
    /dev/sdh1       swap    swap    pri=3
    /dev/sdl1       swap    swap    pri=3
    /dev/sdg2       swap    swap    pri=2
    /dev/sdk2       swap    swap    pri=2
    /dev/sdd2       swap    swap    pri=2
    /dev/sdh2       swap    swap    pri=2
    /dev/sdl2       swap    swap    pri=2
    /dev/sdg3       swap    swap    pri=1
    /dev/sdk3       swap    swap    pri=1
    /dev/sdd3       swap    swap    pri=1
    /dev/sdh3       swap    swap    pri=1
    /dev/sdl3       swap    swap    pri=1
    
  19. : 我想最大化性能。我应该使用多个控制器吗?
    : 在许多情况下,答案是肯定的。使用多个控制器并行执行磁盘访问将提高性能。但是,实际的改进取决于你的实际配置。例如,据报道(Vaughan Pratt,98 年 1 月),连接到 Adaptec 2940UW 的单个 4.3GB Cheetah 可以达到 14MB/秒的速率(不使用 RAID)。在一个控制器上安装两个磁盘,并使用 RAID-0 配置,测得的性能为 27 MB/秒。

    请注意,2940UW 控制器是一个“超宽” SCSI 控制器,理论突发速率为 40MB/秒,因此上述测量结果并不令人惊讶。但是,连接到两个快速磁盘的较慢控制器将成为瓶颈。另请注意,大多数外部 SCSI 机箱(例如带有热插拔托架的那种)由于布线和电气噪声问题,无法以 40MB/秒的速率运行。

    如果你正在设计多控制器系统,请记住,大多数磁盘和控制器通常以其额定最大速度的 70-85% 运行。

    另请注意,每个磁盘使用一个控制器可以降低由于控制器或电缆故障导致系统中断的可能性(理论上 -- 仅当控制器的设备驱动程序可以优雅地处理损坏的控制器时。并非所有 SCSI 设备驱动程序似乎都能够在不崩溃或以其他方式锁定的情况下处理这种情况)。


下一页 上一页 目录