最近我一直在阅读有关磁盘的文章,这让我产生了 3 个不同的疑问。我无法将它们联系在一起。我混淆的三个不同术语是block size
、IO
和Performance
。
我在阅读有关超级块的文章斜线根当我遇到声明时
如果您的文件系统的块大小较大,则执行的 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 大小。从这里我理解的是,如果我想增加磁盘的吞吐量,我会在请求中发送我可以发送的最大数据量。这个假设正确吗?
抱歉,我的问题太多了,但我已经阅读了一段时间,却没有得到任何令人满意的答案。我发现了不同的观点。
答案1
我觉得维基百科文章解释得很好:
缺乏对响应时间和工作量的同时规范,IOPS 本质上毫无意义。
...
与基准测试一样,存储设备制造商发布的 IOPS 数字与实际应用程序性能并不直接相关。...
现在回答你的问题:
那么谁来决定 IO 请求的大小?
对于我这样的非程序员来说,这是一个既容易又难以回答的问题。
像往常一样,答案是不能令人满意的“这取决于“……”
应用程序对磁盘存储的 I/O 操作通常是对操作系统的系统调用,其大小取决于所进行的系统调用......
与其他操作系统相比,我对 Linux 更熟悉,因此我将用它作为参考。
I/O 操作的大小,例如open()
,stat()
,chmod()
类似的几乎可以忽略不计。
在旋转磁盘上,这些调用的性能主要取决于磁盘致动器需要移动臂和读取磁头在磁盘盘片上的正确位置的程度。
另一方面, read()
和write()
调用最初由应用程序设置,在单个 I/O 请求中可以在0
和(2,147,479,552)字节之间变化......0x7ffff000
当然,一旦应用程序发出了这样的系统调用,并被操作系统接收,该调用将得到安排和排队(取决于是否使用 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。
答案2
似乎您正在尝试解读这句话:
“如果文件系统的块大小较大,则执行的 IOPS 会较少。”
让我尝试重新表述这句话,以使原作者的意思更清楚:
“要读取特定大小(例如 10MB)的文件,使用较大块大小格式化的文件系统将大概与使用较小块大小格式化的文件系统相比,需要执行的读取操作次数更少。”
我希望我的改述比原文更有意义一些。
为了正确解析该语句并理解 a) 使用术语“文件系统”而不是磁盘的原因以及 b) 那个令人讨厌的“可能”,您需要了解有关磁盘(或 SSD)上的数据和用户空间应用程序之间的所有软件层的更多信息。我可以为您提供一些开始谷歌搜索的提示:
对于旋转磁盘:
- 扇区大小(磁盘)与块大小(文件系统)
了解缓存:
操作系统内核中的页面/缓冲区缓存
用户级库中的 I/O 缓存(其中最重要的是 libc 和 libc++)
对于 SSD 或其他基于闪存的存储,还有一些其他复杂因素。您应该了解闪存如何以页面为单位工作,以及为什么任何基于闪存的存储都需要垃圾收集过程。