From: Willy Tarreau Date: Sat, 17 Oct 2020 17:45:42 +0000 (+0200) Subject: MINOR: lb/first: use a read lock in fas_get_next_server() X-Git-Tag: v2.3-dev8~48 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f76a21f78c2066f74fb04875006e08bc7a9413db;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/src/lb_fas.c b/src/lb_fas.c index 43ff6a5822..e30606507c 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; }