• Paolo Valente's avatar
    block, bfq: add more fairness with writes and slow processes · c074170e
    Paolo Valente authored
    This patch deals with two sources of unfairness, which can also cause
    high latencies and throughput loss. The first source is related to
    write requests. Write requests tend to starve read requests, basically
    because, on one side, writes are slower than reads, whereas, on the
    other side, storage devices confuse schedulers by deceptively
    signaling the completion of write requests immediately after receiving
    them. This patch addresses this issue by just throttling writes. In
    particular, after a write request is dispatched for a queue, the
    budget of the queue is decremented by the number of sectors to write,
    multiplied by an (over)charge coefficient. The value of the
    coefficient is the result of our tuning with different devices.
    
    The second source of unfairness has to do with slowness detection:
    when the in-service queue is expired, BFQ also controls whether the
    queue has been "too slow", i.e., has consumed its last-assigned budget
    at such a low rate that it would have been impossible to consume all
    of this budget within the maximum time slice T_max (Subsec. 3.5 in
    [1]). In this case, the queue is always (over)charged the whole
    budget, to reduce its utilization of the device. Both this overcharge
    and the slowness-detection criterion may cause unfairness.
    
    First, always charging a full budget to a slow queue is too coarse. It
    is much more accurate, and this patch lets BFQ do so, to charge an
    amount of service 'equivalent' to the amount of time during which the
    queue has been in service. As explained in more detail in the comments
    on the code, this enables BFQ to provide time fairness among slow
    queues.
    
    Secondly, because of ZBR, a queue may be deemed as slow when its
    associated process is performing I/O on the slowest zones of a
    disk. However, unless the process is truly too slow, not reducing the
    disk utilization of the queue is more profitable in terms of disk
    throughput than the opposite. A similar problem is caused by logical
    block mapping on non-rotational devices. For this reason, this patch
    lets a queue be charged time, and not budget, only if the queue has
    consumed less than 2/3 of its assigned budget. As an additional,
    important benefit, this tolerance allows BFQ to preserve enough
    elasticity to still perform bandwidth, and not time, distribution with
    little unlucky or quasi-sequential processes.
    
    Finally, for the same reasons as above, this patch makes slowness
    detection itself much less harsh: a queue is deemed slow only if it
    has consumed its budget at less than half of the peak rate.
    
    [1] P. Valente and M. Andreolini, "Improving Application
        Responsiveness with the BFQ Disk I/O Scheduler", Proceedings of
        the 5th Annual International Systems and Storage Conference
        (SYSTOR '12), June 2012.
        Slightly extended version:
        http://algogroup.unimore.it/people/paolo/disk_sched/bfq-v1-suite-
    							results.pdf
    Signed-off-by: default avatarPaolo Valente <paolo.valente@linaro.org>
    Signed-off-by: default avatarArianna Avanzini <avanzini.arianna@gmail.com>
    Signed-off-by: default avatarJens Axboe <axboe@fb.com>
    c074170e
bfq-iosched.c 185 KB