硬盘性能提升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。

未完待续

很高兴与你相遇!如果你喜欢本文内容,记得关注哦!!!

相关推荐
酥暮沐2 天前
iscsi部署网络存储
linux·网络·存储·iscsi
泡泡糖的中文规格书3 天前
似然函数和信任函数
知识总结·计算机原理·南方电网·似然函数和信任函数
smart199816 天前
边缘AI存储服务器,软硬件一体化部署更简易价格更优
存储
长安即是故里18 天前
使用HuggingFace免费搭建100G的图床和网盘,支持上传大文件
huggingface·存储·图床
cur1es18 天前
【IO与文件及存储常识】
windows·io·文件系统·存储·file·硬盘·文件常识
ghostwritten23 天前
Netapp 存储卷无法挂载pod
kubernetes·存储
唐宋元明清21881 个月前
.NET 磁盘管理-技术方案选型
windows·c#·存储
chilavert3181 个月前
技术演进中的开发沉思-304计算机原理:XML
xml·计算机原理
chilavert3181 个月前
技术演进中的开发沉思-302计算机原理:网络基础
网络·计算机原理
chilavert3181 个月前
技术演进中的开发沉思-303计算机原理:加密基础
开发语言·算法·php·计算机原理