IO500简介
IO500 简介
高性能计算领域,基础架构设施由超级计算机及高性能存储及网络组成:
- 在每年的国际超算大会(ISC)上,公布超级计算机的性能排名,即近日大家热议的 Top500 榜单
- 同样地,在 ISC 大会上还会公布 IO500 榜单,IO500 是针对存储系统性能的排名表
这两个榜单,标志着相关研究机构及企业,在高性能计算和存储领域的技术实力和产品水平。
与计算体系结构的 Top500 列表类似,IO500 提供评价存储系统性能的关键指标。
IO500 基准测试
IO500 基准测试于 2017 年建立,旨在对 TOP500 基准进行补充,但重点关注存储子系统的性能。
高性能存储系统的基准性能测试是一项复杂的任务,并行 I/O 不仅受 CPU 延迟性能和网络的影响,还受底层存储技术和软件的影响。不同厂商发布的性能测试结果,往往由于测试方法、工具、参数甚至测试步骤的先后顺序不同,而具有较大的差异性。IO500 定义了一个全面的基准性能测试套件,可以对高性能存储系统进行标准的测试和比较,旨在为用户提供一个标准的评价依据。
官方:
- 网站:https://io500.org/
- GitHub 仓库:https://github.com/IO500/io500
- 测试提交:https://github.com/IO500/submission-data
VI4IO
机构目标:
- 为存储系统研究者和爱好者提供一个交流平台
- 促进高性能计算存储领域的国际合作、交流和培训
- 通过榜单的形式来追踪和鼓励高性能存储系统的研发
IO-500 基准测试由该组织负责发起和运营的
官方:
- GitHub 仓库:https://github.com/VI4IO
测试目标
IO500 的测试基准,从设计之初,就设立了以下目标:
- 代表性
IO500 的测试基准应该代表在真实系统上观察到的典型工作负载。这包括可调优和优化的工作负载,也包括交互的、原始的及不可优化的工作负载。
IO500 利用 IOR、MDTEST 和标准 POSIX 来对可优化的顺序 IO、随机 IO 以及元数据操作等类型的工作负载进行性能评估。
- 易理解
IO500 将生成有意义的度量和评价体系。测试指标对数据中心用户来说是有意义的。尽量将测试偏差降低(即减少测试步骤差异带来的影响),尽可能使重复测试可获得相近的结果。
对于每个单独的性能运行,IO500 使用以 GiB/s
和 kIOPS
为单位进行统计。
除了综合得分之外,还保留了个别值,以方便进行更细致的评估。
- 可扩展性
可以在任意规模的大型计算机及存储系统上运行,并根据使用的客户端/服务器端节点数量和每个节点的进程来评估测试结果。
- 可移植
基准测试应该涵盖各种存储技术和非 POSIX API。提供不同版本的软件包和工具,减少用户在不同平台上进行测试的时间投入,使测试尽可能流畅地进行。
- 权威性
IO500 旨在提供可信赖的基准性能测试结果,并且防止(无意中)作弊。向 IO500 提交的报告中,要求披露结果提供者所做的性能优化参数。这些参数将作为结果的一部分与业界进行分享,让其他人通过调整有用的选项来进一步理解测试。
测试内容
从测试方法上,IO500 进行两组测试,分别完成以下场景的测试:
- 理想状况下,存储系统的最优性能(例如大文件读写),这组测试可以充分发挥存储厂商在性能调优上的主动性
- IO500 专门设置了一组苛刻的测试流程(如随机读写 3901 Byte 数据),以及海量小文件的读写,以此来评估存储系统在极端场景下的性能底线
最优性能
理想状况下,存储系统的最优性能(例如大文件读写),这组测试可以充分发挥存储厂商在性能调优上的主动性
测试包括:
- IO Easy(write/read):测试最高效的 I/O 访问模式,用户需要声明所使用的参数,数据采取每个进程保存一个文件的方式
- MDTest Easy(create/stat/delete):创建 / 访问具有 N 个空文件的多个目录
极端场景下的性能底线
IO500 专门设置了一组苛刻的测试流程(如随机读写 3901 Byte 数据),以及海量小文件的读写,以此来评估存储系统在极端场景下的性能底线
测试包括:
- IO Hard(write/read):进程访问同一个共享文件,进行 47008 字节的随机访问
- MDTest Hard(create/stat/read/delete):在同一个共享目录中,创建 / 访问大小为 3901 字节的文件
- Find 索引:在创建的所有文件中查找大小为 3901 字节的文件
最终,通过 IOPS 和带宽的测试数据,计算出整个存储系统的性能评分
测试工具
IO500 是由 Virtual Institute for I/O 管理的存储基准。
它测量不同场景下基于集群的文件系统的带宽和 IOPS 数据,并将最终分数作为在所有测试阶段获得的性能指标的几何平均值得出。在每个阶段,执行 ior
工具(用于带宽测试)或 mdtest
工具(用于测试各种元数据操作的性能)的多个副本,并将结果合并。还有一个基于并行 "查找" 类程序的阶段。作为实现细节,MPI 用于编排。
执行阶段的顺序以这样一种方式组织,即基于 ior 和基于 mdtest 的阶段大多相互交错。
带宽测试阶段
带宽测试是使用 ior
工具完成的。
有两个难度级别(简单和困难),对于每个级别,带宽都是针对写入和单独的读取来测量的。基准测试结束时报告的带宽数字是所有四个测试的几何平均值。
默认情况下,两个难度级别的写入时间为 5 分钟,使用 POSIX 原语进行文件系统访问。
- IO Easy Write
在简单模式下,每个 ior 进程使用一个文件,写入按顺序完成,传输大小为 256 KiB
- IO Hard Write
在困难模式下,所有进程写入同一文件的交错部分,使用奇怪的 47008 字节传输大小和跳跃线性访问(lseek()
对其他进程要写入的字节,写入 47008 字节,重复循环)
在这两种情况下,每个进程最后只执行一次 fsync()
调用,即,基本上以无限的队列深度工作。
- IO Easy / Hard Read
对于 Read,简单测试和困难测试都使用与之前编写的相同的文件,以相同的方式访问它们,并验证文件中的数据是否与预期的签名匹配。
IOPS 测试阶段
几乎所有的 IOPS 测试都是使用 mdtest
工具完成的。与 ior 不同的是,mdtest 会创建大量文件并强调元数据操作。
就像带宽测试一样,测试运行有两个难度级别:简单和困难。
对于每个难度,每个进程在创建阶段创建大量测试文件(最多一百万),然后在测试的统计阶段检查所有文件,然后在删除阶段删除. 在每个阶段结束时,都会执行同步命令,并考虑其运行时间。
简单和困难的区别在于以下几个方面:
- 简单测试中每个文件为空,在创建阶段写入 3901 字节,稍后在 Hard 测试中读回
- 在简单的情况下,每个进程都有一个唯一的工作目录,而在困难的情况下使用一个共享目录
测试结果
测试分数
本质上来说采取了几何平均数的方式,结果对于个别极高 / 极低的指标并不敏感,更加均衡的系统可以获得更好的成绩。
$$ \text { Score }{\text {meta }}=\sqrt[8]{\left(\prod}^{8} IOPS_{i}\right)
\ \
\operatorname{Score}{b w}=\sqrt[4]{\left(\prod}^{4} BW_{i}\right)
\ \
\text { Score }=\sqrt{\text { Score }{\text {meta }} * \text { Score } $$}
最近的 IO500 测试需要同时运行一个脚本和一个 C 版本的测试程序用以交叉验证,未来的测试有望以 C 程序版本为准。
榜单
- Full List:包括一届测试中的所有结果,系统规模任意
- Hisoric List:包含历次排名中的所有结果
- 10-node List:存储服务器节点数量不作要求,但客户端数量不超过 10 个物理节点。虽然 IO500 测试的目标是从无限数量的客户机和服务器获得最大性能,但是十节点挑战将客户机限制在 10 个。这一挑战的重点是从较小的一组系统中获得最佳的存储吞吐量和元数据性能。
> git tag -l |grep 21 Alias tip: Gt -l |grep 21 io500-isc21 io500-isc21_v1 io500-isc21_v2 io500-sc21 io500-sc21-scc io500-sc21-scc_v1 io500-scc21
自 2017 年 11 月开始,每年在美国的 SC 和德国的 ISC 大会上各公布一次 IO500 榜单
超级计算集群(Super Computing Cluster,SCC)