我有一个多线程的自定义应用程序;每个线程都在自己的逻辑核心上运行(工作站是双至强,有 12 个物理核心和 24 个逻辑核心)。因此有 24 个线程同时运行。
在过去的两天里,我一直在研究多种存储选项,我的脑袋以大约 15k rpm 的速度旋转。
该应用程序有两种模式,它们是互斥的:读取数据或写入数据;我的意思是它们不会交错地进行读取/写入。每个线程只会进行长时间的连续读取或写入。我需要的总存储空间非常大:超过 50 TB(如果您在 2016 年阅读本文,那么现在您可能正在为“巨大”一词而大笑。)
每个线程将读取或写入大约 0.8TB 的文件
我将使用 jbod,因为如果驱动器出现故障,我只需更换它,应用程序将在大约 10 分钟内重新创建数据。
我将把驱动器放入外部塔式机箱或机架中,使用 SATA 或 SAS 控制器(尚未确定它们的 +/-)。
所以,我的问题是:我是否正确地假设,对于这个特定的应用程序,使用 1TB 的驱动器在性能方面会比使用 2、3 或 4 倍大小的驱动器更好?看来,除非 3TB 驱动器的连续读/写吞吐量是 1TB 驱动器的 3 倍,否则较小的驱动器才是最佳选择。
显然,使用 3 TB 的驱动器可以将我需要担心的驱动器数量减少 1/3,但只有当我能够实现与 1 TB 驱动器相同的性能时才会考虑这一点。
答案1
最重要的是,为了获得最佳性能,您需要 24 个驱动器(或更多,请耐心等待),因为您有 24 个线程。如果磁盘数少于线程数,则不是具有顺序操作。考虑到单个磁盘上的两个线程,它将有一些寻道;每次寻道大约需要 10 毫秒,因此损失了大约 1 MB 的传输机会。每秒只有 10 次寻道,因此速度为 90 MB/s(2 x 45),而不是 1 x 100 MB/s。
我认为最好使用 48 个驱动器,每个驱动器 1 TB。驱动器将配对,以获得 24 个剥离(又称 RAID0)组。您可以假设在操作系统级别进行的剥离将产生不可察觉的影响,因此实际上每个线程获得的吞吐量是 1 TB 驱动器的两倍。
从性能角度来说,我认为 3 TB 硬盘没有任何优势。
但最大的性能优势可能完全不同。只需确保应用程序有效地传输数据 - 确保它真的满足队列需求在硬盘上使用这些 I/O 命令。如果以一种笨拙的方式编写,等待某个 I/O 完成之后再排队另一个 I/O,那么吞吐量就会严重下降。
- 最好在应用程序本身中修复它或者......
- 为了部分缓解这种情况,您需要投入大量资金购买具有大量额外缓存的磁盘阵列。
附言:很喜欢你对 2016 年的评论,大家好!你已经拿到悬浮滑板了吗?
答案2
考虑到操作是连续的且争用最少,SATA 和 SAS 之间的写入性能可能不会有太大差异。
读取性能则是另一回事。我认为您不会找到很多经济型 SATA 15k 驱动器。SAS 驱动器往往是高端驱动器,转速较高,SAS 阵列控制器通常优于 SATA,但如果您使用的是经济型非 RAID hba,则可能没有太大区别。
值得一提的是,使用标准非阵列控制器上的单个 2TB SATA 驱动器,您应该能够实现至少 100 MB/秒的写入性能。使用 6 Gbps SATA 时,写入性能可能会更高。为了进行比较,我有一个带有 4x2TB(6 Gbps)SATA 驱动器的 RAID0,其连续写入性能为 500 MB/秒。
答案3
那么你的答案不应该基于容量驱动器的容量,而是盘片的数量和密度。7200 RPM 驱动器连续读取由 3 个 500 GB 盘片组成的 1.5 TB 驱动器中的 100 GB 数据的速度将比读取由两个 750 GB 盘片组成的 1.5 TB 驱动器中的 100 GB 数据的速度慢,因为后者的数据密度更高。
您实际上需要做的是找到所有相关驱动器的基准。
我大胆猜测,在 18 个 3 TB 硬盘存储 50 TB 数据与 50 个 1 TB 硬盘存储 50 TB 数据的情况下,3 TB 硬盘的速度会更快一次读取或写入一个文件时...但同样,这一切都取决于各个磁盘的性能。
答案4
我认为至少在这里尝试 RAID 是值得的。虽然会有一些开销,而且 RAID 重建(如果发生)可能最终会成为一场闹剧,但也有一些可能的好处。
- 显而易见的是,管理更加简单
- 单磁盘性能将在整个驱动器上持续达到 50-70MB/秒左右的峰值。外边缘(例如磁盘的开始)会更快,内边缘会更慢(在我的测试中,通常是外边缘速率的一半)如果您正在写入单个磁盘,您将始终达到此限制。如果您正在写入磁盘集合(无论如何管理),您仍然会达到此限制(4 磁盘 RAID0 的持续性能仅仅是单个磁盘内边缘性能的 4 倍),但您的总吞吐量会更高。
- RAID 组会增加争用(如果您进行多次写入/读取)。它们还会增加可用带宽。这对您可能重要也可能不重要,但值得一试
- 听起来您的写入基本上就是将批量数据传输到磁盘。如果是这样的话,RAID5 的开销相当低,因为如果您将完整的 RAID 条带宽度数据块写入磁盘,则无需执行读取/奇偶校验重新计算/写入循环 - 您的控制器只需一次性写入新的条带和奇偶校验即可。(奇偶校验很便宜,但读/写循环很麻烦)
从每个线程写出 800GB 的数据大约需要 2-3 小时。假设您的磁盘在外边缘维持约 120MB/秒,在内边缘维持约 60MB/秒。在 120MB/秒时,您的 800GB 数据将需要大约 111 分钟,在 60MB/秒时则需要两倍。写入性能下降不是线性的,但可以合理地猜测您将花费 2 到 3 小时写出该 800GB 文件。@kubanczyk 的建议可能会将时间减半,但不要害怕进行更大的聚合(无论是 RAID0、RAID5 还是 RAID5+0)
我对此没有很好的感觉(我自己还没有抽出时间进行测试),但人们普遍认为 SAS 驱动器的性能更好,即使转速相同(例如,Seagate Constellation ES.2 SATA 与 Seagate Constellation ES.2 SAS)。一些好处包括 SAS 驱动器的全双工操作和更长的队列深度。全双工与半双工点应该意味着并发读/写操作的整体影响较小。例如,您仍会遇到驱动器寻道,但您不会在等待读取时拖延磁盘写入。
我构建了许多带有 16 个磁盘阵列的系统。两个 RAID5 组(硬件 RAID 控制器),顶部是 Linux 软件 RAID。我们在这里获得了相当不错的性能:整个阵列的持续速度介于 750 到 850MB/秒之间,具体取决于所使用的磁盘型号。加入多个写入器确实会增加争用,并且会降低整体吞吐量,但根据您写出数据的频率与读回数据的频率,类似这样的方法可能会有所帮助。
希望我没有把事情搞得太复杂:)