• K
    block/diskstats: more accurate approximation of io_ticks for slow disks · 09614b96
    Konstantin Khlebnikov 提交于
    mainline inclusion
    from mainline-v5.7-rc1
    commit 2b8bd423
    category: bugfix
    bugzilla: 187044, https://gitee.com/openeuler/kernel/issues/I5F2BY
    CVE: NA
    
    --------------------------------
    
    Currently io_ticks is approximated by adding one at each start and end of
    requests if jiffies counter has changed. This works perfectly for requests
    shorter than a jiffy or if one of requests starts/ends at each jiffy.
    
    If disk executes just one request at a time and they are longer than two
    jiffies then only first and last jiffies will be accounted.
    
    Fix is simple: at the end of request add up into io_ticks jiffies passed
    since last update rather than just one jiffy.
    
    Example: common HDD executes random read 4k requests around 12ms.
    
    fio --name=test --filename=/dev/sdb --rw=randread --direct=1 --runtime=30 &
    iostat -x 10 sdb
    
    Note changes of iostat's "%util" 8,43% -> 99,99% before/after patch:
    
    Before:
    
    Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    sdb               0,00     0,00   82,60    0,00   330,40     0,00     8,00     0,96   12,09   12,09    0,00   1,02   8,43
    
    After:
    
    Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    sdb               0,00     0,00   82,50    0,00   330,00     0,00     8,00     1,00   12,10   12,10    0,00  12,12  99,99
    
    Now io_ticks does not loose time between start and end of requests, but
    for queue-depth > 1 some I/O time between adjacent starts might be lost.
    
    For load estimation "%util" is not as useful as average queue length,
    but it clearly shows how often disk queue is completely empty.
    
    Fixes: 5b18b5a7 ("block: delete part_round_stats and switch to less precise counting")
    Signed-off-by: NKonstantin Khlebnikov <khlebnikov@yandex-team.ru>
    Reviewed-by: NMing Lei <ming.lei@redhat.com>
    Signed-off-by: NJens Axboe <axboe@kernel.dk>
    
    Conflict:
    	block/bio.c
    	block/blk-core.c
    	include/linux/genhd.h
    Signed-off-by: NZhang Wensheng <zhangwensheng5@huawei.com>
    Reviewed-by: NYu Kuai <yukuai3@huawei.com>
    Reviewed-by: NJason Yan <yanaijie@huawei.com>
    Signed-off-by: NYongqiang Liu <liuyongqiang13@huawei.com>
    09614b96
genhd.h 24.2 KB