Analyse TSDB dans Prometheus 2

Analyse TSDB dans Prometheus 2

La base de donnĂ©es de sĂ©ries chronologiques (TSDB, time series database) dans Prometheus 2 est un excellent exemple de solution d'ingĂ©nierie qui offre des amĂ©liorations significatives par rapport au stockage v2 de Prometheus 1 en termes de vitesse d'accumulation des donnĂ©es et d'exĂ©cution des requĂȘtes, ainsi que d'efficacitĂ© des ressources. Nous avons intĂ©grĂ© Prometheus 2 dans Percona Monitoring and Management (PMM), et j'ai eu l'occasion d'examiner la performance de la TSDB de Prometheus 2. Dans cet article, je vais partager les rĂ©sultats de ces observations.

Charge de travail moyenne de Prometheus

Pour ceux qui ont l'habitude de travailler avec des bases de données à usages généraux, la charge de travail typique de Prometheus est plutÎt curieuse. La vitesse d'accumulation des données tend vers une valeur stable : généralement, les services que vous surveillez envoient un nombre similaire de métriques, et l'infrastructure change relativement lentement.
Les requĂȘtes d'information peuvent provenir de diffĂ©rentes sources. Certaines d'entre elles, comme les alertes, tendent Ă©galement vers une valeur stable et prĂ©visible. D'autres, comme les requĂȘtes utilisateur, peuvent provoquer des pics, bien que cela ne soit pas caractĂ©ristique de la majeure partie de la charge.

Test de charge

Lors des tests, je me suis concentrĂ© sur la capacitĂ© d'accumulation des donnĂ©es. J'ai dĂ©ployĂ© Prometheus 2.3.2, compilĂ© avec Go 1.10.1 (dans le cadre de PMM 1.14) sur le service Linode, en utilisant ce script : StackScript. Pour gĂ©nĂ©rer une charge aussi rĂ©aliste que possible, grĂące Ă  ce StackScript , j'ai lancĂ© plusieurs nƓuds MySQL avec une charge rĂ©elle (test Sysbench TPC-C), chacun Ă©mulant 10 nƓuds Linux/MySQL.
Tous les tests ci-dessous ont Ă©tĂ© effectuĂ©s sur un serveur Linode avec huit cƓurs virtuels et 32 Go de RAM, oĂč 20 simulations de charge surveillant deux cents instances MySQL Ă©taient en cours d'exĂ©cution. Ou, en termes de Prometheus, 800 cibles (targets), 440 collectes (scrapes) par seconde, 380 000 enregistrements (samples) par seconde et 1,7 million de sĂ©ries chronologiques actives.

Design

L'approche standard des bases de donnĂ©es traditionnelles, y compris celle utilisĂ©e par Prometheus 1.x, consiste en un limite de mĂ©moire. Si elle est insuffisante pour supporter la charge, vous rencontrerez de grandes latences, et certaines requĂȘtes ne seront pas exĂ©cutĂ©es. L'utilisation de la mĂ©moire dans Prometheus 2 est configurĂ©e via la clĂ© storage.tsdb.min-block-duration, qui dĂ©termine combien de temps les enregistrements seront conservĂ©s en mĂ©moire avant d'ĂȘtre Ă©crasĂ©s sur le disque (par dĂ©faut, cela dure 2 heures). La quantitĂ© de mĂ©moire requise dĂ©pendra du nombre de sĂ©ries temporelles, d'Ă©tiquettes (labels) et de l'intensitĂ© de la collecte des donnĂ©es (scrapes) en plus du flux entrant brut. En ce qui concerne l'espace disque, Prometheus vise Ă  utiliser 3 octets par enregistrement (sample). D'un autre cĂŽtĂ©, les exigences en matiĂšre de mĂ©moire sont bien plus Ă©levĂ©es.

Bien que la possibilité de configurer la taille de bloc existe, il n'est pas recommandé de le faire manuellement, vous vous retrouvez donc face à la nécessité de donner à Prometheus autant de mémoire qu'il en demande pour votre charge.
Si la mémoire disponible n'est pas suffisante pour maintenir le flux entrant de métriques, Prometheus rencontrera une panne due à un manque de mémoire ou sera tué par le OOM killer.
Ajouter un swap pour retarder le moment de l'échec lorsque Prometheus manque de mémoire n'aide pas vraiment, car l'utilisation de cette fonctionnalité entraßne une consommation de mémoire explosive. Je pense que cela est dû à Go, à son ramasse-miettes et à la façon dont il fonctionne avec le swap.
Une autre approche intéressante consiste à configurer le vidage du head block sur le disque à des moments précis, plutÎt que de le chronométrer à partir du démarrage du processus.

Analyse TSDB dans Prometheus 2

Comme vous pouvez le voir sur le graphique, les vidages sur le disque se produisent toutes les deux heures. Si vous modifiez le paramĂštre min-block-duration Ă  une heure, ces vidages se produiront chaque heure, Ă  commencer d'ici trente minutes.
Si vous souhaitez utiliser ce graphique et d'autres dans votre installation de Prometheus, vous pouvez utiliser ce tableau de bord. Il a été conçu pour PMM, mais avec quelques modifications, il convient à toute installation de Prometheus.
Nous avons un bloc actif, appelé head block, qui est conservé en mémoire ; les blocs contenant des données plus anciennes sont accessibles via mmap(). Cela élimine le besoin de configurer le cache séparément, mais cela signifie également que vous devez laisser suffisamment d'espace pour le cache du systÚme d'exploitation si vous souhaitez interroger des données plus anciennes que celles contenues dans le head block.
Et cela signifie aussi que la consommation de mémoire virtuelle de Prometheus semblera assez élevée, mais il n'y a pas lieu de s'en inquiéter.

Analyse TSDB dans Prometheus 2

Un autre aspect intéressant du design est l'utilisation de WAL (write ahead log). Comme indiqué dans la documentation du stockage, Prometheus utilise WAL pour éviter des pertes en cas de plantages. Malheureusement, les mécanismes spécifiques garantissant la durabilité des données ne sont pas suffisamment documentés. La version 2.3.2 de Prometheus écrit le WAL sur le disque toutes les 10 secondes, et ce paramÚtre n'est pas configurable par l'utilisateur.

Compactions

La TSDB de Prometheus est conçue Ă  l'image d'un stockage LSM (Log Structured Merge - arbre structurĂ© en journaux avec fusion) : le bloc principal est pĂ©riodiquement Ă©crit sur le disque, tandis que le mĂ©canisme de compaction fusionne plusieurs blocs pour Ă©viter de scanner trop de blocs lors des requĂȘtes. Voici le nombre de blocs que j'ai observĂ© sur le systĂšme de test aprĂšs 24 heures de charge.

Analyse TSDB dans Prometheus 2

Si vous souhaitez en savoir plus sur le stockage, vous pouvez examiner le fichier meta.json, qui contient des informations sur les blocs existants et sur leur provenance.

{
       "ulid": "01CPZDPD1D9R019JS87TPV5MPE",
       "minTime": 1536472800000,
       "maxTime": 1536494400000,
       "stats": {
               "numSamples": 8292128378,
               "numSeries": 1673622,
               "numChunks": 69528220
       },
       "compaction": {
               "level": 2,
               "sources": [
                       "01CPYRY9MS465Y5ETM3SXFBV7X",
                       "01CPYZT0WRJ1JB1P0DP80VY5KJ",
                       "01CPZ6NR4Q3PDP3E57HEH760XS"
               ],
               "parents": [
                       {
                               "ulid": "01CPYRY9MS465Y5ETM3SXFBV7X",
                               "minTime": 1536472800000,
                               "maxTime": 1536480000000
                       },
                       {
                               "ulid": "01CPYZT0WRJ1JB1P0DP80VY5KJ",
                               "minTime": 1536480000000,
                               "maxTime": 1536487200000
                       },
                       {
                               "ulid": "01CPZ6NR4Q3PDP3E57HEH760XS",
                               "minTime": 1536487200000,
                               "maxTime": 1536494400000
                       }
               ]
       },
       "version": 1
}

Les compactions dans Prometheus sont liĂ©es au temps d'Ă©criture du bloc principal sur le disque. À ce moment-lĂ , plusieurs de ces opĂ©rations peuvent ĂȘtre effectuĂ©es.

Analyse TSDB dans Prometheus 2

Apparemment, le compactage n'est pas du tout limité et peut entraßner de grandes fluctuations de l'I/O disque pendant l'exécution.

Analyse TSDB dans Prometheus 2

Fluctuations de charge CPU

Analyse TSDB dans Prometheus 2

Cela a bien sĂ»r un impact assez nĂ©gatif sur la vitesse du systĂšme et reprĂ©sente un dĂ©fi sĂ©rieux pour les stockages LSM : comment effectuer des compactages pour maintenir une vitesse de requĂȘte Ă©levĂ©e sans gĂ©nĂ©rer trop de surcharge ?
L'utilisation de la mémoire pendant les compactages semble également assez intéressante.

Analyse TSDB dans Prometheus 2

Nous pouvons voir qu'aprÚs le compactage, la plupart de la mémoire passe de l'état Cached à Free : cela signifie que des informations potentiellement précieuses ont été retirées de là. Il est intéressant de savoir si cela utilise fadvice() ou une autre technique de minimisation, ou si cela est dû au fait que le cache a été libéré des blocs détruits lors du compactage ?

Récupération aprÚs sinistre

La rĂ©cupĂ©ration aprĂšs sinistre prend du temps, et cela se justifie. Pour un flux entrant d'un million d'enregistrements par seconde, j'ai dĂ» attendre environ 25 minutes pour que la rĂ©cupĂ©ration soit effectuĂ©e, mĂȘme avec un disque SSD.

niveau=info ts=2018-09-13T13:38:14.09650965Z appelant=main.go:222 msg="Démarrage de Prometheus" version="(version=2.3.2, branche=v2.3.2, révision=71af5e29e815795e9dd14742ee7725682fa14b7b)"
niveau=info ts=2018-09-13T13:38:14.096599879Z appelant=main.go:223 build_context="(go=go1.10.1, utilisateur=Jenkins, date=20180725-08:58:13OURCE)"
niveau=info ts=2018-09-13T13:38:14.096624109Z appelant=main.go:224 host_details="(Linux 4.15.0-32-generic #35-Ubuntu SMP Ven AoĂ» 10 17:58:07 UTC 2018 x86_64 1bee9e9b78cf (aucun))"
niveau=info ts=2018-09-13T13:38:14.096641396Z appelant=main.go:225 fd_limits="(soft=1048576, hard=1048576)"
niveau=info ts=2018-09-13T13:38:14.097715256Z appelant=web.go:415 composant=web msg="Début de l'écoute des connexions" adresse=:9090
niveau=info ts=2018-09-13T13:38:14.097400393Z appelant=main.go:533 msg="Démarrage de TSDB ..."
niveau=info ts=2018-09-13T13:38:14.098718401Z appelant=repair.go:39 composant=tsdb msg="bloc sain trouvé" mint=1536530400000 maxt=1536537600000 ulid=01CQ0FW3ME8Q5W2AN5F9CB7R0R
niveau=info ts=2018-09-13T13:38:14.100315658Z appelant=web.go:467 composant=web msg="préfixe du routeur" préfixe=\/prometheus
niveau=info ts=2018-09-13T13:38:14.101793727Z appelant=repair.go:39 composant=tsdb msg="bloc sain trouvé" mint=1536732000000 maxt=1536753600000 ulid=01CQ78486TNX5QZTBF049PQHSM
niveau=info ts=2018-09-13T13:38:14.102267346Z appelant=repair.go:39 composant=tsdb msg="bloc sain trouvé" mint=1536537600000 maxt=1536732000000 ulid=01CQ78DE7HSQK0C0F5AZ46YGF0
niveau=info ts=2018-09-13T13:38:14.102660295Z appelant=repair.go:39 composant=tsdb msg="bloc sain trouvé" mint=1536775200000 maxt=1536782400000 ulid=01CQ7SAT4RM21Y0PT5GNSS146Q
niveau=info ts=2018-09-13T13:38:14.103075885Z appelant=repair.go:39 composant=tsdb msg="bloc sain trouvé" mint=1536753600000 maxt=1536775200000 ulid=01CQ7SV8WJ3C2W5S3RTAHC2GHB
niveau=erreur ts=2018-09-13T14:05:18.208469169Z appelant=wal.go:275 composant=tsdb msg="Corruption de WAL détectée ; troncature" err="checksum CRC32 inattendu d0465484, voulu 0" fichier=\/opt\/prometheus\/data\/ .prom2-data\/wal\/007357 pos=15504363
niveau=info ts=2018-09-13T14:05:19.471459777Z appelant=main.go:543 msg="TSDB démarré"
niveau=info ts=2018-09-13T14:05:19.471604598Z appelant=main.go:603 msg="Chargement du fichier de configuration" filename=\/etc\/prometheus.yml
niveau=info ts=2018-09-13T14:05:19.499156711Z appelant=main.go:629 msg="Chargement complet du fichier de configuration" filename=\/etc\/prometheus.yml
niveau=info ts=2018-09-13T14:05:19.499228186Z appelant=main.go:502 msg="Le serveur est prĂȘt Ă  recevoir des requĂȘtes web."

Le principal problĂšme du processus de rĂ©cupĂ©ration est la forte consommation de mĂ©moire. Bien que dans une situation normale, le serveur puisse fonctionner de maniĂšre stable avec la mĂȘme quantitĂ© de mĂ©moire, lors d'un crash, il peut ne pas redĂ©marrer en raison de l'OOM. La seule solution que j'ai trouvĂ©e est de dĂ©sactiver la collecte de donnĂ©es, de relancer le serveur, de lui permettre de se rĂ©tablir et de le redĂ©marrer avec la collecte activĂ©e.

Chauffage

Un autre comportement à garder à l'esprit pendant le chauffage est le rapport entre une faible performance et une forte consommation de ressources juste aprÚs le démarrage. Lors de certains démarrages, mais pas tous, j'ai observé une charge CPU et mémoire significative.

Analyse TSDB dans Prometheus 2

Analyse TSDB dans Prometheus 2

Des chutes dans l'utilisation de la mémoire indiquent que Prometheus ne peut pas configurer toutes les collectes dÚs le départ et certaines informations sont perdues.
Je n'ai pas déterminé les raisons exactes de la charge élevée sur le processeur et la mémoire. Je soupçonne que cela soit lié à la création de nouvelles séries temporelles dans le bloc principal à une fréquence élevée.

Sauts de charge sur le CPU

En plus des compressions qui gĂ©nĂšrent une charge I/O relativement Ă©levĂ©e, j'ai remarquĂ© des pics de charge sur le processeur toutes les deux minutes. Les pics durent plus longtemps avec un flux entrant Ă©levĂ© et il semble qu'ils soient causĂ©s par le ramasse-miettes Go, au moins certains cƓurs sont complĂštement chargĂ©s.

Analyse TSDB dans Prometheus 2

Analyse TSDB dans Prometheus 2

Ces sauts ne sont pas si insignifiants. Il semble que lorsqu'ils surviennent, le point d'entrĂ©e interne et les mĂ©triques Prometheus deviennent indisponibles, ce qui entraĂźne des pertes de donnĂ©es durant ces mĂȘmes intervalles.

Analyse TSDB dans Prometheus 2

On peut également noter que l'exportateur Prometheus se fige pendant une seconde.

Analyse TSDB dans Prometheus 2

Nous pouvons observer des corrélations avec le ramassage de déchets (GC).

Analyse TSDB dans Prometheus 2

Conclusion

La TSDB dans Prometheus 2 fonctionne rapidement, capable de gĂ©rer des millions de sĂ©ries temporelles tout en traitant des milliers d'Ă©critures par seconde, le tout avec un matĂ©riel assez modeste. L'utilisation du CPU et de l'I/O disque est Ă©galement impressionnante. Mon exemple a montrĂ© jusqu'Ă  200 000 mĂ©triques par seconde sur un seul cƓur utilisĂ©.

Pour planifier une extension, il faut garder Ă  l'esprit des volumes de mĂ©moire suffisants, et cela doit ĂȘtre de la mĂ©moire rĂ©elle. Le volume de mĂ©moire utilisĂ©e que j'ai observĂ© Ă©tait d'environ 5 Go pour 100 000 Ă©critures par seconde de flux entrant, ce qui totalisait environ 8 Go de mĂ©moire occupĂ©e avec le cache du systĂšme d'exploitation.

Évidemment, un travail consĂ©quent reste Ă  faire pour maĂźtriser les pics de CPU et d'I/O disque, et cela n'est pas surprenant, Ă©tant donnĂ© Ă  quel point la TSDB Prometheus 2 est encore jeune par rapport Ă  InnoDB, TokuDB, RocksDB, WiredTiger, mais ils ont tous rencontrĂ© des problĂšmes similaires au dĂ©but de leur cycle de vie.

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster