From 75fad143babf79f0f2841163f03843cf22e988df Mon Sep 17 00:00:00 2001 From: Zoltan Kiss Date: Mon, 7 Jan 2013 22:47:51 +0000 Subject: [PATCH] bond: Change rebalance ratio to be more fair The old algorithm tries to converge to 0, despite it would mean a very unbalanced situation. We're aiming for an ideal ratio of 1, meaning both the 'from' and 'to' slave have the same load. Therefore, we only move an entry if it decreases the load on 'from', and brings us closer to equal traffic load. Signed-off-by: Zoltan Kiss Signed-off-by: Ben Pfaff --- lib/bond.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/bond.c b/lib/bond.c index 62f38c9ae..fe84f9c21 100644 --- a/lib/bond.c +++ b/lib/bond.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "coverage.h" #include "dynamic-string.h" @@ -772,8 +773,12 @@ choose_entry_to_migrate(const struct bond_slave *from, uint64_t to_tx_bytes) delta = e->tx_bytes; old_ratio = (double)from->tx_bytes / to_tx_bytes; new_ratio = (double)(from->tx_bytes - delta) / (to_tx_bytes + delta); - if (old_ratio - new_ratio > 0.1) { - /* Would decrease the ratio, move it. */ + if (old_ratio - new_ratio > 0.1 + && fabs(new_ratio - 1.0) < fabs(old_ratio - 1.0)) { + /* We're aiming for an ideal ratio of 1, meaning both the 'from' + and 'to' slave have the same load. Therefore, we only move an + entry if it decreases the load on 'from', and brings us closer + to equal traffic load. */ return e; } } -- 2.43.0