• Jianchao Wang's avatar
    block: kyber: make kyber more friendly with merging · a6088845
    Jianchao Wang authored
    Currently, kyber is very unfriendly with merging. kyber depends
    on ctx rq_list to do merging, however, most of time, it will not
    leave any requests in ctx rq_list. This is because even if tokens
    of one domain is used up, kyber will try to dispatch requests
    from other domain and flush the rq_list there.
    To improve this, we setup kyber_ctx_queue (kcq) which is similar
    with ctx, but it has rq_lists for different domain and build same
    mapping between kcq and khd as the ctx & hctx. Then we could merge,
    insert and dispatch for different domains separately. At the same
    time, only flush the rq_list of kcq when get domain token successfully.
    Then if one domain token is used up, the requests could be left in
    the rq_list of that domain and maybe merged with following io.
    Following is my test result on machine with 8 cores and NVMe card
    fio size=256m ioengine=libaio iodepth=64 direct=1 numjobs=8
    |patch?| bw(MB/s) |   iops    | slat(usec) |    clat(usec)   |  merge  |
    | w/o  |  606/612 | 151k/153k |  6.89/7.03 | 3349.21/3305.40 |   0/0   |
    | w/   | 1083/616 | 277k/154k |  4.93/6.95 | 1830.62/3279.95 | 223k/3k |
    When set numjobs to 16, the bw and iops could reach 1662MB/s and 425k
    on my platform.
    Signed-off-by: default avatarJianchao Wang <jianchao.w.wang@oracle.com>
    Tested-by: default avatarHolger Hoffstätte <holger@applied-asynchrony.com>
    Reviewed-by: default avatarOmar Sandoval <osandov@fb.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
kyber-iosched.c 25.3 KB