From f76a21f78c2066f74fb04875006e08bc7a9413db Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sat, 17 Oct 2020 19:45:42 +0200 Subject: [PATCH] MINOR: lb/first: use a read lock in fas_get_next_server() The "first" algorithm creates a lot of contention because all threads focus on the same server by definition (the first available one). By turning the exclusive lock to a read lock in fas_get_next_server(), the request rate increases by 16% for 8 threads when many servers are getting close to their maxconn. --- src/lb_fas.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lb_fas.c b/src/lb_fas.c index 43ff6a582..e30606507 100644 --- a/src/lb_fas.c +++ b/src/lb_fas.c @@ -300,7 +300,7 @@ struct server *fas_get_next_server(struct proxy *p, struct server *srvtoavoid) srv = avoided = NULL; - HA_RWLOCK_WRLOCK(LBPRM_LOCK, &p->lbprm.lock); + HA_RWLOCK_RDLOCK(LBPRM_LOCK, &p->lbprm.lock); if (p->srv_act) node = eb32_first(&p->lbprm.fas.act); else if (p->lbprm.fbck) { @@ -336,7 +336,7 @@ struct server *fas_get_next_server(struct proxy *p, struct server *srvtoavoid) if (!srv) srv = avoided; out: - HA_RWLOCK_WRUNLOCK(LBPRM_LOCK, &p->lbprm.lock); + HA_RWLOCK_RDUNLOCK(LBPRM_LOCK, &p->lbprm.lock); return srv; }