由于cpu和磁盘的操作周期差 500万倍以上,所以若按照发出IO请求的顺序将IO请求传送给磁盘,效率将非常低,
所以内核会实现IO调度,调整IO请求顺序及时间,以减少磁盘查询次数和大小。
以尽可能降低磁盘访问对系统性能所造成的影响。
磁盘虽然使用多级寻址,但现代磁盘会将独一无二的块编号映射到 三级寻址的组合。
所以现代操作系统可以使用块号进行寻址。
通常块与 三级地址 的映射关系是顺序的,如 物理块n,相邻的块为n+1。
另外文件系统使用的最小数据单元为逻辑块,逻辑块为物理块的整数倍。
IO调度的基本操作:合并和排序
合并:将相邻块的IO请求组合成一个请求。
排序:按照递增的块顺序安排IO请求。
从而减少磁头移动,高效IO
若使用固态硬盘,由于没有磁头,所以不需要排序,建议使用 noop
若需要好的交互性,建议使用 cfq,可以避免读饿死
若使用磁盘,建议使用 cfq
在 /sys/block/device/queue/scheduler 设置
若希望使用IO排序功能,但是内核IO排序只能作用于一小段IO,
若程序有大量IO,则会导致无法排序访问,若程序自己对IO进行排序,则能保证高效IO。
推荐使用 inode排序,或物理块排序、
inode排序的优点:inode容易获得,容易排序,且接近物理块。
缺点:接近只是猜测,对非unix文件系统而言不准确。
但inode排序是用户空间IO请求调度的最常用方法。
物理块排序:优点:准确的顺序,缺点:获得物理块需要root权限。