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

未完待续

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

相关推荐
poemyang3 天前
从纳秒到毫秒的“时空之旅”:CPU是如何看待内存与硬盘的?
dma·计算机原理·存储架构·i/o 模式
杰克逊的日记16 天前
k8s的csi对接GPFS
云原生·容器·kubernetes·存储·gpfs
虚伪的空想家1 个月前
rook-ceph配置dashboard代理无法访问
ceph·云原生·k8s·存储·rook
小猴崽2 个月前
腾讯云CBS:企业级云存储的性能与可靠性重构
存储·云存储·cbs
搬砖魁首2 个月前
Filecoin系列 - IPLD 技术分析
存储·filecoin·ipld·cid
Lz__Heng2 个月前
记一次使用HPE SSMC管理停用HPE 3par存储报连接出错
运维·存储
大千AI助手2 个月前
如何数据的永久保存?将信息以加密电磁波形式发射至太空实现永久保存的可行性说明
人工智能·存储·数据·高可用·永久保存
OceanBase数据库官方博客2 个月前
OceanBase v4.3.5 特性解读:通过OSS WORM特性进行备份归档
oceanbase·分布式数据库·存储
smart19982 个月前
制造企业搭建AI智能生产线怎么部署?
ai·制造·存储