共计 3191 个字符,预计需要花费 8 分钟才能阅读完成。
导读 | IOPS(Input/Output Operations Per Second) 故名思意就是数据存储系统每秒能完成的 I / O 读写次数,即单位时间内系统能处理的 I / O 请求数量,是一个用于计算机数据存储性能测试的量测指标。 |
IOPS(Input/Output Operations Per Second) 故名思意就是数据存储系统每秒能完成的 I / O 读写次数,即单位时间内系统能处理的 I / O 请求数量,是一个用于计算机数据存储性能测试的量测指标。这个存储系统可以是单块硬盘或者单台设备也可以是包含多台设备的一套存储网络系统,比如 SAN 或者分布式多节点系统等。
其实我一直想写一篇关于如何准确评估 IOPS 性能的文章,但是仔细一想我觉得要把存储系统的 IOPS 评估的非常准确,真的属实不容易,为什么呢? 因为 IOPS 性能和许多因素相关,比如以下几个,我觉得都是比较值得一提的,每一个都会对 IOPS 性能产生影响 (这里是针对单台或一套存储设备或存储网络):
(1) 硬盘数量即一套存储系统能同时管理和运行的硬盘数量是多少块,一般情况下,硬盘数量越多,整体 IOPS 性能会越好,可以简单的理解为堆叠;
(2) 硬盘的类型,具体包括硬盘的接口类型,机械硬盘还是 SSD 硬盘等。机械硬盘的转速、容量 (存储密度)、磁头寻道时间、旋转延迟,数据传输时间这些都和系统的 IOPS 性能相关联的。而固态硬盘 SSD 是一种电子装置,避免了传统 HDD 磁盘在寻道和旋转上的时间花费,存储单元寻址开销大大降低,因此 IOPS 可明显提高。
对一套存储系统来说,应用服务器和存储设备之间的网络带宽和网络接口速度以及多节点情况下各存储节点之间所使用的网络的速度也都是影响 IOPS 性能的重要因素。
根据实际的应用情况可将 IOPS 细分为如下几种情形:
(1) 读写混合以及随机 I / O 负载情况下的 IOPS,这个与实际 I / O 情况最为相符,大多数应用是要关注此指标;
(2)100% 随机读负载情况下的 IOPS(Random Read IOPS);
(3)100% 随机写负载情况下的 IOPS(Random Write IOPS);
(4)100% 顺序读负载情况下的 IOPS(Sequential Read IOPS);
(5)100% 顺序写负载情况下的 IOPS(Sequential Write IOPS)。
以上每种不同的情况下的 IOPS 差别是很大的,比如一般顺序的读写肯定比随机读写的 IOPS 值要高的,顺序的寻址时间比随机的快,示意图:
此外传统的机械硬盘读取和写入时间差不多,而大部分闪存 SSD 的写入速度比读要慢很多,原因是无法写入一个之前写过的区域,会强制引导垃圾数据回收功能,但总体 SSD 性能肯定要好于 HDD。
Cache 命中率对实际 IOPS 有决定性的影响,Cache 命中率取决于数据的分布,Cache SIZE 的大小和数据访问的规则以及 Cache 的算法,我们这里把这些内部原理都省略掉,只强调:对于一个存储系统来说,读 Cache 的命中率越高,一般就表示它可以支持更多的 IOPS。那么什么叫命中率呢? 终端用户访问加速缓存时,如果缓存驻了要被访问的数据时就叫做命中,如果没有的话需要回到原设备提取,就是没有命中。命中率 = 命中数 /(命中数 + 没有命中数), 缓存命中率也是判断加速效果好坏的重要因素之一。
这里包含传统的 RAID 以及分布式文件系统等,对于顺序读写而且写性能要求高,有冗余要求的应用,选择 RAID1 或 RAID10。顺序写要求高的数据, 应单独在一个 RAID 组中,避免来回寻址,典型的有 Oracle 的 redo log, Exchange 的 Transaction log 等日志型的数据。对于有额外备份措施的数据, 没有冗余的要求, 读写性能要求高的用 RAID0,比如实时数据采集。对于读要求高于写要求,随机写要求不高,容量上有考虑的,选择 RAID5。对于分布式软件定义存储系统,小文件类和随机读写频繁的选择副本机制,其他的可选择纠删码模式。
主要指的是端口队列中等待服务的 I / O 请求数量。如果 I / O 请求的数量超过了最大队列深度,则该事务将在一段时间无法重新尝试。使用 SAS 和 SATA,排队的 I / O 请求有一定的局限,但 NVMe 在大大增加队列深度方面是一个重要的进步,NVMe 可以提供海量的队列深度。其实加大硬盘队列深度就是让硬盘不断工作,减少硬盘的空闲时间。
线程数和 IOPS 的关系不言而喻,一个应用同时工作的线程越多那么自然需要更多的 I / O 并发,所以自然就需要更高的 IOPS 来支撑,反之亦然。
对于测试工具来讲,一个请求从主机下发到存储,存储完成后返回到主机,这才算是这个 I / O 的一个完整周期。存储设备制造商提出的 IOPS 性能不保证就是实际应用下的性能,因为实际的情况多种多样。但 IOPS 可以通过测试程序来模拟一些不同的业务情形,建立测试模型,然后按照测试模型来实际运行,以便找到最佳的存储配置。
每种类型的硬盘都有在特定环境下的 IOPS 参考值或者叫理论值,个人认为如今的硬盘接口以及网络的带宽已经不是瓶颈,因为技术的发展让这些指标已经很快了。如果预估 IOPS,最主要是读写比例和 RAID 模式的写惩罚,要有一个固定参考值,才能估算出较为接近的数值。
硬盘的 IOPS 参考值以及总的可用 IOPS 的计算公式,比如:
单硬盘 IOPS = 1000ms / ((磁盘旋转延迟时间 (ms) + 磁头寻道时间 (ms))
系统总的 IOPS= 硬盘数量 × 单磁盘 IOPS
系统总的可用 IOPS=(系统总的 IOPS×写百分比÷RAID 写惩罚)+(系统总的 IOPS×读百分比)
RAID5 写惩罚为 4,RAID6 写惩罚为 6,RAID10 写惩罚为 2,RAID1 写惩罚为 2,RAID0 写惩罚为 1,分布式多节点的以此类推。
我个人觉得如果不是那种每秒钟都有几十次以上的在线交易系统,绝大部分的业务系统的 IOPS 需求都是比较容易满足的。如果能估算出应用总的 IOPS 的需求,那么就可以计算出需要多少块硬盘了。
吞吐量指的是单位时间内存储系统可以成功传输的数据数量。如果前面估算出了系统的 IOPS 了,吞吐量也就迎刃而解了。吞吐量估算公式为:
每秒 I / O 吞吐量 = IOPS × 平均 I/O SIZE
从公式可以看出:I/O SIZE 越大以及 IOPS 越高,那么每秒 I /O 的吞吐量就越高。对于一个存储系统来讲,这两个指标均有其最大值,而且这两个指标也是相辅相成的。
对于数据块很小并且随机读写频繁的应用,IOPS 是关键衡量指标,比如 OLTP(Online Transaction Processing) 在线交易处理。而对于大数据块并且是顺序读写的应用,如 VOD(Video On Demand) 视频类需求,这种应用则更加关注吞吐量指标 (Throughput),这时候 IOPS 指标就不是那么的重要了。
这里可以举例子:
比如:读取 10000 个 1KB 文件,用时 10 秒,虽然 Throught(吞吐量)=1MB/s,但是 IOPS=1000,对于追求 IOPS 的应用就有意义;
再比如:读取 1 个 10MB 文件,用时 0.2 秒,IOPS 只等于 5,但是 Throught(吞吐量)=50MB/s,对于追求吞吐量的应用就有意义。
所以并不是每个应用都要追求高的 IOPS 的,也就是不是每套存储系统的性能都是以 IOPS 作为唯一的衡量指标,要根据应用的数据块大小以及应用的特性来综合判断哪个指标是最需要关注的!
![post-qrcode](https://www.xgss.net/wp-content/uploads/2023/07/二维码-微信公众号256x256.jpg)