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权限。

posted on   开心种树  阅读(174)  评论(0编辑  收藏  举报

编辑推荐:
· .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吗?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示