Tech

Exploiter eBPF pour améliorer l’observabilité de l’infrastructure

Pour étudier efficacement et de manière efficiente les performances d’un système multi-locataire, Netflix a expérimenté eBPF pour instrumenter le noyau Linux pour recueillir des informations continues et plus approfondies sur la manière dont les processus sont planifiés et détecter les « voisins bruyants ».

Grâce à eBPF, les équipes d’ingénierie de calcul et de performance de Netflix ont cherché à contourner quelques problèmes qui rendent généralement difficile la détection des voisins bruyants. Il s’agit notamment de la surcharge introduite par des outils d’analyse tels que performancesce qui implique également qu’ils ne sont généralement déployés qu’une fois le problème survenu et le niveau d’expertise des ingénieurs requis. Ce que eBPF permet, selon les ingénieurs de Netflix, c’est d’observer l’infrastructure de calcul avec un faible impact sur les performances pour obtenir une instrumentation continue du planificateur Linux.

La mesure clé identifiée par les ingénieurs de Netflix comme un indicateur de problèmes de performances possibles causés par des voisins bruyants est la latence du processus :

Pour garantir la fiabilité de nos charges de travail qui dépendent de réponses à faible latence, nous avons instrumenté la latence de la file d’attente d’exécution pour chaque conteneur, qui mesure le temps que les processus passent dans la file d’attente de planification avant d’être envoyés au processeur.

Pour cela, ils ont utilisé trois hooks eBPF : sched_wakeup, sched_wakeup_newet sched_switchLes deux premiers sont invoqués lorsqu’un processus passe de « sommeil » à « exécutable », c’est-à-dire lorsqu’il est prêt à s’exécuter et attend du temps CPU. sched_switch Le hook est déclenché lorsque le processeur est affecté à un autre processus. La latence du processus est ainsi calculée en soustrayant l’horodatage au moment où le processeur est affecté au processus et le moment où il est prêt à s’exécuter pour la première fois.

Enfin, les événements collectés par l’instrumentation du noyau sont traités dans un programme Go pour émettre des métriques vers Atlas, le backend des métriques de Netflix. Pour transmettre les données collectées au programme Go de l’espace utilisateur, les ingénieurs de Netflix ont décidé d’utiliser Tampons en anneau eBPFqui fournissent un mécanisme efficace, performant et convivial qui ne nécessite pas de copie de mémoire supplémentaire ni d’appels système.

Outre les informations de synchronisation, eBPF permet également de collecter des informations supplémentaires sur le processus, notamment cgroup ID qui l’associe à un conteneur, ce qui est essentiel pour interpréter correctement la préemption. En effet, détecter des voisins bruyants n’est pas seulement une question de mesure de latence, car cela nécessite également de suivre la fréquence à laquelle un processus est préempté et quel processus a provoqué la préemption, qu’il s’exécute dans le même conteneur ou non.

Par exemple, si un conteneur atteint ou dépasse sa limite de CPU cgroup, le planificateur le limitera, ce qui entraînera une augmentation apparente de la latence de la file d’attente d’exécution en raison des retards dans la file d’attente. Si nous devions uniquement prendre en compte cette mesure, nous pourrions attribuer à tort la dégradation des performances aux voisins bruyants alors qu’en réalité, c’est parce que le conteneur atteint son quota de CPU.

Pour s’assurer que leur approche n’entrave pas les performances du système surveillé, les ingénieurs de Netflix ont également créé un outil pour mesurer la surcharge du code eBPF, bpftop. Grâce à cet outil, ils ont pu identifier plusieurs optimisations pour réduire encore davantage la surcharge initiale, en la maintenant en dessous du seuil de 600 nanosecondes pour chaque sched_* hook. Cela permet d’exécuter les hooks en permanence sans craindre qu’ils aient un impact sur les performances du système.

Si vous êtes intéressé par cette approche de surveillance des performances du système ou si vous souhaitez mieux comprendre le fonctionnement interne d’eBPF, l’article original fournit beaucoup plus de détails que ce qui peut être couvert ici, y compris un exemple de code utile.



Source link