MAJOR: backend: switch the default balancing algo to "random"

For many years, an unset load balancing algorithm would use "roundrobin".
It was shown several times that "random" with at least 2 draws (the
default) generally provides better performance and fairness in that
it will automatically adapt to the server's load and capacity. This
was further described with numbers in this discussion:

  https://www.mail-archive.com/haproxy@formilux.org/msg46011.html
  https://github.com/orgs/haproxy/discussions/3042

BTW there were no objection and only support for the change.

The goal of this patch is to change the default algo when none is
specified, from "roundrobin" to "random". This way, users who don't
care and don't set the load balancing algorithm will benefit from a
better one in most cases, while those who have good reasons to prefer
roundrobin (for session affinity or for reproducible sequences like used
in regtests) can continue to specify it.

The vast majority of users should not notice a difference.
This commit is contained in:
Willy Tarreau 2025-09-04 08:23:30 +02:00
parent 60931ceae9
commit 93cc18ac42
3 changed files with 5 additions and 5 deletions

View File

@ -6010,7 +6010,7 @@ balance url_param <param> [check_post]
algorithms. Right now, only "url_param", "uri" and "log-hash"
support an optional argument.
The load balancing algorithm of a backend is set to roundrobin when no other
The load balancing algorithm of a backend is set to "random" when no other
algorithm, mode nor option have been set. The algorithm may only be set once
for each backend.

View File

@ -3018,9 +3018,9 @@ const char *backend_lb_algo_str(int algo) {
int backend_parse_balance(const char **args, char **err, struct proxy *curproxy)
{
if (!*(args[0])) {
/* if no option is set, use round-robin by default */
/* if no option is set, use random by default */
curproxy->lbprm.algo &= ~BE_LB_ALGO;
curproxy->lbprm.algo |= BE_LB_ALGO_RR;
curproxy->lbprm.algo |= BE_LB_ALGO_RND;
return 0;
}

View File

@ -3064,10 +3064,10 @@ init_proxies_list_stage1:
else if (!(curproxy->options & (PR_O_TRANSP | PR_O_DISPATCH))) {
/* If no LB algo is set in a backend, and we're not in
* transparent mode, dispatch mode nor proxy mode, we
* want to use balance roundrobin by default.
* want to use balance random by default.
*/
curproxy->lbprm.algo &= ~BE_LB_ALGO;
curproxy->lbprm.algo |= BE_LB_ALGO_RR;
curproxy->lbprm.algo |= BE_LB_ALGO_RND;
}
}