Flux technologique de Qingchuang | Outils observables d'utilisation et de maintenance simples (2) : problèmes courants dans l'application eBPF

Dans le dernier numéro, j'ai discuté avec vous de l'historique du développement et des caractéristiques d'eBPF. Cliquez ici ↓↓↓ Flux technologique de Qingchuang | Outils observables d'utilisation et de maintenance simples (1): Parlez du passé et du présent d'eBPF et passez en revue les passionnants contenu du numéro précédent en un clic.

Ce numéro vous partage principalement les problèmes qui peuvent survenir lors de l'application d'eBPF, en espérant aider des amis qui rencontrent des problèmes similaires. Sans plus tarder, allons droit au but.

1. Adaptabilité du noyau, certaines fonctions de l'ancienne version ne sont pas disponibles

La version minimale requise d'eBPF est Linux 4.1, et la version minimale requise du noyau d'eBPF est Linux 4.1, qui est la version du noyau publiée en 2015. Les noyaux antérieurs à cette version ne prennent pas en charge eBPF.

1. Pour la surveillance avant la version 4.1 de Linux

Pour les versions antérieures à Linux 4.1.0, Qingchuang utilise BPF pour collecter les données HTTP 1 et les requêtes de résolution DNS pour des statistiques observables.

2. Pour la surveillance après la version 4.1 de Linux

Afin d'assurer la portabilité des programmes eBPF entre les différentes versions du noyau Linux, nous utilisons la technologie CORE lors de l'écriture des programmes eBPF. La technologie CORE n'est prise en charge qu'après Linux 4.9.0.

Si la version du noyau de l'utilisateur est inférieure à 4.9.0 ou si CO-RE n'est pas activé dans le noyau, nous pouvons fournir un package de mise à niveau du noyau Linux.

BCC résume la relation entre la version du noyau et la fonction eBPF : https://github.com/iovisor/bcc/blob/master/docs/kernel-versions.md

2. Exigences de sécurité des autorisations

1. Autorisations eBPF

Nécessite des privilèges root ou la capacité CAP_SYS_ADMIN, ce qui signifie que seuls les utilisateurs qui peuvent charger des modules du noyau peuvent charger des programmes eBPF.

2. Sécurité d'exécution eBPF

En termes de sécurité d'exécution, eBPF vérifiera le fichier de bytecode à exécuter via le vérificateur eBPF avant le chargement, y compris, mais sans s'y limiter, les aspects suivants :

  • Le programme ne contient pas de boucle de contrôle

  • Le programme n'exécutera pas plus que le nombre maximum d'instructions autorisé par le noyau

  • Le programme ne contient aucune instruction inaccessible

  • Le programme ne sortira pas des limites du programme

3. La différence entre uprobe et kprobe

1. Analyse des avantages et des inconvénients de kprobe

Avantage:

  • Plus simple à mettre en œuvre et plus facile à entretenir.

  • Ne dépend pas des détails d'implémentation spécifiques d'autres bibliothèques

Désavantages:

  • Les programmes utilisateur peuvent diviser une seule demande en plusieurs appels système, et le réassemblage de ces demandes introduit une certaine complexité

  • Non compatible avec TLS, impossible de décompresser TLS

2. Le pour et le contre de l'uprobe

Avantage:

  • Nous pouvons accéder et capturer le contexte de l'application comme la trace de la pile

  • Nous pouvons créer des uprobes pour capturer les données une fois l'analyse terminée, évitant ainsi la duplication du travail dans le traceur

  • Il est plus facile de capturer les requêtes HTTPS et a une meilleure compatibilité avec TLS

Désavantages:

(1) Sensible à la version de la bibliothèque sous-jacente utilisée. Ne peut pas fonctionner sur des binaires avec des symboles supprimés

(2) Différentes sondes doivent être implémentées pour chaque bibliothèque (chaque langage de programmation peut avoir son propre ensemble de bibliothèques)

(3) Cela entraînera une surcharge de performances d'appel supplémentaire

4. Consommation de performances

Bien que la communauté du noyau ait effectué de nombreux réglages de performances pour eBPF, le suivi des fonctions en mode utilisateur (en particulier les fonctions à haute fréquence telles que les conflits de verrouillage et l'allocation de mémoire) peut encore entraîner une surcharge de performances importante. Par conséquent, lorsque nous utilisons uprobe et kprobe, nous devrions essayer d'éviter de suivre les fonctions à haute fréquence pendant une longue période.

Prenons l'exemple de la surveillance du processus de communication HTTP 1 d'un programme Golang et effectuons un test de stress sur le programme lorsque uprobe et kprobe sont respectivement activés :

Comme le montrent les résultats, si la latence HTTP est supérieure à 1 milliseconde, la surcharge introduite est négligeable et, dans la plupart des cas, uniquement du bruit. Ceci est similaire pour les kprobes et les uprobes, bien que nous analysions toutes les données, les kprobes fonctionnent légèrement mieux. Notez que la surcharge est parfois négative, ce qui est très probablement simplement du bruit dans la mesure. La clé à retenir ici est que si vos gestionnaires HTTP effectuent un travail réel (environ 1 ms de temps de calcul), la surcharge introduite est essentiellement négligeable.

5. Pouvez-vous suivre toutes les fonctions du mode utilisateur/mode noyau (paramètres d'entrée et valeurs de retour des appels)

1. État de l'utilisateur

eBPF peut suivre les paramètres d'entrée et renvoyer les valeurs des appels de fonction spécifiés. Le point de crochet peut être le nom ou l'adresse de la fonction spécifiée. Si les symboles du fichier exécutable sont optimisés, des moyens inverses doivent être utilisés pour localiser l'adresse de la fonction spécifiée.

2. État du noyau

Nous pouvons utiliser bpftrace -l pour comprendre les points d'accroche qui peuvent être accrochés.

bpftrace obtient tous les points traçables de la couche noyau en lisant (le code ci-dessous).

/sys/kernel/debug/tracing/available_filter_functions

6. Y a-t-il un risque de perdre des événements

1. Le déclenchement d'événement de kprobe et uprobe lui-même ne sera pas perdu

kprobe est un mécanisme de sondage du noyau qui permet aux utilisateurs d'insérer du code avant ou après l'exécution de la fonction du noyau. Urobe est un mécanisme de sondage des fonctions de l'espace utilisateur, qui permet aux utilisateurs d'insérer du code à l'entrée ou à la sortie des fonctions de l'espace utilisateur.

eBPF implémente l'observation et le traitement au niveau de l'utilisateur en chargeant une logique de traitement écrite par l'utilisateur dans le noyau et en exécutant cette logique lorsque des événements se produisent. Étant donné que la technologie de machine virtuelle d'eBPF fournit un moyen sûr et isolé d'exécuter du code utilisateur dans le noyau, les événements kprobe et uprobe ne seront pas perdus.

2. bpf_perf_event a le risque de perdre des événements

Le code eBPF dans l'état du noyau écrit les événements collectés dans le tampon en anneau bpf_perf_event, et le programme d'état utilisateur les collecte et les signale. Lorsque les vitesses de lecture et d'écriture ne correspondent pas, les événements sont perdus :

  • La vitesse d'écriture est trop rapide : par exemple, chaque transaction HTTP est écrite dans le tampon en tant qu'événement, ce qui est plus risqué que l'écriture par lots.
  • La vitesse de lecture est trop lente : Par exemple, le code du mode utilisateur ne lit pas le tampon dans un thread dédié, ou la charge système est trop élevée.

3. bpf_map a le risque de perdre des événements

La carte eBPF a une limite de taille. Lorsque la carte est pleine, de nouvelles données ne peuvent pas être écrites

  • Données perdues : étant donné que la carte est pleine, les nouvelles opérations d'écriture ne réussiront pas, ce qui entraînera une perte de données. Cela peut affecter l'exactitude et l'exhaustivité du programme.
  • Dégradation des performances : lorsque la carte est pleine, l'opération d'écriture est bloquée, ce qui entraîne une dégradation des performances du système. Cela affecte le temps de réponse et le débit globaux du système.

écrit à la fin

Alors que eBPF continue de se développer et de croître, nous pouvons voir son grand potentiel dans le monde des réseaux et des systèmes. eBPF s'est avéré être un outil puissant et efficace qui peut être utilisé pour mettre en œuvre diverses fonctions réseau et système avancées.

À l'avenir, nous avons des raisons de croire qu'eBPF continuera à se développer et à être utilisé par de plus en plus de développeurs et d'organisations. Avec l'expansion et l'amélioration continues des fonctions eBPF, nous pouvons nous attendre à l'émergence d'applications réseau et d'outils système plus innovants, faisant ainsi avancer l'ensemble de l'industrie.

En bref, le passé et le présent d'eBPF sont passionnants, il hérite non seulement des avantages de BPF, mais dispose également de fonctions plus puissantes et flexibles. Nous attendons avec impatience de voir eBPF apporter plus d'innovations et d'améliorations aux réseaux et aux systèmes, apportant un soutien plus fort à notre monde numérique.

Interagissons :

Concernant eBPF, qu'aimeriez-vous partager ? Vous pouvez en discuter dans la zone de message ~


Qingchuang Technology, un fournisseur de référence dans le domaine AIOps continuellement recommandé par Gartner. La société se concentre sur l'amélioration des connaissances des entreprises clientes sur les données d'exploitation et de maintenance, la réduction des coûts d'exploitation et de maintenance et l'augmentation de l'efficacité, et reflète pleinement l'influence de l'exploitation et de la maintenance de la technologie sur les opérations commerciales.

Je suppose que tu aimes

Origine blog.csdn.net/qq_37641528/article/details/131919692
conseillé
Classement