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.
This commit is contained in:
Willy Tarreau 2020-10-17 19:45:42 +02:00
parent 58bc9c1ced
commit f76a21f78c

View File

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