硬盘性能提升 100 倍的秘密:看懂顺序 I/O 的魔力
I/O 缓存
局部性原理局部性原理(Principle of Locality)指在程序执行过程中,倾向于访问某些局部特定的数据或指令,而不是随机地访问整个内存空间。这是缓存技术得以有效的根本原因。1)时间局部性(Temporal Locality):如果一个数据项被访问,那么在不久的将来它很可能被再次访问(如循环中的变量、常用函数)。2)空间局部性(Spatial Locality):如果一个数据项被访问,那么物理地址邻近它的数据项也很可能在不久的将来被访问(如顺序执行的指令、数组元素的遍历)。局部性原理,很好平衡了存储介质的存取速率和成本的问题。以计算机存储层次为例,寄存器缓存高速缓存的数据,高速缓存 L1~L3 层视具体实现彼此缓存或直接缓存内存的数据,而内存往往缓存来自本地硬盘的数据。
Page Cache

操作系统内核为了提升磁盘 I/O 性能,利用主存中的一部分空间作为磁盘数据的缓存,这就是 Page Cache(在 Linux 中如此称呼,也称 Buffer Cache)。它位于应用程序的 read/write 系统调用与底层块设备驱动之间,利用局部性原理工作。1)当一个数据页被从硬盘读取到内存时,它被存储在 Page Cache 中。如果这个数据页在近期内被再次访问(时间局部性),那么可以直接从 Page Cache 中读取,而无需再次访问硬盘。2)当一个数据页被读取时,操作系统通常会预读取一些附近的数据页(空间局部性),并将它们也存储在 Page Cache 中,以便后续的访问。Page Cache 的大小是根据当前系统的可用内存和工作负载动态调整的,此外还会通过页面置换算法如 LRU (Least Recently Used)定期淘汰旧的数据页。Page Cache 可以大大减少硬盘 I/O,从而提高系统的性能。Page Cache 支持写回(Write-back)和写穿(Write-through)两种策略:1)在写回策略中,当程序写入数据时,数据首先被写入 Page Cache,然后在适当的时机被写入硬盘。2)在写穿策略中,数据同时被写入 Page Cache 和硬盘。Linux 下默认使用写回策略,即文件操作的写只写到 Page Cache 就返回。Page Cache 中被修改的内存页称之为脏页(Dirty Page),脏页在特定的时候被一个叫做 pdflush(Page Dirty Flush)的内核线程写入硬盘,写入的时机和条件如下:1)当空闲内存低于一个特定的阈值时。2)当脏页在内存中驻留时间超过一个特定的阈值时。3)用户进程调用 sync()、fsync(fd)、fdatasync(fd)系统调用时。
顺序 I/O

顺序 I/O(Sequential I/O)是一种数据访问模式,其中数据按照连续的顺序进行读取或写入。这与随机 I/O(Random I/O)形成对比,随机 I/O 是指数据的访问位置在存储设备上是随机分布的。顺序 I/O 的性能之所以高,主要是因为它能够最大化利用存储设备的局部性原理,并且减少了寻道时间和旋转延迟。1)局部性原理:在顺序 I/O 中,数据是连续读取或写入的,Page Cache 可以将文件的连续数据块缓存在内存中,以提供快速的连续读取。此外 Page Cache 可以将内存中缓存的连续数据,比如按页大小批次刷新到硬盘。这样可以减少频繁的硬盘写入操作。2)减少机械硬盘的寻道时间和旋转延迟:寻道操作指磁头移动到硬盘的正确轨道的过程,旋转延迟指磁头等待硬盘旋转到正确位置的时间。在顺序 I/O 中,由于数据是连续存储的,因此可以大大减少寻道时间和旋转延迟,从而提高 I/O 性能。3)虽然固态硬盘没有机械部件,随机读性能远好于机械硬盘,但顺序 I/O 仍然更优。这是因为固态硬盘内部以页(Page,如 4KB/8KB/16KB)为单位读写,以块(Block,通常包含多个页,如 128-512KB)为单位擦除。随机写小数据块可能导致“读-修改-擦除-写”的复杂流程,引发写放大。顺序写则能更高效地利用 NAND 闪存的特性,减少内部管理开销。内存访问速度和硬盘访问速度的对比结果。1)硬盘访问时间等于寻道时间+旋转时间+传输时间的总和。寻道时间:8ms~12ms;旋转时间:7200 转/min:半周 4ms;传输时间:50M/s,约 0.3ms 。2)性能量级对比:硬盘随机 I/O ≪ 硬盘顺序 I/O(尤其对 HDD) ≈ 内存随机 I/O≪ 内存顺序 I/O(内存的顺序访问也能受益于处理器 Cache Line 的填充等)。3)机械硬盘和固态硬盘构成:机械硬盘:核心是高速旋转的磁盘盘片(表面覆盖磁性材料)和在盘片上移动的磁头臂。通过改变磁性材料的极性来存储 0 和 1。固态硬盘:核心是 NAND 闪存颗粒(Flash Memory)阵列,由主控芯片负责管理数据的读写、磨损均衡、垃圾回收等。通过在浮栅中存储电荷来表示 0 和 1。

未完待续
很高兴与你相遇!如果你喜欢本文内容,记得关注哦!!!
版权声明: 本文为 InfoQ 作者【poemyang】的原创文章。
原文链接:【http://xie.infoq.cn/article/434f6440d071f81a4e96c7b41】。文章转载请联系作者。
评论