块大小和IO之间的关系是什么?

Ank*_*rni 8 performance filesystems hard-drive io

我最近一直在阅读有关磁盘的信息,这让我产生了 3 个不同的疑问。而且我无法将它们链接在一起。我混淆的三个不同术语是block size,IOPerformance

当我遇到该语句时,我正在slashroot 上阅读有关超级块的信息

如果您的文件系统具有较大的块大小,则将执行较少的 IOPS。

由此我明白,如果我想读取 1024 KB 的数据,块大小为 4KB/4096B 的磁盘(比如 A)将比块大小为 64KB 的磁盘(比如 B)需要更多的 IO。

现在我的问题是磁盘 A 需要多少 IO?

据我了解,读取此数据所需的 IO 请求数量也取决于每个 IO 请求的大小。

  • So who is deciding what is the size of the IO request? Is it equal to the block size? 有人说您的应用程序决定了 IO 请求的大小,这似乎很公平,但是操作系统如何将单个请求划分为多个 IO。 There must be a limit after which the request splits in more then one IO. How to find that limit ?
  • Is it possible that in both disk (A and B) the data can be read in same number of IO?
  • Does reading each block means a single IO ? If not how many blocks can be maximum read in a single IO?
  • If the data is sequential or random spread, does CPU provides all block address to read once?

可能的 IOPS 数量 = 1 /(平均旋转延迟 + 平均寻道时间)

吞吐量 = IOPS * IO 大小

从上面来看,磁盘的 IOPS 将始终是固定的,但 IO 大小可以是可变的。因此,要计算最大可能的吞吐量,我们需要最大 IO 大小。由此我了解到,如果我想增加磁盘的吞吐量,我会使用我可以在请求中发送的最大数据进行请求。这个假设正确吗?

对于太多的问题,我深表歉意,但我已经阅读了一段时间,无法得到任何满意的答案。我发现了不同的看法。

HBr*_*ijn 5

我认为维基百科的文章解释得很好:

如果没有响应时间和工作负载的同步规范,IOPS 基本上是没有意义的。
...
与基准测试一样,存储设备制造商发布的 IOPS 数字与实际应用程序性能没有直接关系。...

现在回答你的问题:

那么谁来决定 IO 请求的大小呢?

对于像我这样的非程序员来说,这是一个既简单又困难的问题。

像往常一样,答案是令人不满意的“视情况而定”......

应用程序对磁盘存储的 I/O 操作通常是对操作系统的系统调用,它们的大小取决于进行哪个系统调用...

与其他操作系统相比,我对 Linux 更熟悉,因此我将其用作参考。

I / O操作,如大小open()stat()chmod()和类似的是几乎可以忽略。
在旋转磁盘上,这些调用的性能主要取决于磁盘执行器需要多少移动臂并将磁头读取到磁盘盘片上的正确位置。

在另一只手的大小 read()write()呼叫最初由应用程序设置,并且可以变化之间00x7ffff000(2147479552)在单个I / O请求字节...

当然,一旦应用程序进行了这样的系统调用并被操作系统接收到,该调用将被调度和排队(取决于 O_DIRECT 标志是否用于绕过页面缓存和缓冲区并直接 I /O 被选中)。

抽象系统调用将需要映射到/从底层文件系统上的操作映射到/从以离散排序的底层文件系统上的操作(其大小通常在创建文件系统时设置),最终磁盘驱动程序在任一硬盘上运行512 或 4096 字节的磁盘扇区或 2K、4K、8K 或 16K 的 SSD 内存页。

(对于基准测试,读取和写入调用通常设置为 512B 或 4KB,这与底层磁盘非常匹配,从而获得最佳性能。)

必须有一个限制,在这个限制之后,请求分成多个 IO。如何找到那个极限?

是的,有一个限制,在手册中记录的 Linux 上,单个read()write()系统调用将返回最多0x7ffff000(2,147,479,552) 个字节。要读取更大的文件,您将需要额外的系统调用。

读取每个块是否意味着单个 IO ?

据我了解,通常每次发生系统调用都算作 IO 事件。

单个 read()系统调用计为 1 个 I/0 事件,无论该系统调用如何转换/实现为从文件系统访问 X 块或从旋转硬盘读取 Y 扇区,X 和 Y IO 都不算。

  • 非常感谢您的回答。我想我理解你的解释,所以本质上的要点是 IO 和块大小之间没有直接关系。但是,如果是这种情况,那么说“更大的块大小需要更少的 IOPS”这句话不成立是否正确? (2认同)