24 | 基础篇:Linux 磁盘I/O是怎么工作的(上)
该思维导图由 AI 生成,仅供参考
磁盘
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了Linux磁盘I/O的工作原理和相关技术特点。首先,文章解释了Linux文件系统的工作原理和磁盘的分类,包括机械磁盘和固态磁盘。机械磁盘需要移动读写磁头来定位数据,因此随机I/O速度较慢;而固态磁盘不需要磁道寻址,性能较好。此外,还介绍了磁盘的最小读写单位、不同接口的分类以及磁盘的不同使用架构。通用块层在Linux中起到了统一管理各种不同块设备的作用,并介绍了通用块层的功能和I/O调度算法。整体来看,本文全面涵盖了Linux磁盘I/O的工作原理和相关技术特点,为读者提供了深入了解的概览。
《Linux 性能优化实战》,新⼈⾸单¥68
全部留言(40)
- 最新
- 精选
- JohnT3e工作中经常看到使用多线程读写单个磁盘中不同文件的实现,个人认为这种方法并不能有效地提高性能,因为每个线程读写磁盘的位置可能差异很大,且每个线程的数据的空间局部性和时间局部性存在差异,导致磁盘调度优化不足。不知道对不对
作者回复: 实际上这是可以提高性能的,一方面,文件的读写是有操作系统缓存的,每次文件读写调用并不是立刻对应一个磁盘IO操作,在文件系统和块设备层依然可以作很多优化(比如最基本的排序、合并)。另一方面,如果是逐个来写的话,多个线程的工作就有可能被这一系列的文件读写阻塞,而分开来每个线程就只需要阻塞自己所读写的文件(假设采用阻塞I/O)
2019-01-1435 - 金波有个问题一直没弄明白,想借此机会请老师解答下, 大家经常用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-1417 - DJH有一个纠正一下:ISCSI访问的是块设备,不是NAS。
作者回复: 是的,这里有些不准确,原来的意思是想表达网络存储,用 NAS 这样的专业术语就不准确了。谢谢指出。
2019-01-14214 - 萨拉热窝的棒小伙儿老师,想问一下,如果申请的测试环境资源与生产环境资源是有差异的,那么在测试环境上做性能测试的话,是否可以按照资源差异同比例缩小,这个通过准则? 例如,生产环境10个cpu,5G 内存,期望能并发100用户,满足1秒响应。。。测试环境5个cpu,2.5G,,那么并发50用户,满足1秒响应就行了,,有这个说法嘛?
作者回复: 没有,性能跟资源之间的关系不是线性的
2019-01-14213 - 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-147 - Cranliu最最常用的是iostat了吧?还有pidstat,sar等
作者回复: 是的 这三个都是最常用的
2019-01-146 - 小老鼠固态硬盘有扇区和磁道吗?
作者回复: 没有,SSD读写的基本单位是页
2019-01-145 - 肘子哥smartctl工具有缺陷,对于虚拟机和做了raid的机器是失效的
作者回复: 嗯嗯,谢谢指出
2019-02-2324 - 腾达系统从上到下一级级都有缓存,如果另外一个进程更新了数据,如何做到缓存失效的?
作者回复: 这就是内存回收的逻辑了,比如 LRU 算法
2019-01-163 - Boy-struggle通用块层是属于内核调度吗?raid 应该属于哪一层?
作者回复: 嗯,是的。RAID分软件RAID和硬件RAID,其中软件RAID属于bio层
2019-04-0221