• Arianna Avanzini's avatar
    block, bfq: add Early Queue Merge (EQM) · 36eca894
    Arianna Avanzini authored
    A set of processes may happen to perform interleaved reads, i.e.,
    read requests whose union would give rise to a sequential read pattern.
    There are two typical cases: first, processes reading fixed-size chunks
    of data at a fixed distance from each other; second, processes reading
    variable-size chunks at variable distances. The latter case occurs for
    example with QEMU, which splits the I/O generated by a guest into
    multiple chunks, and lets these chunks be served by a pool of I/O
    threads, iteratively assigning the next chunk of I/O to the first
    available thread. CFQ denotes as 'cooperating' a set of processes that
    are doing interleaved I/O, and when it detects cooperating processes,
    it merges their queues to obtain a sequential I/O pattern from the union
    of their I/O requests, and hence boost the throughput.
    
    Unfortunately, in the following frequent case, the mechanism
    implemented in CFQ for detecting cooperating processes and merging
    their queues is not responsive enough to handle also the fluctuating
    I/O pattern of the second type of processes. Suppose that one process
    of the second type issues a request close to the next request to serve
    of another process of the same type. At that time the two processes
    would be considered as cooperating. But, if the request issued by the
    first process is to be merged with some other already-queued request,
    then, from the moment at which this request arrives, to the moment
    when CFQ controls whether the two processes are cooperating, the two
    processes are likely to be already doing I/O in distant zones of the
    disk surface or device memory.
    
    CFQ uses however preemption to get a sequential read pattern out of
    the read requests performed by the second type of processes too.  As a
    consequence, CFQ uses two different mechanisms to achieve the same
    goal: boosting the throughput with interleaved I/O.
    
    This patch introduces Early Queue Merge (EQM), a unified mechanism to
    get a sequential read pattern with both types of processes. The main
    idea is to immediately check whether a newly-arrived request lets some
    pair of processes become cooperating, both in the case of actual
    request insertion and, to be responsive with the second type of
    processes, in the case of request merge. Both types of processes are
    then handled by just merging their queues.
    Signed-off-by: default avatarArianna Avanzini <avanzini.arianna@gmail.com>
    Signed-off-by: default avatarMauro Andreolini <mauro.andreolini@unimore.it>
    Signed-off-by: default avatarPaolo Valente <paolo.valente@linaro.org>
    Signed-off-by: default avatarJens Axboe <axboe@fb.com>
    36eca894
bfq-iosched.c 243 KB