linux系统编程——文件IO——IO调度与性能
1. 为什么需要IO调度
由于cpu和磁盘的操作周期差 500万倍以上,所以若按照发出IO请求的顺序将IO请求传送给磁盘,效率将非常低,
所以内核会实现IO调度,调整IO请求顺序及时间,以减少磁盘查询次数和大小。
以尽可能降低磁盘访问对系统性能所造成的影响。
2. 磁盘寻址
磁盘虽然使用多级寻址,但现代磁盘会将独一无二的块编号映射到 三级寻址的组合。
所以现代操作系统可以使用块号进行寻址。
通常块与 三级地址 的映射关系是顺序的,如 物理块n,相邻的块为n+1。
另外文件系统使用的最小数据单元为逻辑块,逻辑块为物理块的整数倍。
2.1 合并和排序
IO调度的基本操作:合并和排序
合并:将相邻块的IO请求组合成一个请求。
排序:按照递增的块顺序安排IO请求。
从而减少磁头移动,高效IO
3.设置合适内核IO调度
若使用固态硬盘,由于没有磁头,所以不需要排序,建议使用 noop
若需要好的交互性,建议使用 cfq,可以避免读饿死
若使用磁盘,建议使用 cfq
在 /sys/block/device/queue/scheduler 设置
4. 用户层IO调度
若希望使用IO排序功能,但是内核IO排序只能作用于一小段IO,
若程序有大量IO,则会导致无法排序访问,若程序自己对IO进行排序,则能保证高效IO。
推荐使用 inode排序,或物理块排序、
inode排序的优点:inode容易获得,容易排序,且接近物理块。
缺点:接近只是猜测,对非unix文件系统而言不准确。
但inode排序是用户空间IO请求调度的最常用方法。
物理块排序:优点:准确的顺序,缺点:获得物理块需要root权限。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?