Таҳлили TSDB дар Prometheus 2

Таҳлили TSDB дар Prometheus 2

Пойгоҳи силсилаи вақт (TSDB) дар Prometheus 2 намунаи олии ҳалли муҳандисӣ мебошад, ки беҳбудиҳои ҷиддиро нисбат ба нигоҳдории v2 дар Prometheus 1 дар робита ба суръати ҷамъоварии маълумот, иҷрои дархостҳо ва самаранокии захираҳо пешниҳод мекунад. Мо Prometheus 2-ро дар Мониторинг ва Идоракунии Percona (PMM) амалӣ мекардем ва ман имкон доштам, ки кори Prometheus 2 TSDB-ро бифаҳмам. Дар ин мақола ман дар бораи натиҷаҳои ин мушоҳидаҳо сӯҳбат мекунам.

Сарбории миёнаи Prometheus

Барои онҳое, ки бо пойгоҳи додаҳои умумӣ кор мекарданд, сарбории маъмулии Prometheus хеле ҷолиб аст. Суръати ҷамъшавии маълумот одатан устувор аст: одатан хидматҳое, ки шумо назорат мекунед, тақрибан ҳамон миқдори ченакҳоро мефиристанд ва инфрасохтор нисбатан суст тағйир меёбад.
Дархостҳо барои маълумот метавонанд аз сарчашмаҳои гуногун ворид шаванд. Баъзе аз онҳо, ба монанди огоҳиҳо, инчунин барои арзиши устувор ва пешгӯинашаванда кӯшиш мекунанд. Дигарон, ба монанди дархостҳои корбар, метавонанд боиси таркишҳо шаванд, гарчанде ки ин барои аксари сарбориҳои корӣ чунин нест.

Санҷиши боркунӣ

Ҳангоми санҷиш ман ба қобилияти ҷамъ овардани маълумот диққат додам. Ман Prometheus 2.3.2-ро, ки бо Go 1.10.1 тартиб дода шудааст (ҳамчун қисми PMM 1.14) дар хидмати Linode бо истифода аз ин скрипт ҷойгир кардам: StackScript. Барои тавлиди воқеии сарборӣ, бо истифода аз ин StackScript Ман якчанд гиреҳҳои MySQL-ро бо сарбории воқеӣ оғоз кардам (Sysbench TPC-C Test), ки ҳар кадоми онҳо 10 гиреҳи Linux/MySQL-ро тақлид мекарданд.
Ҳама санҷишҳои зерин дар сервери Linode бо ҳашт ядрои виртуалӣ ва 32 ГБ хотира анҷом дода шуданд, ки 20 моделиронии сарбориро назорат мекунанд, ки дусад мисоли MySQL-ро назорат мекунанд. Ё ба истилоҳи Prometheus, 800 ҳадаф, 440 скрепер дар як сония, 380 ҳазор сабт дар як сония ва 1,7 миллион силсилаи вақтҳои фаъол.

лоиҳа

Муносибати маъмулии пойгоҳи додаҳои анъанавӣ, аз ҷумла он, ки Prometheus 1.x истифода кардааст, ба маҳдудияти хотира. Агар барои идора кардани сарборӣ кофӣ набошад, шумо таъхирҳои зиёдро эҳсос хоҳед кард ва баъзе дархостҳо ноком мешаванд. Истифодаи хотира дар Prometheus 2 тавассути калид танзим карда мешавад storage.tsdb.min-block-duration, ки он муайян мекунад, ки сабтҳо пеш аз тоза кардан ба диск чӣ қадар дар хотира нигоҳ дошта мешаванд (пешфарз 2 соат аст). Миқдори хотираи зарурӣ аз шумораи силсилаҳои вақт, тамғакоғазҳо ва скреперҳо, ки ба ҷараёни холиси воридотӣ илова карда шудаанд, вобаста аст. Дар робита ба фазои диск, Prometheus мақсад дорад, ки 3 байт дар як сабт (намуна) истифода барад. Аз тарафи дигар, талаботи хотира хеле баландтар аст.

Гарчанде ки андозаи блокро танзим кардан мумкин аст, тавсия дода намешавад, ки онро дастӣ танзим кунед, бинобар ин шумо маҷбур мешавед, ки ба Prometheus ҳамон қадар хотираро диҳед, ки барои сарбории шумо лозим аст.
Агар барои дастгирии ҷараёни ченакҳои воридшаванда хотираи кофӣ набошад, Прометей аз хотира мемонад ё қотили OOM ба он мерасад.
Илова кардани своп барои таъхири садама ҳангоми тамом шудани хотираи Prometheus воқеан кӯмак намекунад, зеро истифодаи ин функсия боиси истеъмоли таркандаи хотира мегардад. Ман фикр мекунам, ки ин кор бо Go, коллектори партовҳои он ва тарзи кор бо своп аст.
Боз як равиши ҷолиб ин аст, ки блоки сарлавҳаро ба ҷои он ки аз оғози раванд ҳисоб карда шавад, дар вақти муайян ба диск тоза карда шавад.

Таҳлили TSDB дар Prometheus 2

Тавре ки шумо аз график мебинед, оббозӣ ба диск ҳар ду соат рух медиҳад. Агар шумо параметри давомнокии мин-блокро ба як соат иваз кунед, пас ин барқарорсозӣ ҳар соат пас аз ним соат оғоз мешавад.
Агар шумо хоҳед, ки ин ва дигар графикҳоро дар насби Prometheus худ истифода баред, шумо метавонед инро истифода баред панели асбобҳо. Он барои PMM тарҳрезӣ шудааст, аммо бо тағиротҳои хурд, ба ҳама насби Prometheus мувофиқат мекунад.
Мо як блоки фаъол дорем, ки блоки сариро ном дорад, ки дар хотира нигоҳ дошта мешавад; блокҳои дорои маълумоти кӯҳна тавассути дастрас мебошанд mmap(). Ин зарурати танзими кэшро дар алоҳидагӣ аз байн мебарад, аммо инчунин маънои онро дорад, ки шумо бояд барои кэши системаи оператсионӣ фазои кофӣ гузоред, агар шумо хоҳед, ки маълумоти кӯҳнатар аз он чизе ки блоки сарлавҳа ҷойгир карда метавонад, пурсед.
Ин инчунин маънои онро дорад, ки истеъмоли хотираи виртуалии Prometheus хеле баланд хоҳад буд, ки ин чизи ташвишовар нест.

Таҳлили TSDB дар Prometheus 2

Нуқтаи дигари ҷолиби тарроҳӣ истифодаи WAL (write ahead log) мебошад. Тавре ки шумо аз ҳуҷҷатҳои нигоҳдорӣ мебинед, Prometheus WAL-ро барои пешгирӣ кардани садамаҳо истифода мебарад. Механизмҳои мушаххаси кафолати зинда мондани маълумот, мутаассифона, хуб ҳуҷҷатгузорӣ нашудаанд. Версияи Prometheus 2.3.2 WAL-ро ба диск ҳар 10 сония мерезад ва ин хосият танзимшавандаи корбар нест.

Фишорҳо

Prometheus TSDB ба монанди мағозаи LSM (Log Structured Merge) тарҳрезӣ шудааст: блоки сарлавҳа давра ба давра ба диск об карда мешавад, дар ҳоле ки механизми фишурдасозӣ блокҳои сершуморро якҷоя мекунад, то аз скан кардани блокҳои аз ҳад зиёд ҳангоми дархост пешгирӣ карда шавад. Дар ин ҷо шумо метавонед шумораи блокҳоеро бинед, ки ман дар системаи санҷишӣ пас аз як рӯзи сарборӣ мушоҳида кардам.

Таҳлили TSDB дар Prometheus 2

Агар шумо хоҳед, ки дар бораи мағоза маълумоти бештар гиред, шумо метавонед файли meta.json-ро тафтиш кунед, ки дар бораи блокҳои мавҷуда ва чӣ гуна пайдо шудани онҳо маълумот дорад.

{
       "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
}

Пайвастшавӣ дар Prometheus ба вақти ба диск рехтани блоки сар вобаста аст. Дар ин лаҳза, метавонад якчанд чунин амалиёт анҷом дода шавад.

Таҳлили TSDB дар Prometheus 2

Чунин ба назар мерасад, ки фишурдаҳо ба ҳеҷ ваҷҳ маҳдуд нестанд ва метавонанд ҳангоми иҷроиши дискҳои бузурги I/O-ро ба вуҷуд оранд.

Таҳлили TSDB дар Prometheus 2

Афзоиши сарбории CPU

Таҳлили TSDB дар Prometheus 2

Албатта, ин ба суръати система таъсири манфӣ мерасонад ва инчунин барои нигоҳдории LSM мушкилоти ҷиддиро ба миён меорад: чӣ гуна бояд фишурдасозиро барои дастгирии суръати баланди дархост бидуни сарбории зиёд анҷом дод?
Истифодаи хотира дар раванди фишурдасозӣ низ хеле ҷолиб ба назар мерасад.

Таҳлили TSDB дар Prometheus 2

Мо метавонем бубинем, ки чӣ тавр пас аз фишурдашавӣ, аксари хотираҳо ҳолати аз кэшшуда ба Free иваз мешаванд: ин маънои онро дорад, ки иттилооти эҳтимолан арзишманд аз он ҷо хориҷ карда шудааст. Аҷиб аст, ки оё он дар ин ҷо истифода мешавад fadvice() ё ягон техникаи дигари минимизатсия, ё ин аз он сабаб аст, ки кэш аз блокҳои ҳангоми фишурдашуда нобуд карда шудааст?

Барқароршавӣ пас аз нокомӣ

Барқароршавӣ аз нокомиҳо вақтро талаб мекунад ва бо сабаби хуб. Барои ҷараёни воридотии як миллион сабт дар як сония, ман маҷбур будам, ки тақрибан 25 дақиқа интизор шавам, вақте ки барқарорсозӣ бо назардошти диски SSD анҷом дода шуд.

level=info ts=2018-09-13T13:38:14.09650965Z caller=main.go:222 msg="Starting Prometheus" version="(version=2.3.2, branch=v2.3.2, revision=71af5e29e815795e9dd14742ee7725682fa14b7b)"
level=info ts=2018-09-13T13:38:14.096599879Z caller=main.go:223 build_context="(go=go1.10.1, user=Jenkins, date=20180725-08:58:13OURCE)"
level=info ts=2018-09-13T13:38:14.096624109Z caller=main.go:224 host_details="(Linux 4.15.0-32-generic #35-Ubuntu SMP Fri Aug 10 17:58:07 UTC 2018 x86_64 1bee9e9b78cf (none))"
level=info ts=2018-09-13T13:38:14.096641396Z caller=main.go:225 fd_limits="(soft=1048576, hard=1048576)"
level=info ts=2018-09-13T13:38:14.097715256Z caller=web.go:415 component=web msg="Start listening for connections" address=:9090
level=info ts=2018-09-13T13:38:14.097400393Z caller=main.go:533 msg="Starting TSDB ..."
level=info ts=2018-09-13T13:38:14.098718401Z caller=repair.go:39 component=tsdb msg="found healthy block" mint=1536530400000 maxt=1536537600000 ulid=01CQ0FW3ME8Q5W2AN5F9CB7R0R
level=info ts=2018-09-13T13:38:14.100315658Z caller=web.go:467 component=web msg="router prefix" prefix=/prometheus
level=info ts=2018-09-13T13:38:14.101793727Z caller=repair.go:39 component=tsdb msg="found healthy block" mint=1536732000000 maxt=1536753600000 ulid=01CQ78486TNX5QZTBF049PQHSM
level=info ts=2018-09-13T13:38:14.102267346Z caller=repair.go:39 component=tsdb msg="found healthy block" mint=1536537600000 maxt=1536732000000 ulid=01CQ78DE7HSQK0C0F5AZ46YGF0
level=info ts=2018-09-13T13:38:14.102660295Z caller=repair.go:39 component=tsdb msg="found healthy block" mint=1536775200000 maxt=1536782400000 ulid=01CQ7SAT4RM21Y0PT5GNSS146Q
level=info ts=2018-09-13T13:38:14.103075885Z caller=repair.go:39 component=tsdb msg="found healthy block" mint=1536753600000 maxt=1536775200000 ulid=01CQ7SV8WJ3C2W5S3RTAHC2GHB
level=error ts=2018-09-13T14:05:18.208469169Z caller=wal.go:275 component=tsdb msg="WAL corruption detected; truncating" err="unexpected CRC32 checksum d0465484, want 0" file=/opt/prometheus/data/.prom2-data/wal/007357 pos=15504363
level=info ts=2018-09-13T14:05:19.471459777Z caller=main.go:543 msg="TSDB started"
level=info ts=2018-09-13T14:05:19.471604598Z caller=main.go:603 msg="Loading configuration file" filename=/etc/prometheus.yml
level=info ts=2018-09-13T14:05:19.499156711Z caller=main.go:629 msg="Completed loading of configuration file" filename=/etc/prometheus.yml
level=info ts=2018-09-13T14:05:19.499228186Z caller=main.go:502 msg="Server is ready to receive web requests."

Мушкилоти асосии раванди барқарорсозӣ истеъмоли зиёди хотира мебошад. Сарфи назар аз он, ки дар ҳолати муқаррарӣ сервер метавонад бо ҳамон миқдори хотира устувор кор кунад, агар он суқут кунад, он метавонад аз сабаби OOM барқарор нашавад. Ягона роҳи ҳалли ман ин ғайрифаъол кардани ҷамъоварии маълумот, ба кор андохтани сервер, иҷозати барқарор кардани он ва бо фаъол кардани коллексия аз нав оғоз кардан буд.

Гарм шудан

Рафтори дигаре, ки ҳангоми гармкунӣ дар хотир бояд дошт, ин муносибати байни иҷрои паст ва истеъмоли зиёди захираҳо пас аз оғоз мебошад. Дар давоми баъзе, вале на ҳама оғоз, ман як сарбории ҷиддиро дар CPU ва хотира мушоҳида кардам.

Таҳлили TSDB дар Prometheus 2

Таҳлили TSDB дар Prometheus 2

Норасоиҳо дар истифодаи хотира нишон медиҳанд, ки Prometheus наметавонад ҳамаи коллексияҳоро аз аввал танзим кунад ва баъзе маълумотҳо гум мешаванд.
Ман сабабҳои дақиқи CPU ва сарбории хотираро нафаҳмидам. Ман гумон мекунам, ки ин ба эҷоди силсилаи нави вақт дар блоки сар бо басомади баланд вобаста аст.

Афзоиши сарбории CPU

Илова ба фишурдаҳое, ки сарбории хеле баланди I/O-ро ба вуҷуд меоранд, ман дар ҳар ду дақиқа як хӯшаи ҷиддии сарбории CPU мушоҳида кардам. Ҳангоми баланд будани ҷараёни вуруд, таркишҳо дарозтар мешаванд ва ба назар чунин мерасад, ки аз ҷониби коллектори партовҳои Go ба вуҷуд омадааст ва ҳадди аққал баъзе ядроҳо пурра пур карда мешаванд.

Таҳлили TSDB дар Prometheus 2

Таҳлили TSDB дар Prometheus 2

Ин ҷаҳишҳо чандон ночиз нестанд. Чунин ба назар мерасад, ки вақте ки инҳо рух медиҳанд, нуқтаи вуруди дохилии Prometheus ва ченакҳо дастнорас мешаванд, ки боиси холигии маълумот дар ин давраҳо мегардад.

Таҳлили TSDB дар Prometheus 2

Шумо инчунин метавонед аҳамият диҳед, ки содиркунандаи Prometheus барои як сония хомӯш мешавад.

Таҳлили TSDB дар Prometheus 2

Мо метавонем робитаро бо ҷамъоварии ахлот (GC) мушоҳида кунем.

Таҳлили TSDB дар Prometheus 2

хулоса

TSDB дар Prometheus 2 зуд аст, қодир аст миллионҳо силсилаи вақт ва ҳамзамон ҳазорҳо сабтҳоро дар як сония бо истифода аз сахтафзори хеле хоксор. Истифодаи CPU ва диски I/O низ таъсирбахш аст. Мисоли ман то 200 метри дар як сония дар як ядрои истифодашударо нишон дод.

Барои банақшагирии васеъшавӣ, шумо бояд миқдори кофии хотираро дар хотир доред ва ин бояд хотираи воқеӣ бошад. Миқдори хотираи истифодашудае, ки ман мушоҳида кардам, тақрибан 5 ГБ барои 100 000 сабт дар як сонияи ҷараёни воридотӣ буд, ки дар якҷоягӣ бо кэши системаи амалиётӣ тақрибан 8 ГБ хотираи ишғолшударо дод.

Албатта, барои ром кардани хӯшаҳои CPU ва диски I/O кори зиёде бояд анҷом дода шавад ва ин тааҷҷубовар нест, ки бо назардошти он ки чӣ гуна TSDB Prometheus 2 ҷавонро бо InnoDB, TokuDB, RocksDB, WiredTiger муқоиса мекунад, аммо ҳамаи онҳо ба ҳам монанд буданд. мушкилот дар давраи аввали ҳаёти онҳо.

Манбаъ: will.com

Илова Эзоҳ