硬盘性能提升100倍的秘密:看懂顺序I/O的魔力

简介: 本文介绍了I/O缓存的核心原理与实现机制,涵盖局部性原理、Page Cache工作机制及其写回策略,以及顺序I/O的性能优势。通过理解时间与空间局部性如何提升缓存效率,Page Cache如何利用内存优化磁盘I/O,以及顺序I/O相比随机I/O在不同存储介质上的性能差异,帮助读者深入理解系统I/O优化的关键技术。

I/O缓存

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

Page Cache

image.png

操作系统内核为了提升磁盘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
image.png

顺序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。
image.png

未完待续

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

目录
相关文章
|
存储 缓存 文件存储
如何保证分布式文件系统的数据一致性
分布式文件系统需要向上层应用提供透明的客户端缓存,从而缓解网络延时现象,更好地支持客户端性能水平扩展,同时也降低对文件服务器的访问压力。当考虑客户端缓存的时候,由于在客户端上引入了多个本地数据副本(Replica),就相应地需要提供客户端对数据访问的全局数据一致性。
32697 79
如何保证分布式文件系统的数据一致性
|
前端开发 容器
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局(上)
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局
17749 20
|
设计模式 存储 监控
设计模式(C++版)
看懂UML类图和时序图30分钟学会UML类图设计原则单一职责原则定义:单一职责原则,所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。bad case:IPhone类承担了协议管理(Dial、HangUp)、数据传送(Chat)。good case:里式替换原则定义:里氏代换原则(Liskov 
36680 19
设计模式(C++版)
|
存储 编译器 C语言
抽丝剥茧C语言(初阶 下)(下)
抽丝剥茧C语言(初阶 下)
|
机器学习/深度学习 人工智能 自然语言处理
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
24757 14
|
机器学习/深度学习 弹性计算 监控
重生之---我测阿里云U1实例(通用算力型)
阿里云产品全线降价的一力作,2023年4月阿里云推出新款通用算力型ECS云服务器Universal实例,该款服务器的真实表现如何?让我先测为敬!
36660 15
重生之---我测阿里云U1实例(通用算力型)
|
SQL 存储 弹性计算
Redis性能高30%,阿里云倚天ECS性能摸底和迁移实践
Redis在倚天ECS环境下与同规格的基于 x86 的 ECS 实例相比,Redis 部署在基于 Yitian 710 的 ECS 上可获得高达 30% 的吞吐量优势。成本方面基于倚天710的G8y实例售价比G7实例低23%,总性价比提高50%;按照相同算法,相对G8a,性价比为1.4倍左右。
|
存储 算法 Java
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的限流器RateLimiter功能服务
随着互联网的快速发展,越来越多的应用程序需要处理大量的请求。如果没有限制,这些请求可能会导致应用程序崩溃或变得不可用。因此,限流器是一种非常重要的技术,可以帮助应用程序控制请求的数量和速率,以保持稳定和可靠的运行。
29838 52

热门文章

最新文章

下一篇
开通oss服务