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.
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.
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;
}
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;
}
}