• Tejun Heo's avatar
    blk-iocost: implement Andy's method for donation weight updates · e08d02aa
    Tejun Heo authored
    iocost implements work conservation by reducing iocg->inuse and propagating
    the adjustment upwards proportionally. However, while I knew the target
    absolute hierarchical proportion - adjusted hweight_inuse, I couldn't figure
    out how to determine the iocg->inuse adjustment to achieve that and
    approximated the adjustment by scaling iocg->inuse using the proportion of
    the needed hweight_inuse changes.
    
    When nested, these scalings aren't accurate even when adjusting a single
    node as the donating node also receives the benefit of the donated portion.
    When multiple nodes are donating as they often do, they can be wildly wrong.
    
    iocost employed various safety nets to combat the inaccuracies. There are
    ample buffers in determining how much to donate, the adjustments are
    conservative and gradual. While it can achieve a reasonable level of work
    conservation in simple scenarios, the inaccuracies can easily add up leading
    to significant loss of total work. This in turn makes it difficult to
    closely cap vrate as vrate adjustment is needed to compensate for the loss
    of work. The combination of inaccurate donation calculations and vrate
    adjustments can lead to wide fluctuations and clunky overall behaviors.
    
    Andy Newell devised a method to calculate the needed ->inuse updates to
    achieve the target hweight_inuse's. The method is compatible with the
    proportional inuse adjustment propagation which allows all hot path
    operations to be local to each iocg.
    
    To roughly summarize, Andy's method divides the tree into donating and
    non-donating parts, calculates global donation rate which is used to
    determine the target hweight_inuse for each node, and then derives per-level
    proportions. There's non-trivial amount of math involved. Please refer to
    the following pdfs for detailed descriptions.
    
      https://drive.google.com/file/d/1PsJwxPFtjUnwOY1QJ5AeICCcsL7BM3bo
      https://drive.google.com/file/d/1vONz1-fzVO7oY5DXXsLjSxEtYYQbOvsE
      https://drive.google.com/file/d/1WcrltBOSPN0qXVdBgnKm4mdp9FhuEFQN
    
    This patch implements Andy's method in transfer_surpluses(). This makes the
    donation calculations accurate per cycle and enables further improvements in
    other parts of the donation logic.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Cc: Andy Newell <newella@fb.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    e08d02aa
blk-iocost.c 84.3 KB