• Joe Thornber's avatar
    dm btree: improve btree residency · 4eafdb15
    Joe Thornber authored
    This commit improves the residency of btrees built in the metadata for
    dm-thin and dm-cache.
    
    When inserting a new entry into a full btree node the current code
    splits the node into two.  This can result in very many half full nodes,
    particularly if the insertions are occurring in an ascending order (as
    happens in dm-thin with large writes).
    
    With this commit, when we insert into a full node we first try and move
    some entries to a neighbouring node that has space, failing that it
    tries to split two neighbouring nodes into three.
    
    Results are given below.  'Residency' is how full nodes are on average
    as a percentage.  Average instruction counts for the operations
    are given to show the extra processing has little overhead.
    
                             +--------------------------+--------------------------+
                             |         Before           |         After            |
    +------------+-----------+-----------+--------------+-----------+--------------+
    |    Test    |   Phase   | Residency | Instructions | Residency | Instructions |
    +------------+-----------+-----------+--------------+-----------+--------------+
    | Ascending  | insert    |        50 |         1876 |        96 |         1930 |
    |            | overwrite |        50 |         1789 |        96 |         1746 |
    |            | lookup    |        50 |          778 |        96 |          778 |
    | Descending | insert    |        50 |         3024 |        96 |         3181 |
    |            | overwrite |        50 |         1789 |        96 |         1746 |
    |            | lookup    |        50 |          778 |        96 |          778 |
    | Random     | insert    |        68 |         3800 |        84 |         3736 |
    |            | overwrite |        68 |         4254 |        84 |         3911 |
    |            | lookup    |        68 |          779 |        84 |          779 |
    | Runs       | insert    |        63 |         2546 |        82 |         2815 |
    |            | overwrite |        63 |         2013 |        82 |         1986 |
    |            | lookup    |        63 |          778 |        82 |          779 |
    +------------+-----------+-----------+--------------+-----------+--------------+
    
       Ascending - keys are inserted in ascending order.
       Descending - keys are inserted in descending order.
       Random - keys are inserted in random order.
       Runs - keys are split into ascending runs of ~20 length.  Then
              the runs are shuffled.
    Signed-off-by: default avatarJoe Thornber <ejt@redhat.com>
    Signed-off-by: Colin Ian King <colin.king@canonical.com> # contains_key() fix
    Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
    4eafdb15
dm-btree.c 36.2 KB