• Omar Sandoval's avatar
    kyber: implement improved heuristics · 6e25cb01
    Omar Sandoval authored
    Kyber's current heuristics have a few flaws:
    
    - It's based on the mean latency, but p99 latency tends to be more
      meaningful to anyone who cares about latency. The mean can also be
      skewed by rare outliers that the scheduler can't do anything about.
    - The statistics calculations are purely time-based with a short window.
      This works for steady, high load, but is more sensitive to outliers
      with bursty workloads.
    - It only considers the latency once an I/O has been submitted to the
      device, but the user cares about the time spent in the kernel, as
      well.
    
    These are shortcomings of the generic blk-stat code which doesn't quite
    fit the ideal use case for Kyber. So, this replaces the statistics with
    a histogram used to calculate percentiles of total latency and I/O
    latency, which we then use to adjust depths in a slightly more
    intelligent manner:
    
    - Sync and async writes are now the same domain.
    - Discards are a separate domain.
    - Domain queue depths are scaled by the ratio of the p99 total latency
      to the target latency (e.g., if the p99 latency is double the target
      latency, we will double the queue depth; if the p99 latency is half of
      the target latency, we can halve the queue depth).
    - We use the I/O latency to determine whether we should scale queue
      depths down: we will only scale down if any domain's I/O latency
      exceeds the target latency, which is an indicator of congestion in the
      device.
    
    These new heuristics are just as scalable as the heuristics they
    replace.
    Signed-off-by: default avatarOmar Sandoval <osandov@fb.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    6e25cb01
kyber-iosched.c 27.6 KB