I/O调度器的工作是管理块设备的请求队列。它决定队列中的请求排列顺序及在什么时候派发请求到块设备。这样做有利于减少磁盘寻址时间,从而提高全局吞吐量。注意“全局”的的含义,I/O调度器可能为了提高系统整体性能,而对某些请求不公。
I/O调度器通过两种方法减少磁盘寻址时间:合并(merging)与排序 (sorting)。合并指将两个或多个请求结合成一个新请求。考虑一下这种情况,文件系统提交请求到请求队列—从文件中读取一个数据区,如果这时队列中已经存在一个请求,它访问的磁盘扇区和当前请求访问的磁盘扇区相邻,那么这两个请求就可以合并为一个对单个或多个相邻磁盘扇区操作的新请求。通过合并请求,I/O调度器将多次请求的开销压缩为一次请求的开销。更重要的是,请求合并后只需要传递给磁盘一条寻址命令,就可以访问到请求合并前必须多次寻址才能访问完的磁盘区域了,因此合并请求显然能减少系统开销和磁盘寻址次数。
SSD是否经过I/O调度器?当块设备请求队列拥塞时,内核如何处理?
完整文档下载:Linux内核I/O调度层
博主你好,
我读了你linux 内核IO调度层这篇文章,有几个疑问想请教你,不知道可不可以赐教:
文章中提到请求队列,也提到每种调度器的特定队列,例如CFQ的特定队列,还提到派遣队列、设备的请求队列。我现在感到有些混乱:
1. 文中提到的请求队列,是笼统地指块设备层的所有队列吗? 还是指设备的请求队列device request queue?
2. 每种调度器的特定队列和请求队列是不是一样的?还是调度器有自己的请求队列,另外还要维护一个设备的请求队列?
3. 派遣队列是请求队列吗?bdev_get_queue获取的请求队列是派遣队列吗?
4. IO调度器是在哪个队列上调度的?
5. unplug是指将bio从每个进程的per task 队列放入调度器的队列吗?还是,将调度器队列中的请求放入派遣队列?unplug是在什么时候?
6. 驱动例程,例如scsi_request_fn,是从哪个队列里获取请求的?
不胜感激!