• Paolo Valente's avatar
    block, bfq: avoid spurious switches to soft_rt of interactive queues · 3c337690
    Paolo Valente authored
    BFQ tags some bfq_queues as interactive or soft_rt if it deems that
    these bfq_queues contain the I/O of, respectively, interactive or soft
    real-time applications. BFQ privileges both these special types of
    bfq_queues over normal bfq_queues. To privilege a bfq_queue, BFQ
    mainly raises the weight of the bfq_queue. In particular, soft_rt
    bfq_queues get a higher weight than interactive bfq_queues.
    
    A bfq_queue may turn from interactive to soft_rt. And this leads to a
    tricky issue. Soft real-time applications usually start with an
    I/O-bound, interactive phase, in which they load themselves into main
    memory. BFQ correctly detects this phase, and keeps the bfq_queues
    associated with the application in interactive mode for a
    while. Problems arise when the I/O pattern of the application finally
    switches to soft real-time. One of the conditions for a bfq_queue to
    be deemed as soft_rt is that the bfq_queue does not consume too much
    bandwidth. But the bfq_queues associated with a soft real-time
    application consume as much bandwidth as they can in the loading phase
    of the application. So, after the application becomes truly soft
    real-time, a lot of time should pass before the average bandwidth
    consumed by its bfq_queues finally drops to a value acceptable for
    soft_rt bfq_queues. As a consequence, there might be a time gap during
    which the application is not privileged at all, because its bfq_queues
    are not interactive any longer, but cannot be deemed as soft_rt yet.
    
    To avoid this problem, BFQ pretends that an interactive bfq_queue
    consumes zero bandwidth, and allows an interactive bfq_queue to switch
    to soft_rt. Yet, this fake zero-bandwidth consumption easily causes
    the bfq_queue to often switch to soft_rt deceptively, during its
    loading phase. As in soft_rt mode, the bfq_queue gets its bandwidth
    correctly computed, and therefore soon switches back to
    interactive. Then it switches again to soft_rt, and so on. These
    spurious fluctuations usually cause losses of throughput, because they
    deceive BFQ's mechanisms for boosting throughput (injection,
    I/O-plugging avoidance, ...).
    
    This commit addresses this issue as follows:
    1) It does compute actual bandwidth consumption also for interactive
       bfq_queues. This avoids the above false positives.
    2) When a bfq_queue switches from interactive to normal mode, the
       consumed bandwidth is reset (forgotten). This allows the
       bfq_queue to enjoy soft_rt very quickly. In particular, two
       alternatives are possible in this switch:
        - the bfq_queue still has backlog, and therefore there is a budget
          already scheduled to serve the bfq_queue; in this case, the
          scheduling of the current budget of the bfq_queue is not
          hindered, because only the scheduling of the next budget will
          be affected by the weight drop. After that, if the bfq_queue is
          actually in a soft_rt phase, and becomes empty during the
          service of its current budget, which is the natural behavior of
          a soft_rt bfq_queue, then the bfq_queue will be considered as
          soft_rt when its next I/O arrives. If, in contrast, the
          bfq_queue remains constantly non-empty, then its next budget
          will be scheduled with a low weight, which is the natural
          treatment for an I/O-bound (non soft_rt) bfq_queue.
        - the bfq_queue is empty; in this case, the bfq_queue may be
          considered unjustly soft_rt when its new I/O arrives. Yet
          the problem is now much smaller than before, because it is
          unlikely that more than one spurious fluctuation occurs.
    Tested-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarPaolo Valente <paolo.valente@linaro.org>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    3c337690
bfq-iosched.c 237 KB