Des lenteurs avec l’agent metadata de Neutron
Début de l’année, un des environnements de production OpenStack a été confronté à des problèmes critiques de performance, en particulier en ce qui concerne la base de données. Cette surconsommation des ressources de la base de données a été identifiée comme étant principalement causée par le service metadata de Neutron.
Dans des scénarios à haute charge, le service metadata peut devenir un goulot d’étranglement, augmentant considérablement la latence et l’utilisation des ressources de la base de données. Ce phénomène peut avoir un impact sur l’ensemble de l’infrastructure OpenStack, provoquant des ralentissements et affectant la qualité de service.
Lors du dernier PTG d’OpenStack, cette question a fait l’objet de discussions lors de la session intitulée “Challenges & Lessons from Operating OpenStack at Scale”. Suite à ces discussions et aux expériences partagées par différents opérateurs, un bug (bug/2024581) a été ouvert sur Launchpad. Ce fut une opportunité de partager notre solution et retours d’expérience sur l’usage de memcached.
Under the hood
L’agent metadata est installé sur les noeuds computes et agit comme un intermédiaire entre la machine virtuelle voulant récupérer ses informations de démarrage (voir cloudinit) et le service Nova.
En effet Nova ayant pour autant toutes ses informations, n’a aucun moyen d’identifier la machine virtuelle.
Ainsi quand une instance virtuelle est en cours de démarrage, elle
envoie une requête HTTP vers le service de metadata de Neutron situé à
l’adresse IP 169.254.169.254
. Neutron est capable d’identifier
quelle instance a émis la requête. Il le fait en examinant l’IP source
sur le bridge réseau auquel la requête est arrivée. Il peut ainsi
envoyer une requête en base de donnees et retrouver le port associe. A
partir du port, il en Neutron récupère l’UUID de l’instance
correspondante.
La requête est ensuite redirigée vers l’agent metadata de Nova. L’UUID de l’instance est ajouté dans les en-têtes HTTP de la requête, ce qui permet à Nova de récupérer les informations spécifiques à cette instance.
Des scans trop fréquents
Dans des environnements de production hautement chargés, le service metadata de Neutron peut connaître des problèmes de performance. En effet le scan sur la liste de ports devient de plus en plus lourd.
Memcached semble être la solution
L’utilisation de oslo.cache
avec Memcached. Le service de metatada
offre la possibilité de configurer un serveur de cache. Sachant que
les metadata pour une machine virtuelle donnee ne changent que tres
rarement, l’impact peut-être significatif.
Voici un exemple de configuration d’oslo.cache
avec Memcached:
[cache]
backend = oslo_cache.memcache_pool
enabled = True
memcache_servers = ...
expiration_time = 300
memcache_pool_maxsize = 20
L’utilisation de Memcached via la bibliothèque oslo.cache
a eu un
impact significatif sur la réduction de la charge sur notre base de
données. Cette optimisation a conduit à une amélioration des
performances générales de notre infrastructure.
Il est à noter que non seulement cette solution a bénéficié à notre propre environnement, mais elle a également été validée par la communauté.
Un patch a été proposé. Ce patch modifie la documentation officielle de Neutron et recommande désormais l’utilisation d’un mécanisme de mise en cache pour optimiser le service metadata.