Linux 性能优化实战
倪朋飞
资深 Linux 专家,Kubernetes 项目维护者
87256 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 65 讲
结束语 (1讲)
Linux 性能优化实战
15
15
1.0x
00:00/00:00
登录|注册

24 | 基础篇:Linux 磁盘I/O是怎么工作的(上)

存储设备和驱动程序
块设备I/O队列和I/O调度器
虚拟文件系统和其他文件系统实现
NONE, NOOP, CFQ, DeadLine
按接口
按存储介质
由连续磁盘扇区构成的最小读写单元
随机I/O性能比机械磁盘好
无需磁道寻址
随机I/O需要移动磁头,读写速度慢
由盘片和读写磁头组成
VFS内部通过目录项、索引节点、逻辑块、超级块管理文件
统一接口交互
思路总结
分析磁盘I/O性能问题
优化块设备访问效率
优化文件访问性能
多种缓存机制
设备层
通用块层
文件系统层
I/O调度算法
统一管理各种不同的块设备
类似虚拟文件系统VFS
磁盘分类
逻辑块
固态磁盘
机械磁盘
机械磁盘和固态磁盘
Linux抽象了一层虚拟文件系统VFS
对存储设备上的文件进行组织管理的机制
思考
性能优化
I/O栈
通用块层
磁盘
文件系统
Linux 磁盘I/O工作原理

该思维导图由 AI 生成,仅供参考

你好,我是倪朋飞。
上一节,我们学习了 Linux 文件系统的工作原理。简单回顾一下,文件系统是对存储设备上的文件,进行组织管理的一种机制。而 Linux 在各种文件系统实现上,又抽象了一层虚拟文件系统 VFS,它定义了一组,所有文件系统都支持的,数据结构和标准接口。
这样,对应用程序来说,只需要跟 VFS 提供的统一接口交互,而不需要关注文件系统的具体实现;对具体的文件系统来说,只需要按照 VFS 的标准,就可以无缝支持各种应用程序。
VFS 内部又通过目录项、索引节点、逻辑块以及超级块等数据结构,来管理文件。
目录项,记录了文件的名字,以及文件与其他目录项之间的目录关系。
索引节点,记录了文件的元数据。
逻辑块,是由连续磁盘扇区构成的最小读写单元,用来存储文件数据。
超级块,用来记录文件系统整体的状态,如索引节点和逻辑块的使用情况等。
其中,目录项是一个内存缓存;而超级块、索引节点和逻辑块,都是存储在磁盘中的持久化数据。
那么,进一步想,磁盘又是怎么工作的呢?又有哪些指标可以用来衡量它的性能呢?
接下来,我就带你一起看看, Linux 磁盘 I/O 的工作原理。

磁盘

磁盘是可以持久化存储的设备,根据存储介质的不同,常见磁盘可以分为两类:机械磁盘和固态磁盘。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了Linux磁盘I/O的工作原理和相关技术特点。首先,文章解释了Linux文件系统的工作原理和磁盘的分类,包括机械磁盘和固态磁盘。机械磁盘需要移动读写磁头来定位数据,因此随机I/O速度较慢;而固态磁盘不需要磁道寻址,性能较好。此外,还介绍了磁盘的最小读写单位、不同接口的分类以及磁盘的不同使用架构。通用块层在Linux中起到了统一管理各种不同块设备的作用,并介绍了通用块层的功能和I/O调度算法。整体来看,本文全面涵盖了Linux磁盘I/O的工作原理和相关技术特点,为读者提供了深入了解的概览。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Linux 性能优化实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(40)

  • 最新
  • 精选
  • JohnT3e
    工作中经常看到使用多线程读写单个磁盘中不同文件的实现,个人认为这种方法并不能有效地提高性能,因为每个线程读写磁盘的位置可能差异很大,且每个线程的数据的空间局部性和时间局部性存在差异,导致磁盘调度优化不足。不知道对不对

    作者回复: 实际上这是可以提高性能的,一方面,文件的读写是有操作系统缓存的,每次文件读写调用并不是立刻对应一个磁盘IO操作,在文件系统和块设备层依然可以作很多优化(比如最基本的排序、合并)。另一方面,如果是逐个来写的话,多个线程的工作就有可能被这一系列的文件读写阻塞,而分开来每个线程就只需要阻塞自己所读写的文件(假设采用阻塞I/O)

    2019-01-14
    35
  • 金波
    有个问题一直没弄明白,想借此机会请老师解答下, 大家经常用select来多路复用读写管道,socket等类型的文件, 请问select可否用于普通磁盘文件的读写? 不行的话为什么? 多谢

    作者回复: 碰到这种问题最好的方法是查手册,比如在 select 的文档(https://linux.die.net/man/3/select)中你可以看到: File descriptors associated with regular files shall always select true for ready to read, ready to write, and error conditions. 也就是普通文件读、写总是 Ready 的,所以用 select 也就没有意义。当然,在编程接口上,你可以还是调用它的。

    2019-01-14
    17
  • DJH
    有一个纠正一下:ISCSI访问的是块设备,不是NAS。

    作者回复: 是的,这里有些不准确,原来的意思是想表达网络存储,用 NAS 这样的专业术语就不准确了。谢谢指出。

    2019-01-14
    2
    14
  • 萨拉热窝的棒小伙儿
    老师,想问一下,如果申请的测试环境资源与生产环境资源是有差异的,那么在测试环境上做性能测试的话,是否可以按照资源差异同比例缩小,这个通过准则? 例如,生产环境10个cpu,5G 内存,期望能并发100用户,满足1秒响应。。。测试环境5个cpu,2.5G,,那么并发50用户,满足1秒响应就行了,,有这个说法嘛?

    作者回复: 没有,性能跟资源之间的关系不是线性的

    2019-01-14
    2
    13
  • black_mirror
    倪老师,您好: 1.从内核版本2.6.32以后,磁盘io调度算法好像只有3种,文中提到的none算法系统层没看到: cat /sys/block/sda/queue/scheduler noop anticipatory deadline [cfq] 2.在运行db的环境中,如MySQL,mysql的程序运行在机械硬盘上,mysql的数据目录是挂载在dell存储上(2个控制器有缓存),存储也是由机械硬盘组成,做的raid10/raid6 通过sysbench压测,其它环境保持一致,仅修改磁盘调度算法为noop/deadline: 进行只读、读写测试,分别测试3轮,每轮10分钟,求平均值比较,50个并发线程,50张表每张100w数据,oltp场景,每轮测试后,清空系统缓存和重启mysql程序 压测结果:只读场景noop比deadline好一点点,读写场景deadline比noop好一点点 请问老师这种场景下,应该选择noop 还是 deadline?因为看到下面一篇文章有些疑惑 Choosing a Disk Scheduling Algorithm The disk controller receives requests from the operating system and processes them in an order determined by a scheduling algorithm. Sometimes changing this algorithm can improve disk performance. For other hardware and workloads, it may not make a difference. The best way to decide is to test them out yourself on your workload. Dead‐ line and completely fair queueing (CFQ) both tend to be good choices. There are a couple of situations where the noop scheduler (a contraction of “no-op” is the best choice): if you’re in a virtualized environment, use the noop scheduler. The noop scheduler basically passes the operations through to the underlying disk controller as quickly as possible. It is fastest to do this and let the real disk controller handle any reordering that needs to happen. Similarly, on SSDs, the noop scheduler is generally the best choice. SSDs don’t have the same locality issues that spinning disks do. Finally, if you’re using a RAID controller with caching, use noop. The cache behaves like an SSD and will take care of propagating the writes to the disk efficiently. 选择磁盘调度算法 磁盘控制器接收来自操作系统的请求,并按调度算法确定的顺序处理它们。有时更改此算法可以提高磁盘性能。对于其他硬件和工作负载,它可能没有什么区别。决定的最佳方法是自己测试工作量。deadline和CFQ往往都是不错的选择。 有几种情况下,noop调度程序是最佳选择:如果您处于虚拟化环境中,请使用noop调度程序。 noop调度程序基本上将操作尽快传递到底层磁盘控制器。这样做最快,让真正的磁盘控制器处理需要发生的任何重新排序。同样,在SSD上,noop调度程序通常是最佳选择。 SSD没有与旋转磁盘相同的位置问题。 最后,如果您使用带有缓存的RAID控制器,请使用noop。缓存的行为类似于SSD,并且会有效地将写入传播到磁盘。

    作者回复: 1. none 主要用在虚拟机中,跟发行版有关系 2. noop和deadline都可以,不过简单的测试跟应用程序的访问模式很可能不一致,建议拿应用程序的逻辑来测试(或者使用I/O重放的方法) https://dev.mysql.com/doc/refman/5.7/en/optimizing-innodb-diskio.html 有一些优化的建议

    2019-01-14
    7
  • Cranliu
    最最常用的是iostat了吧?还有pidstat,sar等

    作者回复: 是的 这三个都是最常用的

    2019-01-14
    6
  • 小老鼠
    固态硬盘有扇区和磁道吗?

    作者回复: 没有,SSD读写的基本单位是页

    2019-01-14
    5
  • 肘子哥
    smartctl工具有缺陷,对于虚拟机和做了raid的机器是失效的

    作者回复: 嗯嗯,谢谢指出

    2019-02-23
    2
    4
  • 腾达
    系统从上到下一级级都有缓存,如果另外一个进程更新了数据,如何做到缓存失效的?

    作者回复: 这就是内存回收的逻辑了,比如 LRU 算法

    2019-01-16
    3
  • Boy-struggle
    通用块层是属于内核调度吗?raid 应该属于哪一层?

    作者回复: 嗯,是的。RAID分软件RAID和硬件RAID,其中软件RAID属于bio层

    2019-04-02
    2
    1
收起评论
显示
设置
留言
40
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部