|  | Deadline IO scheduler tunables | 
|  | ============================== | 
|  |  | 
|  | This little file attempts to document how the deadline io scheduler works. | 
|  | In particular, it will clarify the meaning of the exposed tunables that may be | 
|  | of interest to power users. | 
|  |  | 
|  | Selecting IO schedulers | 
|  | ----------------------- | 
|  | Refer to Documentation/block/switching-sched.txt for information on | 
|  | selecting an io scheduler on a per-device basis. | 
|  |  | 
|  |  | 
|  | ******************************************************************************** | 
|  |  | 
|  |  | 
|  | read_expire	(in ms) | 
|  | ----------- | 
|  |  | 
|  | The goal of the deadline io scheduler is to attempt to guarantee a start | 
|  | service time for a request. As we focus mainly on read latencies, this is | 
|  | tunable. When a read request first enters the io scheduler, it is assigned | 
|  | a deadline that is the current time + the read_expire value in units of | 
|  | milliseconds. | 
|  |  | 
|  |  | 
|  | write_expire	(in ms) | 
|  | ----------- | 
|  |  | 
|  | Similar to read_expire mentioned above, but for writes. | 
|  |  | 
|  |  | 
|  | fifo_batch	(number of requests) | 
|  | ---------- | 
|  |  | 
|  | Requests are grouped into ``batches'' of a particular data direction (read or | 
|  | write) which are serviced in increasing sector order.  To limit extra seeking, | 
|  | deadline expiries are only checked between batches.  fifo_batch controls the | 
|  | maximum number of requests per batch. | 
|  |  | 
|  | This parameter tunes the balance between per-request latency and aggregate | 
|  | throughput.  When low latency is the primary concern, smaller is better (where | 
|  | a value of 1 yields first-come first-served behaviour).  Increasing fifo_batch | 
|  | generally improves throughput, at the cost of latency variation. | 
|  |  | 
|  |  | 
|  | writes_starved	(number of dispatches) | 
|  | -------------- | 
|  |  | 
|  | When we have to move requests from the io scheduler queue to the block | 
|  | device dispatch queue, we always give a preference to reads. However, we | 
|  | don't want to starve writes indefinitely either. So writes_starved controls | 
|  | how many times we give preference to reads over writes. When that has been | 
|  | done writes_starved number of times, we dispatch some writes based on the | 
|  | same criteria as reads. | 
|  |  | 
|  |  | 
|  | front_merges	(bool) | 
|  | ------------ | 
|  |  | 
|  | Sometimes it happens that a request enters the io scheduler that is contiguous | 
|  | with a request that is already on the queue. Either it fits in the back of that | 
|  | request, or it fits at the front. That is called either a back merge candidate | 
|  | or a front merge candidate. Due to the way files are typically laid out, | 
|  | back merges are much more common than front merges. For some work loads, you | 
|  | may even know that it is a waste of time to spend any time attempting to | 
|  | front merge requests. Setting front_merges to 0 disables this functionality. | 
|  | Front merges may still occur due to the cached last_merge hint, but since | 
|  | that comes at basically 0 cost we leave that on. We simply disable the | 
|  | rbtree front sector lookup when the io scheduler merge function is called. | 
|  |  | 
|  |  | 
|  | Nov 11 2002, Jens Axboe <jens.axboe@oracle.com> | 
|  |  | 
|  |  |