关于存储-那些你不得不知道的知识点
这篇文章能够帮助你快速了解有关存储的性能。
I/O
I:Input
O: Output
单个I/O就是单个读/写请求。 该I/O请求被发送到存储介质中(如机械硬盘驱动或固态硬盘驱动)。
请求可以是从磁盘读取一个特定文件, 也可以是将一些数据写入现有文件的请求。 读取或写入文件可能会导致多个I/O请求。
I/O请求的大小
I/O请求具有大小。 该请求可以很小(例如1KB),也可以很大(几兆字节)。 不同的应用程序工作负载将发出具有不同请求大小的I/O操作。 I/O请求大小可能会影响延迟和IOPS数据。
延迟
延迟是完成I/O请求所花的时间, 从发出请求到存储层的那一刻开始测量,并在获取请求的数据或确认数据已存储在磁盘上时停止测量。
在大多数情况下,延迟是关注存储性能时最重要的单一指标。
对于硬盘驱动器,在10到20毫秒之间的平均等待时间被认为是可以接受的(20毫秒是上限)。
对于固态驱动器,根据工作负载,它永远不应超过1-3毫秒。 在大多数情况下,工作负载的等待时间少于1ms。
IOPS
IOPS: I/O Operations Per Second
IOPS代表每秒I/O操作数,这是一种性能指标,在存储世界中广泛使用(就像讨论美女体重一样)。 它告诉我们存储器(对于特定的工作负载)每秒可以处理多少个I/O请求。
需要注意的是,没有相应的延迟,该指标毫无意义。
IOPS 和 延迟
这是一个非常重要的概念。 如果没有有关延迟的说明,则IOPS指标毫无意义。 必须了解每个I/O操作将花费多长时间,因为延迟决定了各个I/O操作的响应能力。
如果一个存储解决方案可以达到10,000 IOPS,但平均等待时间为50毫秒,则可能导致非常差的应用程序性能。 如果我们想达到10 毫秒的较高延迟目标,则存储解决方案可能仅能达到2,000 IOPS。
带宽 / 吞吐量
如果将IOPS 数值乘以(平均)I/O请求大小,则会获得带宽或吞吐量。 我们以 KB/s 和 GB/s 为单位声明存储带宽。
举个例子:如果我们发出1000 IOPS的工作量,请求大小为4 KB,那么我们将获得1000 x 4 KB = 4000 KB的吞吐量, 这大约是每秒4 MB。
队列深度
队列深度是一个介于1到〜128之间的数字,它表示平均有多少I/O请求(在运行中)排队。 拥有队列是有益的,因为队列中的请求可以以优化的方式(通常是并行方式)提交给存储子系统。 队列以延迟为代价提高了性能。
如果有某种存储性能监视解决方案,那么队列深度过长可能表明存储子系统无法处理工作负载。 可能还会观察到高于正常延迟的数字。 只要等待时间数仍在容许的范围内,就不会有问题。
这个世界上没有免费的东西, 较高的队列深度(充当缓冲区)确实会增加延迟,只能去追求一种权衡。
访问模式
顺序访问
顺序数据传输的一个示例是将一个大文件从一个硬盘复制到另一个硬盘。 从源驱动器读取大量顺序的(通常是相邻的)数据块并将其写入另一个驱动器。 备份作业还会导致顺序访问模式。
实际上,此访问模式显示了最高的吞吐量。
硬盘驱动器很容易,因为它们不必花费很多时间来移动读/写磁头,而可以花费大多数时间来读/写实际数据。
随机访问
I/O请求以看似随机的方式发布到存储介质, 数据可以存储在存储介质上的各个区域中。 这种访问模式的一个示例是使用大量数据库的服务器或运行许多虚拟机(全部同时运行)的虚拟化主机。
硬盘驱动器将不得不花费大量时间移动其读/写磁头,而仅花费很少的时间来传输数据。 吞吐量和IOPS都会下降(与顺序访问模式相比)。
实际上,大多数常见的工作负载(例如正在运行的数据库或虚拟机)会导致存储系统上出现随机访问模式。
存储介质性能特征
HDD
硬盘(HDD)是机械设备, 有一个带读/写头的手臂,数据存储在(多个)盘片上。
硬盘必须物理地移动读/写磁头才能满足读/写请求。 与固态硬盘(SSD)相比,这种机械特性使它们相对较慢。尤其是随机访问工作负载会导致硬盘花费大量时间在正确的时间将读/写磁头移动到正确的位置,因此用于实际数据传输的时间更少。
了解硬盘最重要的一点是,从性能角度(着眼于延迟)来看,更高的主轴速度会降低平均延迟。
转速RPM | 延迟(ms) | IOPS | |
---|---|---|---|
5400 | 17-18 | 50-60 | |
7200 | 12-13 | 7-8 | 75-85 |
10,000 | 7-8 | 120-130 | |
15,000 | 5-6 | 150-180 |
由于单个I/O请求的等待时间会降低具有较高RPM的驱动器,因此可以在相同的时间内发出更多此类请求。 这就是IOPS值也增加的原因。
关于顺序吞吐量,我们可以说相当老的硬盘驱动器可以维持每秒100-150 MB的吞吐量。
具有更高容量的更现代的硬盘驱动器通常可以维持每秒200-270 MB的吞吐量。
小提示:顺序传输速度不是恒定的,并且取决于硬盘驱动器盘片上数据的物理位置。 随着驱动器装满,吞吐量会下降。 吞吐量可能下降百分之五十以上。因此,如果要计算传输特定(大型)数据集所需的时间,则需要考虑到这一点。
SSD
固态驱动器(SSD)基于闪存(芯片),没有移动部件。 SSD可以更快地处理I/O,从而显着降低延迟。
通常,以毫秒(千分之一秒)为单位来衡量HDD的平均I/O延迟,而以微秒(百万分之一秒)为单位来衡量SSD I / O操作的延迟。
由于减少了每个I/O请求的等待时间,因此SSD在各种可能的方式上均胜过HDD。 即使是廉价的消费类SSD,也能以0.15毫秒(150纳秒)的延迟至少维持约5000+d的 IOPS。 该延迟比企业15K RPM硬盘的最佳延迟大约高达40倍。
固态硬盘通常可以并行处理I/O请求, 这意味着,在运行中有更多I/O请求的较大队列深度可以显示出更高的IOPS,而延迟的增加有限(但并非微不足道)。
在所有相关指标上,SSD的性能均优于HDD,但价格与容量相关。
小提示:SSD不适用于数据的归档存储。 数据作为电荷存储在芯片中,这些电荷会随着时间的流逝而减少。 尽管最合适的存储方法可能是磁带,但是即使硬盘驱动器也更适合脱机归档。
SSD实际性能与广告性能
宣传许多SSD的性能为80,000-100,000 IOPS,且延迟相当大。 根据工作负载,可能只会观察到部分性能。
那些高80K-100K IOPS的大多数数据是通过对非常高的队列深度(16-32)进行基准测试而获得的。 SSD可以从这种队列深度中受益,因为它可以并行处理许多这些I/O请求。
请注意:如果工作量不适合该模式,则可能会发现性能降低。如果我们看一下上面的Intel SSD图表,我们可能会注意到随着队列深度的增加,了解您自己的工作负载的特征很重要。
RAID
如果将多个硬盘驱动器组合在一起,则可以创建RAID阵列。 RAID阵列是一种虚拟存储设备,其容量和性能超过单个硬盘驱动器。 这样可以在单个计算机的范围内扩展存储。
RAID还用于(或主要用于)通过确保冗余(驱动器故障不会导致数据丢失)来确保可用性。 但这里,我们重点关注其性能特征。
SSD可以实现高的连续吞吐速度,每秒可达到数GB。 单个硬盘驱永远无法达到这些速度,但是如果将许多硬盘组合在一起形成RAID阵列,则速度可能会非常接近。
RAID还提高了随机访问模式的性能。 RAID阵列中的硬盘可以协同工作以服务那些I/O请求,因此RAID阵列的IOPS明显高于单个驱动器, 更多的驱动器意味着更多的IOPS。
将SSD放入RAID是有意义的。 尽管它们比硬盘驱动器更可靠,但它们可能会失败。 如果关心可用性,RAID是不可避免的。 此外,与硬盘驱动器相同的好处:将资源集中在一起,与单个SSD相比,可以实现更高的IOPS数值和更大的容量。