[lkml]   [2019]   [Jun]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[PATCH 4.19 101/118] block, bfq: increase idling for weight-raised queues
    [ Upstream commit 778c02a236a8728bb992de10ed1f12c0be5b7b0e ]

    If a sync bfq_queue has a higher weight than some other queue, and
    remains temporarily empty while in service, then, to preserve the
    bandwidth share of the queue, it is necessary to plug I/O dispatching
    until a new request arrives for the queue. In addition, a timeout
    needs to be set, to avoid waiting for ever if the process associated
    with the queue has actually finished its I/O.

    Even with the above timeout, the device is however not fed with new
    I/O for a while, if the process has finished its I/O. If this happens
    often, then throughput drops and latencies grow. For this reason, the
    timeout is kept rather low: 8 ms is the current default.

    Unfortunately, such a low value may cause, on the opposite end, a
    violation of bandwidth guarantees for a process that happens to issue
    new I/O too late. The higher the system load, the higher the
    probability that this happens to some process. This is a problem in
    scenarios where service guarantees matter more than throughput. One
    important case are weight-raised queues, which need to be granted a
    very high fraction of the bandwidth.

    To address this issue, this commit lower-bounds the plugging timeout
    for weight-raised queues to 20 ms. This simple change provides
    relevant benefits. For example, on a PLEXTOR PX-256M5S, with which
    gnome-terminal starts in 0.6 seconds if there is no other I/O in
    progress, the same applications starts in
    - 0.8 seconds, instead of 1.2 seconds, if ten files are being read
    sequentially in parallel
    - 1 second, instead of 2 seconds, if, in parallel, five files are
    being read sequentially, and five more files are being written

    Tested-by: Holger Hoffstätte <>
    Tested-by: Oleksandr Natalenko <>
    Signed-off-by: Paolo Valente <>
    Signed-off-by: Jens Axboe <>
    Signed-off-by: Sasha Levin <>
    block/bfq-iosched.c | 2 ++
    1 file changed, 2 insertions(+)

    diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
    index 15e8c9955b79..6bb397995610 100644
    --- a/block/bfq-iosched.c
    +++ b/block/bfq-iosched.c
    @@ -2509,6 +2509,8 @@ static void bfq_arm_slice_timer(struct bfq_data *bfqd)
    if (BFQQ_SEEKY(bfqq) && bfqq->wr_coeff == 1 &&
    sl = min_t(u64, sl, BFQ_MIN_TT);
    + else if (bfqq->wr_coeff > 1)
    + sl = max_t(u32, sl, 20ULL * NSEC_PER_MSEC);

    bfqd->last_idling_start = ktime_get();
    hrtimer_start(&bfqd->idle_slice_timer, ns_to_ktime(sl),

     \ /
      Last update: 2019-06-13 18:11    [W:2.547 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site