我在市场上为我们的服务器进行存储升级。我正在查看各种 PCIe SSD 设备的基准测试,在比较中我发现 IOPS 在不同队列深度下发生变化。怎么会这样,为什么会这样?我理解的方式是:我有一个最大(理论)100k IOPS 的设备。如果我的工作负载持续产生 100,001 IOPS,我的队列深度将是 1,对吗?然而,从我在基准测试中看到的情况来看,一些设备在较低的队列深度下运行速度较慢,然后在 4-64 的深度处加速,然后在更大的深度处再次减速。队列深度不是操作系统(或者可能是存储控制器)的属性,那为什么会影响 IOPS?
简短的回答是,如果有多个 IO 请求未完成,硬盘驱动器会优化数据检索,这通常会以延迟为代价增加吞吐量。
NCQ 执行此操作,重新排序 IO 请求以优化吞吐量。
SSD:s 与机械驱动器的工作方式不同,因为它们具有并行闪存芯片来存储数据。也就是说,如果您一次发出一个 IO 请求,延迟(搜索 + 读取时间)决定 IOPS。但是,如果您一次发出 4 个请求,ssd 磁盘可能能够以并行方式或其他优化方式检索它们,您可能会获得 4 倍的吞吐量。
队列深度越高,优化磁盘的可能性就越大。由于 IOPS 是吞吐量的函数,因此这会增加队列深度较高时的 IOPS。
编辑:
真正的队列驻留在发出所有请求的操作系统中。也就是说,我推测控制器驱动程序将一定数量的队列传递给控制器和磁盘,以便它们可以在优化的队列深度下工作。磁盘必须有自己的队列才能优化。
老问题,但由于它被看到的次数,值得更多信息。这个答案是基于 SSD,因为这是原来的问题。
队列深度和基于队列深度的 IOPS 变化。考虑队列深度为 1。在这种情况下,给出的规范不是基于驱动器落后于系统生成的请求数,而是意味着系统向 SSD 生成 1 个请求。一个请求是有事务时间的,所以如果一次只发送1个请求,SSD只能处理1个请求。这应该是有道理的。由于事务时间,一次发送 1 个请求比一次发送 32 个请求慢,这就是像 QD32 这样的规范的意思。
此外,正如另一条评论所指出的,您可以在 PCIe 而不是 SATA 上与 SSD 并行读取/写入。
以三星 970 Pro 为例,QD1 = 55,000,QD32 = 500,000 IOPS。这基本上是因为您发送一个请求,而不是一次发送 32 个请求。交易时间减少了,所以你主要处理数据传输。所以,减去大量的事务处理,增加了数据传输的实际功能。
因此,为磁盘提供的规范与队列深度的定义并不完全相同。系统的队列深度基本上是尚未处理的请求数。该规范基于系统一次发送给驱动器的事务。但是,如果您处理的是 SAN,队列深度基本上就是传输中的请求数。所以,我不太确定该术语的确切定义。对我来说,它似乎因您所指系统的特定部分而异。
至于操作系统和设备之间的交易,设备会缓冲一定数量的交易,之后操作系统不会发送更多的交易。必须有一种允许有序处理的握手形式,这意味着操作系统不能向驱动器发送超过其物理容量的请求。否则你会陷入混乱,系统设计不佳。
换句话说,诸如“收到传入请求但队列深度已满时会发生什么”之类的问题永远不会发生在磁盘方面,并且磁盘没有“队列深度”来保存请求,它有一个“队列”。驱动器将容纳的请求的物理数量将根据驱动器的类型而有所不同。不能太小或者磁盘不能很好的优化读写,也不能太大,原因很多,成本是一个,在队列中有一定数量的请求后无法优化可能是另一个。