• Jan Kara's avatar
    bfq: Limit waker detection in time · 1f18b700
    Jan Kara authored
    Currently, when process A starts issuing requests shortly after process
    B has completed some IO three times in a row, we decide that B is a
    "waker" of A meaning that completing IO of B is needed for A to make
    progress and generally stop separating A's and B's IO much. This logic
    is useful to avoid unnecessary idling and thus throughput loss for cases
    where workload needs to switch e.g. between the process and the
    journaling thread doing IO. However the detection heuristic tends to
    frequently give false positives when A and B are fighting IO bandwidth
    and other processes aren't doing much IO as we are basically deemed to
    eventually accumulate three occurences of a situation where one process
    starts issuing requests after the other has completed some IO. To reduce
    these false positives, cancel the waker detection also if we didn't
    accumulate three detected wakeups within given timeout. The rationale is
    that if wakeups are really rare, the pointless idling doesn't hurt
    throughput that much anyway.
    
    This significantly reduces false waker detection for workload like:
    
    [global]
    directory=/mnt/repro/
    rw=write
    size=8g
    time_based
    runtime=30
    ramp_time=10
    blocksize=1m
    direct=0
    ioengine=sync
    
    [slowwriter]
    numjobs=1
    fsync=200
    
    [fastwriter]
    numjobs=1
    fsync=200
    Acked-by: default avatarPaolo Valente <paolo.valente@linaro.org>
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    Link: https://lore.kernel.org/r/20211125133645.27483-5-jack@suse.czSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    1f18b700
bfq-iosched.c 259 KB