Bonjour Messieurs,
(je passe en FR et hors ML et je top-poste!!!).
Pierre, je suis déjà en contact avec plusieurs autres Pierre de chez Critéo
(le prénom, c'est un critÚre de recrutement chez vous???)
En tant que "dev" et "mainteneur" du server state, je ne suis pas surpris
pas la lenteur de chargement, par contre l'ampleur de cette lenteur
m'étonne beaucoup.
En fait, c'est un parcours de liste fait à base de strcmp de mémoire, donc
si tu as beaucoup de backend qui eux-même ont beaucoup de serveurs, c'est
en effet pas super optimal.
On avait fait comme ça car on pensait que le serveur state ne serait pas
utilisé "at scale" comme vous le faites.
Pierre: Combien as-tu de backend et de serveur (en moyenne) par backend,
dans une seule et même configuration
Il n'y a qu'un seul moyen de virer tous ces warnings, c'est de forcer l'id
des backend et des serveurs dans ta conf (paramêtre 'id').
(j'ai prévu de passer chez Critéo la semaine prochaine, je te ferais signe,
on pourra voir ton problÚme en live).
Willy: Il me semble que les backends sont déjà stockés dans des ebtree.
Pourrait-on stocker aussi les serveurs dans des ebtrees pour accélerer la
recherche?
Ou mieux, faire un arbre qui avec en point d'entrée "<backend>/<server>" ?
Baptiste
Post by Pierre CheynierHi Willy,
Post by Willy TarreauNot really. Maybe we should see how the state file parser works, because
multiple seconds to parse only 30K lines seems extremely long.
I would even say multiple minutes :)
Post by Willy TarreauI'm just thinking about a few things. Probably that among these 30K
servers,
Post by Willy Tarreaumost of them are in fact tracking other ones ? In this case it could make
sense to have an option to only dump servers which are not tracking
others, as for a reload it can make quite some sense. Is this the case
for you ?
What do you mean by "tracking other ones"?
What I can tell is that, for historical reasons, we named all server the
same way for each backends (ie. srvN) in the configuration template, and
are using "server templates" to add MAINT servers in the pool so that they
can be added at runtime later.
This naming thing can be changed now, but I don't know this issue could be related or not.
* if it requires to delete / update / add server(s) in one or multiple
pools we only use the runtime API and try to reuse free slots.
* if a backend/frontend has to be created / updated / deleted OR if the
free slots for a given backend is full we reload using a configuration
template.
backend be_foo
<options>
{%- for server in servers %}
server srv{{loop.index0}} {{server.address}}:{{server.port}} weight
{{server.weight}}{%- if server.tls %} ssl{%- endif %} check port 8500
{%- endfor %}
# Create 25 free slots, servers are numbered from N to N+25
server-template srv {{ servers|length }}-{{ servers|length + 25 }}
0.0.0.0:0 check disabled
Doing this I noticed that we have a lot of 'bad reconciliations'
[WARNING] can't find server 'srv28' with id '29' in backend with id '9' or name 'be_test'
[WARNING] backend name mismatch: from server state file: 'be_foo', from
running config 'be_bar'
I don't know if these inconsistencies (that clearly have to be fixed) can
cause additional delays.
Thanks,
Pierre