我经常看到一些文章将 RAID 1(和 RAID 10)的 RAID IOPS 写入惩罚描述为 2。当然,RAID 0 的惩罚为 1,因为每次写入都只是写入磁盘。RAID 1 被描述为“需要两次写入”,因此惩罚为 2。
但是,由于数据是同时写入的,它不应该是 1 吗?
从使用磁盘的应用程序或服务器的角度来看,RAID 1 阵列应显示为一个单元,可同时写入两个磁盘。一个磁盘可能落后于另一个磁盘,但实际的硬件 RAID 控制器应能够同时开始写入,并在较慢的磁盘完成时报告写入操作完成,这应该只比 RAID-0 略高(如果有的话)。因此,IOPS 损失对于 RAID 1 应为 1,最多为 1.2。
我知道有两次写入操作,所以有 2 个“IOPS”,但它们位于 RAID 控制器内部。
我这里遗漏了什么吗?
答案1
如果 RAID 1 只是热接线电缆,则性能影响将为零(系数为 1.0),但 RAID 1 镜像不仅仅是热接线电缆 -实际工作需要将数据写入两个驱动器并处理每个驱动器的写入结果。
他们谈论的就是这些额外的工作对性能的影响。无论 I/O 操作发生在操作系统的某个地方(软件 RAID)还是专用的协处理器/控制器(硬件 RAID),每条数据仍然需要发出两次写入,并且需要“处理”写入的结果(成功、失败或 on_fire)。
在最坏的情况下,您可能会遇到(操作系统中实现的软件 RAID-1),这意味着内核正在执行两次写入,并与磁盘控制器进行两次对话。
这是 2 倍的写入损失,因为我们几乎在整个堆栈中都做了两倍的工作。
(实际上它可能更接近 1.9 - 毕竟我们没有向文件系统发出两次 write() 调用 - 但为了悲观起见,我们还是四舍五入吧。)
在最佳情况下(硬件 RAID 1,使用专用控制器实现),内核与控制器进行一次对话,但控制器仍进行两次对话(与每个磁盘一次),因为它需要确保两个驱动器都收到命令、写出数据并确认数据已写入(或处理驱动器报告的任何错误情况)。
正如您在问题中推测的那样,这可能是控制器额外工作的 1.2 倍惩罚 - 您只是为自己节省了额外的内核工作(这比控制器正在做的事情要昂贵得多)。
现在,因为我们是系统管理员,我们的工资就是这么悲观,所以我们显然会选择最坏的情况,就像我们四舍五入软件 RAID 的性能因素一样 - 所以如果有人问起,我们会告诉他们,即使对于他们花哨的硬件控制器,也会有 2 倍的写入损失,当系统平均只有 1.5 倍的损失时,他们会很高兴 :-)
答案2
实际的硬件 RAID 控制器应该能够同时开始写入,并在较慢的磁盘完成时报告写入操作完成,这应该仅比 RAID-0 略高(如果有的话)。
不过,每次写入只能达到总性能的一半。在您的示例中,RAID 0 的每个磁盘只需写入发送到 RAID 控制器的一半内容。在 RAID 1 中,每个磁盘必须写入全部内容。
这使得 RAID 0 的写入速度大约是 RAID 1 的两倍(在 2 磁盘 RAID 组上),而它们的理论读取速度相同。