Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Ман ба шумо тавсия медиҳам, ки стенограммаи гузориши охири соли 2019 аз ҷониби Александр Валялкин "Го оптимизатсия дар VictoriaMetrics" -ро хонед.

VictoriaMetrics — як МДМ зуд ва миқёспазир барои нигоҳдорӣ ва коркарди маълумот дар шакли силсилаи вақт (қайдкунӣ вақт ва маҷмӯи арзишҳои ба ин вақт мувофиқро ташкил медиҳад, масалан, тавассути пурсиши даврии ҳолати сенсорҳо ё ҷамъоварии ченакҳо).

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Ин аст пайванд ба видеои ин гузориш - https://youtu.be/MZ5P21j_HLE

Слайдҳо

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Дар бораи худ ба мо бигӯед. Ман Александр Валялкин ҳастам. Ин ҷо ҳисоби GitHub ман. Ман дар бораи Go ва оптимизатсияи иҷроиш дилчасп ҳастам. Ман бисёр китобхонаҳои муфид ва на он қадар муфид навиштам. Онҳо бо яке аз онҳо оғоз мекунанд fast, ё бо quick префикс.

Ман ҳоло дар VictoriaMetrics кор мекунам. Ин чист ва ман дар он ҷо чӣ кор мекунам? Ман дар ин презентатсия дар ин бора сӯҳбат мекунам.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Шарҳи гузориш чунин аст:

  • Аввалан, ман ба шумо мегӯям, ки VictoriaMetrics чист.
  • Он гоҳ ман ба шумо мегӯям, ки силсилаи вақт чист.
  • Пас ман ба шумо мегӯям, ки пойгоҳи додаҳои силсилаи вақт чӣ гуна кор мекунад.
  • Минбаъд, ман ба шумо дар бораи меъмории пойгоҳи додаҳо мегӯям: он аз чӣ иборат аст.
  • Ва он гоҳ биёед ба оптимизатсияҳое, ки VictoriaMetrics дорад, гузарем. Ин як оптимизатсия барои индекси инвертсионалӣ ва оптимизатсия барои татбиқи bitset дар Go мебошад.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Оё касе аз тамошобинон медонад, ки VictoriaMetrics чист? Вой, бисёриҳо аллакай медонанд. Ин хабари хуш аст. Барои онҳое, ки намедонанд, ин пойгоҳи додаҳои силсилаи вақт аст. Он ба меъмории ClickHouse, ба баъзе тафсилоти татбиқи ClickHouse асос ёфтааст. Масалан, дар мисоли: MergeTree, ҳисобкунии мувозӣ дар ҳамаи ядроҳои дастраси протсессори ва оптимизатсияи кор тавассути кор дар блокҳои додаҳо, ки дар кэши протсессор ҷойгир шудаанд.

VictoriaMetrics фишурдани маълумотро нисбат ба дигар пойгоҳи додаҳои силсилаи вақт таъмин мекунад.

Он миқёси амудӣ - яъне, шумо метавонед протсессори бештар, RAM бештар дар як компютер илова кунед. VictoriaMetrics ин захираҳои мавҷударо бомуваффақият истифода мебарад ва ҳосилнокии хатиро беҳтар мекунад.

VictoriaMetrics инчунин ба таври уфуқӣ миқёс мекунад - яъне шумо метавонед гиреҳҳои иловагиро ба кластери VictoriaMetrics илова кунед ва иҷрои он тақрибан ба таври хаттӣ афзоиш хоҳад ёфт.

Тавре ки шумо тахмин кардед, VictoriaMetrics пойгоҳи додаҳои зуд аст, зеро ман наметавонам дигаронро нависам. Ва он дар Go навишта шудааст, бинобар ин ман дар ин вохӯрӣ дар ин бора сӯҳбат мекунам.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Кӣ медонад, ки силсилаи вақт чист? Вай инчунин бисьёр одамонро мешиносад. Силсилаи вақт як қатор ҷуфтҳо мебошад (timestamp, значение), ки ин ҷуфтҳо аз рӯи вақт ҷудо карда мешаванд. Арзиш рақами нуқтаи шинокунанда аст - float64.

Ҳар як силсилаи вақт бо як калид ба таври беназир муайян карда мешавад. Ин калид аз чӣ иборат аст? Он аз маҷмӯи холии ҷуфтҳои калидӣ-арзиш иборат аст.

Дар ин ҷо як мисоли силсилаи вақт аст. Калиди ин силсила рӯйхати ҷуфтҳост: __name__="cpu_usage" номи метрика аст, instance="my-server" - ин компютерест, ки дар он ин метрика ҷамъоварӣ карда мешавад, datacenter="us-east" - ин маркази маълумотест, ки дар он компютер ҷойгир аст.

Мо бо номи силсилаи вақт, ки аз се ҷуфти калид-арзиш иборат буд, ба анҷом расид. Ин калид ба рӯйхати ҷуфтҳо мувофиқат мекунад (timestamp, value). t1, t3, t3, ..., tN - инҳо тамғаҳои вақт мебошанд, 10, 20, 12, ..., 15 - арзишҳои мувофиқ. Ин истифодаи CPU дар вақти муайян барои сатри додашуда аст.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Силсилаи вақтро дар куҷо истифода бурдан мумкин аст? Оё касе чизе дорад?

  • Дар DevOps шумо метавонед CPU, RAM, шабака, rps, шумораи хатогиҳо ва ғайраҳоро чен кунед.
  • IoT - мо метавонем ҳарорат, фишор, координатаҳои гео ва чизи дигарро чен кунем.
  • Инчунин маблағгузорӣ - мо метавонем нархҳоро барои ҳама намуди саҳмияҳо ва асъорҳо назорат кунем.
  • Илова бар ин, силсилаи вақт метавонад дар мониторинги равандҳои истеҳсолӣ дар корхонаҳо истифода шавад. Мо корбароне дорем, ки VictoriaMetrics-ро барои назорат кардани турбинаҳои бодӣ барои роботҳо истифода мебаранд.
  • Силсилаи вақт инчунин барои ҷамъоварии маълумот аз сенсорҳои дастгоҳҳои гуногун муфид аст. Масалан, барои муҳаррик; барои чен кардани фишори шина; барои чен кардани суръат, масофа; барои чен кардани сарфи бензин ва гайра.
  • Силсилаи вақт инчунин метавонад барои назорати ҳавопаймо истифода шавад. Ҳар як ҳавопаймо як қуттии сиёҳ дорад, ки силсилаи вақтро барои параметрҳои гуногуни саломатии ҳавопаймо ҷамъ мекунад. Силсилаҳои вақт инчунин дар саноати аэрокосмосӣ истифода мешаванд.
  • Нигоҳубини саломатӣ фишори хун, набз ва ғайра мебошад.

Шояд замимаҳое, ки ман фаромӯш кардаам, бештар бошанд, аммо ман умедворам, ки шумо мефаҳмед, ки силсилаи вақтҳо дар ҷаҳони муосир фаъолона истифода мешаванд. Ва хачми истифодаи онхо сол то сол меафзояд.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Чаро ба шумо базаи силсилаи вақт лозим аст? Чаро пойгоҳи додаҳои релясионии муқаррариро барои нигоҳ доштани силсилаи вақт истифода бурдан мумкин нест?

Зеро силсилаи вақт одатан миқдори зиёди информатсияро дар бар мегирад, ки нигоҳдорӣ ва коркарди он дар пойгоҳи додаҳои маъмулӣ душвор аст. Аз ин рӯ, пойгоҳи додаҳои махсус барои силсилаи вақт пайдо шуданд. Ин базахо нуктахоро самаранок нигох медоранд (timestamp, value) бо калиди додашуда. Онҳо API-ро барои хондани маълумоти захирашуда аз рӯи калид, аз ҷониби як ҷуфти калид-арзиш ё ҷуфтҳои сершумори калид-арзиш ё бо regexp таъмин мекунанд. Масалан, шумо мехоҳед, ки сарбории CPU-и тамоми хидматҳои худро дар як маркази додаҳо дар Амрико пайдо кунед, пас шумо бояд ин дархости псевдо-ро истифода баред.

Одатан пойгоҳи додаҳои силсилаи вақт забонҳои махсуси дархостро пешниҳод мекунанд, зеро силсилаи вақтҳои SQL чандон мувофиқ нестанд. Гарчанде ки пойгоҳи додаҳо мавҷуданд, ки SQL-ро дастгирӣ мекунанд, он чандон мувофиқ нест. Забонҳои дархост, ба монанди PromQL, InfluxQL, ҷорист,, Q. Умедворам, ки касе ақаллан яке аз ин забонҳоро шунидааст. Бисёр одамон эҳтимол дар бораи PromQL шунидаанд. Ин забони дархости Prometheus аст.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Ин аст он чизест, ки меъмории пойгоҳи додаҳои силсилаи замонавӣ бо истифода аз VictoriaMetrics ҳамчун намуна ба назар мерасад.

Он аз ду қисм иборат аст. Ин нигоҳдорӣ барои индекси баръакс ва нигоҳдорӣ барои арзишҳои силсилаи вақт мебошад. Ин анборҳо ҷудо карда шудаанд.

Вақте ки сабти нав ба пойгоҳи додаҳо ворид мешавад, мо аввал ба индекси инверсивӣ дастрасӣ пайдо мекунем, то идентификатори силсилаи вақтро барои маҷмӯи додашуда пайдо кунем. label=value барои метрикаи додашуда. Мо ин идентификаторро пайдо мекунем ва арзишро дар анбори додаҳо захира мекунем.

Вақте ки дархост барои дарёфти маълумот аз TSDB меояд, мо аввал ба индекси инвертсионалӣ мегузарем. Биёед ҳама чизро ба даст орем timeseries_ids сабтҳое, ки ба ин маҷмӯи мувофиқат мекунанд label=value. Ва он гоҳ мо ҳама маълумоти заруриро аз анбори додаҳо, аз ҷониби индексатсияшуда мегирем timeseries_ids.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Биёед мисолеро бубинем, ки чӣ тавр пойгоҳи додаҳои силсилаи вақт дархости интихобшудаи воридотро коркард мекунад.

  • Пеш аз ҳама вай ҳама чизро мегирад timeseries_ids аз шохиси баръакс, ки ҷуфтҳои додашударо дар бар мегирад label=value, ё ифодаи муқаррарии додашударо қонеъ кунед.
  • Он гоҳ он ҳама нуқтаҳои маълумотро аз нигаҳдории маълумот дар фосилаи вақти муайян барои нуқтаҳои ёфтшуда бармегардонад timeseries_ids.
  • Пас аз ин, пойгоҳи додаҳо мувофиқи дархости корбар дар ин нуқтаҳои маълумот баъзе ҳисобҳоро анҷом медиҳад. Ва баъд аз он ҷавобро бармегардонад.

Дар ин презентатсия ман ба шумо дар бораи қисми аввал нақл мекунам. Ин ҷустуҷӯ аст timeseries_ids аз рӯи индекси баръакс. Дар бораи қисми дуюм ва қисми сеюмро дертар тамошо карда метавонед Сарчашмаҳои VictoriaMetrics, ё интизор шавед, ки ман гузоришҳои дигарро омода мекунам :)

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Биёед ба индекси баръакс гузарем. Бисёриҳо шояд фикр кунанд, ки ин оддӣ аст. Кӣ медонад, ки индекси инвертсионалӣ чист ва он чӣ гуна кор мекунад? Оҳ, дигар одамон ин қадар зиёд нестанд. Биёед кӯшиш кунем, ки ин чист.

Ин дар асл оддӣ аст. Ин танҳо луғатест, ки калидро ба арзиш харита мекунад. Калид чист? Ин ҷуфт label=valueки дар label и value — ин сатрхо. Ва арзишҳо маҷмӯи мебошанд timeseries_ids, ки ҷуфти додашударо дар бар мегирад label=value.

Индекси баръакс ба шумо имкон медиҳад, ки ҳама чизро зуд пайдо кунед timeseries_ids, ки додаанд label=value.

Он инчунин ба шумо имкон медиҳад, ки зуд пайдо кунед timeseries_ids силсилаи вақт барои якчанд ҷуфт label=value, ё барои ҷуфтҳо label=regexp. Ин чӣ гуна рӯй медиҳад? Бо дарёфти буриши маҷмӯи timeseries_ids барои ҳар як ҷуфт label=value.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Биёед ба татбиқи гуногуни индекси инвертсионалӣ назар кунем. Биёед бо соддатарин татбиқи соддалавҳона оғоз кунем. Вай чунин менамояд.

функсия getMetricIDs рӯйхати сатрҳоро мегирад. Ҳар як сатр дорои label=value. Ин функсия рӯйхатро бармегардонад metricIDs.

Он чӣ гуна кор мекунад? Дар ин ҷо мо як тағирёбандаи глобалӣ дорем invertedIndex. Ин луғати муқаррарӣ аст (map), ки сатрро барои буридани ints харита мекунад. Сатр дорои label=value.

Иҷрои функсия: даст metricIDs барои аввалин label=value, он гоҳ мо ҳама чизи дигарро аз сар мегузаронем label=value, мо онро мегирем metricIDs барои онҳо. Ва функсияро даъват кунед intersectInts, ки дар поён муҳокима карда мешавад. Ва ин функсия чорроҳаи ин рӯйхатҳоро бармегардонад.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Тавре ки шумо мебинед, татбиқи индекси инвертсионалӣ чандон душвор нест. Аммо ин як амали соддалавҳона аст. Он чӣ гуна камбудиҳо дорад? Камбудии асосии татбиқи соддалавҳона дар он аст, ки чунин индекси баръакс дар RAM нигоҳ дошта мешавад. Пас аз бозоғозкунии барнома мо ин индексро гум мекунем. Ягон захираи ин индекс ба диск вуҷуд надорад. Чунин индекси инвертсионалӣ гумон аст, ки барои пойгоҳи додаҳо мувофиқ бошад.

Камбудии дуюм низ ба хотира вобаста аст. Индекси баръакс бояд ба RAM мувофиқат кунад. Агар он аз андозаи RAM зиёд бошад, пас бешубҳа мо хатои хотираро аз даст медиҳем. Ва барнома кор намекунад.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Ин масъаларо бо истифода аз усулҳои тайёр, ба монанди LevelDB, ё RocksDB.

Хулоса, ба мо базае лозим аст, ки ба мо имкон медихад се амалиётро зуд анчом дихем.

  • Амалиёти аввал сабт аст ключ-значение ба ин базаи маълумот. Вай ин корро хеле зуд мекунад, дар куҷо ключ-значение сатрҳои ихтиёрӣ мебошанд.
  • Амалиёти дуюм ҷустуҷӯи зуди арзиш бо истифода аз калиди додашуда мебошад.
  • Ва амалиёти сеюм ин ҷустуҷӯи зуд барои ҳамаи арзишҳо аз рӯи префикси додашуда мебошад.

LevelDB ва RocksDB - ин пойгоҳи додаҳоро Google ва Facebook таҳия кардаанд. Аввалин LevelDB омад. Сипас бачаҳо аз Facebook LevelDB-ро гирифтанд ва онро такмил доданд, онҳо RocksDB-ро сохтанд. Ҳоло қариб ҳама пойгоҳи додаҳои дохилӣ дар RocksDB дар дохили Facebook кор мекунанд, аз ҷумла онҳое, ки ба RocksDB ва MySQL интиқол дода шудаанд. Онҳо ӯро номгузорӣ карданд MyRocks.

Индекси инвертсиониро бо истифода аз LevelDB амалӣ кардан мумкин аст. Чӣ тавр бояд кард? Мо ҳамчун калид захира мекунем label=value. Ва арзиш муайянкунандаи силсилаи вақт аст, ки дар он ҷуфт мавҷуд аст label=value.

Агар мо силсилаи зиёди вақтро бо як ҷуфти додашуда дошта бошем label=value, он гоҳ дар ин пойгоҳи додаҳо сатрҳои зиёде бо як калид ва гуногун хоҳанд буд timeseries_ids. Барои гирифтани рӯйхати ҳама timeseries_ids, ки бо ин сар мешавад label=prefix, мо скан кардани диапазонеро анҷом медиҳем, ки барои он ин пойгоҳи дода оптимизатсия шудааст. Яъне, мо ҳама сатрҳоеро, ки аз он оғоз мешаванд, интихоб мекунем label=prefix ва чизи заруриро ба даст оред timeseries_ids.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Ин аст намунаи татбиқи он дар Go чӣ гуна хоҳад буд. Мо индекси баръакс дорем. Ин LevelDB аст.

Функсия ҳамон тавре, ки татбиқи соддалавҳона аст. Он татбиқи соддалавҳонаро тақрибан сатр ба сатр такрор мекунад. Ягона нуктаи он аст, ки ба ҷои рӯй ба map мо ба индекси табдилшуда дастрасӣ пайдо мекунем. Мо ҳама арзишҳоро барои аввал мегирем label=value. Сипас, мо аз тамоми ҷуфтҳои боқимонда мегузарем label=value ва барои онҳо маҷмӯи мувофиқи metricIDҳоро гиред. Он гоҳ мо чорроҳаро пайдо мекунем.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Ба назар чунин мерасад, ки ҳама чиз хуб аст, аммо дар ин ҳалли мушкилот камбудиҳо мавҷуданд. VictoriaMetrics дар аввал як шохиси инверсификатсияро дар асоси LevelDB татбиқ кард. Аммо дар ниҳоят ман маҷбур шудам, ки аз он даст кашам.

Чаро? Зеро LevelDB нисбат ба татбиқи соддатар сусттар аст. Дар татбиқи соддалавҳона, ки калиди додашударо дода, мо фавран тамоми буридаро мегирем metricIDs. Ин як амалиёти хеле зуд аст - тамоми буридаи барои истифода омода аст.

Дар LevelDB, ҳар дафъае, ки функсия даъват карда мешавад GetValues шумо бояд аз тамоми сатрҳое, ки аз он оғоз мешаванд, гузаред label=value. Ва арзиши ҳар як сатрро гиред timeseries_ids. Аз чунин timeseries_ids як пораи инҳоро ҷамъ кунед timeseries_ids. Аён аст, ки ин назар ба дастрасӣ ба харитаи муқаррарӣ бо калид хеле сусттар аст.

Камбудии дуюм ин аст, ки LevelDB дар C навишта шудааст. Занг задан ба функсияҳои C аз Go он қадар зуд нест. Барои он садҳо наносония вақт лозим аст. Ин хеле зуд нест, зеро дар муқоиса бо занги муқаррарии функсионалии дар go навишташуда, ки 1-5 наносонияро мегирад, фарқият дар иҷроиш даҳҳо маротиба аст. Барои VictoriaMetrics ин як камбудии марговар буд :)

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Ҳамин тавр, ман татбиқи индекси инвертсионии худро навиштам. Ва ӯро даъват кард якҷоя кардан.

Mergeset ба сохтори додаҳои MergeTree асос ёфтааст. Ин сохтори маълумот аз ClickHouse гирифта шудааст. Аён аст, ки якҷоякунӣ бояд барои ҷустуҷӯи зуд оптимизатсия карда шавад timeseries_ids мувофиқи калиди додашуда. Mergeset пурра дар Go навишта шудааст. Шумо мебинед Сарчашмаҳои VictoriaMetrics дар GitHub. Татбиқи mergeset дар ҷузвдон аст /lib/mergeset. Шумо метавонед кӯшиш кунед, ки дар он ҷо чӣ рӯй дода истодааст.

API-и mergeset ба LevelDB ва RocksDB хеле монанд аст. Яъне он ба шумо имкон медиҳад, ки сабтҳои навро дар он ҷо зуд захира кунед ва сабтҳоро аз рӯи префикси додашуда зуд интихоб кунед.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Мо дар бораи нуқсонҳои mergeset баъдтар сӯҳбат хоҳем кард. Акнун биёед дар бораи он сӯҳбат кунем, ки бо VictoriaMetrics дар истеҳсолот ҳангоми татбиқи индекси инвертсионалӣ чӣ мушкилот ба миён омад.

Чаро онҳо пайдо шуданд?

Сабаби аввал ин суръати баланди талафот аст. Ба забони русӣ тарҷума шудааст, ин тағироти зуд-зуд дар силсилаи вақт аст. Ин вақтест, ки силсилаи вақт ба охир мерасад ва силсилаи нав оғоз меёбад ё бисёр силсилаи вақтҳои нав оғоз меёбад. Ва ин аксар вақт рӯй медиҳад.

Сабаби дуюм шумораи зиёди силсилаи вақтҳо мебошад. Дар ибтидо, вақте ки мониторинг маъруфият пайдо мекард, шумораи силсилаҳои вақт кам буд. Масалан, барои ҳар як компютер шумо бояд CPU, хотира, шабака ва сарбории дискро назорат кунед. 4 силсилаи вақт барои як компютер. Фарз мекунем, ки шумо 100 компютер ва 400 силсилаи вақт доред. Ин хеле кам аст.

Бо гузашти вақт, одамон фаҳмиданд, ки онҳо метавонанд иттилооти бештарро чен кунанд. Масалан, сарбории тамоми протсессорро на, балки аз ҳар як ядрои протсессори алоҳида чен кунед. Агар шумо 40 ядрои протсессор дошта бошед, пас шумо барои чен кардани сарбории протсессор 40 маротиба зиёдтар силсилаи вақт доред.

Аммо ин ҳама нест. Ҳар як ядрои протсессор метавонад якчанд ҳолат дошта бошад, масалан, ҳангоми бекор буданаш. Ва инчунин дар фазои корбар кор кунед, дар фазои ядро ​​​​ва дигар ҳолатҳо кор кунед. Ва ҳар як чунин ҳолатро метавон ҳамчун силсилаи алоҳидаи вақт чен кард. Ин ба таври илова шумораи каторхоро 7—8 баробар зиёд мекунад.

Аз як метрика мо танҳо барои як компютер 40 x 8 = 320 ченак гирифтем. Ба 100 зарб кунед, мо ба ҷои 32 000 мегирем.

Пас аз он Кубернетес омад. Ва он бадтар шуд, зеро Kubernetes метавонад хидматҳои гуногуни гуногунро қабул кунад. Ҳар як хидмат дар Kubernetes аз бисёр бандҳо иборат аст. Ва хамаи инро назорат кардан лозим аст. Илова бар ин, мо мунтазам густариши версияҳои нави хидматҳои шуморо дорем. Барои ҳар як версияи нав, бояд силсилаи вақтҳои нав эҷод карда шавад. Дар натиља шумораи силсилањои замонї ба таври экспоненсиалї зиёд мешавад ва мо бо масъалаи шумораи зиёди силсилаи замонњо дучор мешавем, ки онро баланд-кардиналї меноманд. VictoriaMetrics дар муқоиса бо дигар пойгоҳи додаҳои силсилаи вақт бо муваффақият мубориза мебарад.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

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

Масалан, Кубернетесро гиред, ки консепсия дорад deployment, яъне вақте ки версияи нави барномаи шумо бароварда мешавад. Бо баъзе сабабҳо, таҳиягарони Kubernetes тасмим гирифтанд, ки идентификатори густаришро ба нишон илова кунанд.

Ин ба чй оварда расонд? Ғайр аз он, бо ҳар як ҷойгиркунии нав, ҳама силсилаи замонҳои кӯҳна қатъ карда мешаванд ва ба ҷои онҳо, силсилаи вақтҳои нав бо арзиши нав оғоз мешаванд deployment_id. Садхо хазор ва хатто миллионхо чунин сатрхо буда метавонанд.

Чизи муҳими ҳамаи ин дар он аст, ки шумораи умумии силсилаи вақтҳо меафзояд, аммо шумораи силсилаҳои вақт, ки айни замон фаъоланд ва маълумот мегиранд, доимӣ боқӣ мемонанд. Ин ҳолатро сатҳи баланди пошхӯрӣ меноманд.

Мушкилоти асосии суръати баланди талафот ин таъмини суръати доимии ҷустуҷӯ барои ҳама силсилаи вақтҳо барои маҷмӯи додаҳои нишонаҳо дар фосилаи муайяни вақт мебошад. Одатан ин фосилаи вақт барои соати охир ё рӯзи охирин аст.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Ин масъаларо чй тавр бояд хал кард? Ин аст варианти аввал. Ин барои тақсим кардани шохиси баръакс бо мурури замон ба қисмҳои мустақил аст. Яъне, каме фосилаи вақт мегузарад, мо корро бо индекси инвертсионии ҷорӣ анҷом медиҳем. Ва индекси нави баръакс эҷод кунед. Дигар фосилаи вақт мегузарад, мо дигар ва дигареро эҷод мекунем.

Ва хангоми интихоб аз ин шохисхои инверситшуда, мо мачмуи шохисхои инверсивиро пайдо мекунем, ки ба фосилаи додашуда рост меоянд. Ва, мувофиқан, мо аз он ҷо ID-и силсилаи вақтро интихоб мекунем.

Ин захираҳоро сарфа мекунад, зеро мо набояд ба қисмҳое назар кунем, ки ба фосилаи додашуда дохил намешаванд. Яъне, одатан, агар мо маълумотро барои соати охир интихоб кунем, пас барои фосилаҳои вақти қаблӣ мо дархостҳоро мегузарем.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Варианти дигари ҳалли ин мушкилот вуҷуд дорад. Ин барои ҳар рӯз нигоҳ доштани рӯйхати алоҳидаи идентификаторҳои силсилаи вақт, ки дар он рӯз рух дода буд.

Бартарии ин қарор нисбат ба ҳалли қаблӣ дар он аст, ки мо маълумоти силсилаи вақтро такрор намекунем, ки бо мурури замон аз байн намераванд. Онҳо ҳамеша ҳузур доранд ва тағир намеёбанд.

Камбуди дар он аст, ки чунин ҳалли мушкилот душвортар аст ва барои ислоҳ кардан душвортар аст. Ва VictoriaMetrics ин ҳалли худро интихоб кард. Ин тавр буд таърихӣ. Ин ҳалли низ дар муқоиса бо пештара хуб иҷро мекунад. Барои он ки ин ҳалли он амалӣ карда нашуд, ки дар ҳар як бахш такрор кардани маълумот барои силсилаи вақт, ки тағир намеёбанд, яъне бо мурури замон нест намешаванд. VictoriaMetrics пеш аз ҳама барои масрафи фазои диск оптимизатсия карда шуд ва татбиқи қаблӣ масрафи фазои дискро бадтар кард. Аммо ин татбиқ барои кам кардани масрафи фазои диск мувофиқтар аст, бинобар ин он интихоб шудааст.

Ман бояд бо вай ҷанг кунам. Мубориза дар он буд, ки дар ин татбиқ ба шумо лозим аст, ки шумораи хеле калонтарро интихоб кунед timeseries_ids барои маълумот нисбат ба он вақте ки шохиси баръакс тақсим карда мешавад.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Мо ин масъаларо чй тавр хал кардем? Мо онро ба таври аслӣ ҳал кардем - бо нигоҳ доштани якчанд идентификаторҳои силсилаи вақт дар ҳар як вуруди индекси баръакс ба ҷои як идентификатор. Яъне мо калид дорем label=value, ки дар ҳар як силсилаи вақт рух медиҳад. Ва ҳоло мо якчанд нафарро наҷот медиҳем timeseries_ids дар як вуруд.

Ана як мисол. Пештар мо N вуруд доштем, аммо ҳоло мо як вуруд дорем, ки префикси он бо ҳама дигарҳо яксон аст. Барои вуруди қаблӣ, арзиш ҳама идентификаторҳои силсилаи вақтро дар бар мегирад.

Ин имкон дод, ки суръати сканкунии чунин индекси инвертсивй то 10 баробар зиёд карда шавад. Ва он ба мо имкон дод, ки истеъмоли хотираро барои кэш кам кунем, зеро ҳоло мо сатрро нигоҳ медорем label=value танҳо як маротиба дар кеш якҷоя N маротиба. Ва ин сатр метавонад калон бошад, агар шумо дар барчаспҳо ва тамғакоғазҳои худ хатҳои дароз нигоҳ доред, ки Кубернетес онҳоро ба он ҷо тела доданро дӯст медорад.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Варианти дигар барои суръат бахшидан ба ҷустуҷӯ дар индекси инвертсионалӣ sharding аст. Эҷоди якчанд индексҳои баръакс ба ҷои як ва тақсим кардани маълумот байни онҳо тавассути калид. Ин маҷмӯи аст key=value буг. Ин аст, ки мо якчанд индексҳои мустақили инвертсиониро ба даст меорем, ки мо метавонем онҳоро дар баробари якчанд протсессор дархост кунем. Татбиқҳои қаблӣ танҳо ба кор дар реҷаи як протсессор иҷозат медоданд, яъне сканкунии маълумот танҳо дар як ядро. Ин ҳалли шумо имкон медиҳад, ки маълумотро дар як вақт дар якчанд ядроҳо скан кунед, зеро ClickHouse инро дӯст медорад. Ин аст он чизе ки мо ба нақша гирифтаем.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Акнун биёед ба гӯсфандони худ - ба функсияи чорроҳа бармегардем timeseries_ids. Биёед бубинем, ки кадом амалияҳо вуҷуд доранд. Ин функсия ба шумо имкон медиҳад, ки пайдо кунед timeseries_ids барои маҷмӯи додашуда label=value.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Варианти аввал татбиқи соддалавҳона аст. Ду ҳалқаи лона. Дар ин ҷо мо вуруди функсияро мегирем intersectInts ду бурида - a и b. Ҳангоми баромад, он бояд чорроҳаи ин буридаҳоро ба мо баргардонад.

Татбиқи соддалавҳона чунин ба назар мерасад. Мо ҳама арзишҳоро аз бурида такрор мекунем a, дар дохили ин ҳалқа мо тамоми арзишҳои буридаро мегузарем b. Ва мо онҳоро муқоиса мекунем. Агар онҳо мувофиқат кунанд, пас мо чорроҳае ёфтем. Ва онро захира кунед result.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Камбудиҳо чист? Камбудии асосии он мураккабии квадратӣ мебошад. Масалан, агар андозаҳои шумо бурида бошанд a и b як миллион ҳар як, пас ин функсия ҳеҷ гоҳ ба шумо ҷавоб намедиҳад. Зеро он бояд як триллион такрорро анҷом диҳад, ки ҳатто барои компютерҳои муосир хеле зиёд аст.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Татбиқи дуюм ба харита асос ёфтааст. Мо харита эҷод мекунем. Мо ҳама арзишҳоро аз бурида ба ин харита мегузорем a. Сипас, мо аз буридаи дар ҳалқаи алоҳида мегузарем b. Ва мо тафтиш мекунем, ки оё ин арзиш аз бурида аст b дар харита. Агар он мавҷуд бошад, онро ба натиҷа илова кунед.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Манфиатҳо чист? Бартарии он аст, ки танҳо мураккабии хаттӣ вуҷуд дорад. Яъне, функсия барои буридаҳои калонтар зудтар иҷро мешавад. Барои як буридаи андозаи миллион, ин функсия дар 2 миллион такрор иҷро мешавад, дар муқоиса бо триллион такрори функсияи қаблӣ.

Камбуди он аст, ки ин функсия барои сохтани ин харита хотираи бештарро талаб мекунад.

Камбудии дуюм ин хароҷоти калон барои ҳашинг аст. Ин камбудӣ чандон равшан нест. Ва барои мо он низ чандон аён набуд, аз ин рӯ дар аввал дар VictoriaMetrics татбиқи чорроҳа тавассути харита буд. Аммо баъдан профилизатсия нишон дод, ки вақти асосии протсессор барои навиштан ба харита ва тафтиши мавҷудияти арзиш дар ин харита сарф мешавад.

Чаро вақти CPU дар ин ҷойҳо беҳуда сарф мешавад? Зеро Go дар ин хатҳо амалиёти хэшро иҷро мекунад. Яъне, он хэши калидро ҳисоб мекунад, то ба он дар индекси додашуда дар HashMap дастрасӣ пайдо кунад. Амалиёти ҳисобкунии ҳаш дар даҳҳо наносония анҷом меёбад. Ин барои VictoriaMetrics суст аст.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Ман тасмим гирифтам, ки як битсети махсус барои ин ҳолат оптимизатсияшударо татбиқ кунам. Ин аст, ки чорроҳаи ду бурида ҳоло ба назар мерасад. Дар ин ҷо мо битсет эҷод мекунем. Мо элементҳоро аз буридаи аввал ба он илова мекунем. Сипас, мо мавҷудияти ин элементҳоро дар буридаи дуюм тафтиш мекунем. Ва онҳоро ба натиҷа илова кунед. Яъне аз мисоли қаблӣ тақрибан фарқ надорад. Ягона чизе, ки дар ин ҷо он аст, ки мо дастрасӣ ба харитаро бо функсияҳои фармоишӣ иваз кардем add и has.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Дар назари аввал, чунин ба назар мерасад, ки ин бояд сусттар кор кунад, агар қаблан дар он ҷо харитаи стандартӣ истифода мешуд ва баъд баъзе функсияҳои дигар даъват карда мешаванд, аммо профилсозӣ нишон медиҳад, ки ин чиз аз харитаи стандартӣ дар сурати VictoriaMetrics 10 маротиба тезтар кор мекунад.

Илова бар ин, он нисбат ба татбиқи харита хотираи камтарро истифода мебарад. Зеро мо дар ин ҷо ба ҷои арзишҳои ҳашт-байтӣ битҳоро нигоҳ медорем.

Камбудии ин татбиқ дар он аст, ки он чандон аён нест, ночиз нест.

Камбудии дигаре, ки бисёриҳо пай намебаранд, ин аст, ки ин татбиқ дар баъзе мавридҳо хуб кор намекунад. Яъне, он барои як ҳолати мушаххас оптимизатсия карда шудааст, барои ин ҳолати чорроҳаи ID-ҳои силсилаи вақти VictoriaMetrics. Ин маънои онро надорад, ки он барои ҳама ҳолатҳо мувофиқ аст. Агар он нодуруст истифода шавад, мо на афзоиши корҳоро ба даст меорем, балки хатои аз хотираи хотира ва сустшавии кор.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Татбики ин сохторро дида мебароем. Агар шумо хоҳед, ки назар кунед, он дар манбаъҳои VictoriaMetrics, дар папка ҷойгир аст lib/uint64set. Он махсусан барои парвандаи VictoriaMetrics оптимизатсия карда шудааст, ки дар он ҷо timeseries_id арзиши 64-бит аст, ки дар он 32 битҳои аввал асосан доимӣ мебошанд ва танҳо 32 битҳои охирин тағйир меёбанд.

Ин сохтори додаҳо дар диск нигоҳ дошта намешавад, он танҳо дар хотира амал мекунад.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Ин аст API-и он. Ин хеле мураккаб нест. API махсус барои мисоли мушаххаси истифодаи VictoriaMetrics мутобиқ карда шудааст. Яъне дар ин чо ягон вазифаи нодаркор нест. Инҳоянд функсияҳое, ки аз ҷониби VictoriaMetrics ба таври возеҳ истифода мешаванд.

Функсияҳо мавҷуданд add, ки арзишҳои навро илова мекунад. Функсия вуҷуд дорад has, ки арзишҳои навро тафтиш мекунад. Ва як функсия вуҷуд дорад del, ки арзишҳоро нест мекунад. Функсияи ёрирасон мавҷуд аст len, ки андозаи маҷмӯаро бармегардонад. Функсия clone бисёр клон мекунад. Ва функсия appendto ин маҷмӯаро ба бурида табдил медиҳад timeseries_ids.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Татбиқи ин сохтори маълумот чунин аст. маҷмӯи ду унсур дорад:

  • ItemsCount майдони ёрирасон барои зуд баргардонидани шумораи элементҳои маҷмӯи аст. Бе ин майдони ёрирасон метавон кард, аммо онро дар ин ҷо илова кардан лозим буд, зеро VictoriaMetrics аксар вақт дарозии битсетҳоро дар алгоритмҳои худ мепурсад.

  • Майдони дуюм аст buckets. Ин порае аз сохтор аст bucket32. Ҳар як сохтор захира мекунад hi майдон. Инҳо 32 битҳои болоӣ мебошанд. Ва ду бурида - b16his и buckets аз он bucket16 сохторҳо.

Дар ин ҷо 16 битҳои болоии қисми дуюми сохтори 64-бит нигоҳ дошта мешаванд. Ва дар ин ҷо битсетҳо барои 16 битҳои поёнии ҳар як байт нигоҳ дошта мешаванд.

Bucket64 аз массив иборат аст uint64. Дарозӣ бо истифода аз ин доимӣ ҳисоб карда мешавад. Дар як bucket16 ҳадди аксар захира кардан мумкин аст 2^16=65536 каме. Агар шумо онро ба 8 тақсим кунед, он 8 килобайт аст. Агар шумо дубора ба 8 тақсим кунед, он 1000 аст uint64 маънои. Яъне Bucket16 — ин сохтори 8 килобайтии мост.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

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

Ҳамааш аз он оғоз мешавад uint64 маънохо. Мо 32 битҳои болоро ҳисоб мекунем, 32 битҳои поёниро ҳисоб мекунем. Биёед ҳама чизро аз сар гузаронем buckets. Мо 32 битҳои болоро дар ҳар як сатил бо арзиши иловашуда муқоиса мекунем. Ва агар онҳо мувофиқат кунанд, мо функсияро даъват мекунем add дар сохтори b32 buckets. Ва дар он ҷо 32 битҳои поёниро илова кунед. Ва агар баргашт true, пас ин маънои онро дорад, ки мо дар он ҷо чунин арзишро илова кардем ва чунин арзиш надоштем. Агар баргардад false, пас чунин маъно аллакай вучуд дошт. Он гоҳ мо шумораи элементҳоро дар сохтор зиёд мекунем.

Агар мо он чизеро, ки ба шумо лозим аст, наёфтаем bucket бо арзиши баланди зарурӣ, пас мо функсияро даъват мекунем addAlloc, ки навашро истехсол мекунад bucket, илова кардани он ба сохтори сатил.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Ин амалисозии функсия аст b32.add. Он ба татбиқи қаблӣ монанд аст. Мо муҳимтарин 16 бит, камтарин 16 битро ҳисоб мекунем.

Сипас, мо аз тамоми 16 битҳои боло мегузарем. Мо мувофиқатҳоро пайдо мекунем. Ва агар мувофиқат мавҷуд бошад, мо усули иловаро меномем, ки онро дар саҳифаи оянда баррасӣ хоҳем кард bucket16.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Ва дар ин ҷо сатҳи пасттарин аст, ки бояд то ҳадди имкон оптимизатсия карда шавад. Мо ҳисоб мекунем uint64 арзиши id дар бит бурида ва инчунин bitmask. Ин ниқоб барои арзиши додаи 64-бит аст, ки метавонад барои тафтиши мавҷудияти ин бит истифода шавад ё онро муқаррар кард. Мо месанҷем, ки оё ин бит муқаррар карда шудааст ва онро танзим карда, ҳузурро бармегардонем. Ин амалияи мост, ки ба мо имкон дод, ки кори идентификаторхои сериалхои замонро нисбат ба харитахои мукаррарй 10 баробар тезонем.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Илова ба ин оптимизатсия, VictoriaMetrics бисёр оптимизатсияҳои дигар дорад. Аксари ин оптимизатсияҳо бо як сабаб илова карда шуданд, аммо пас аз профили код дар истеҳсолот.

Ин қоидаи асосии оптимизатсия аст - оптимизатсияро илова накунед, агар дар ин ҷо монеа вуҷуд дошта бошад, зеро он метавонад маълум шавад, ки дар он ҷо монеа вуҷуд надорад. Оптимизатсия одатан сифати кодро паст мекунад. Аз ин рӯ, танҳо пас аз профилсозӣ ва беҳтараш дар истеҳсолот оптимизатсия кардан лозим аст, то ин маълумоти воқеӣ бошад. Агар касе таваҷҷӯҳ дошта бошад, шумо метавонед ба коди сарчашмаи VictoriaMetrics нигаред ва дигар оптимизатсияҳоеро, ки дар он ҷо мавҷуданд, омӯзед.

Ба оптимизатсия дар VictoriaMetrics гузаред. Александр Валялкин

Ман дар бораи bitset як савол дорам. Хеле шабеҳ ба татбиқи вектори bool C++, битсети оптимизатсияшуда. Оё шумо татбиқро аз он ҷо гирифтед?

Не, аз он ҷо не. Ҳангоми татбиқи ин битсет, ман бо дониши сохтори ин силсилаи ids, ки дар VictoriaMetrics истифода мешаванд, роҳнамоӣ кардам. Ва сохтори онҳо чунин аст, ки 32 битҳои болоӣ асосан доимӣ мебошанд. 32 битҳои поёнӣ метавонанд тағир дода шаванд. Чӣ қадаре ки каме паст бошад, ҳамон қадар зуд-зуд метавонад тағир ёбад. Аз ин рӯ, ин татбиқ махсусан барои ин сохтори додаҳо оптимизатсия карда шудааст. Татбиқи C++, то ҷое ки ман медонам, барои ҳолати умумӣ оптимизатсия шудааст. Агар шумо барои парвандаи умумӣ оптимизатсия кунед, ин маънои онро дорад, ки он барои як парвандаи мушаххас беҳтарин нест.

Ман инчунин ба шумо маслиҳат медиҳам, ки гузориши Алексей Миловидро тамошо кунед. Тақрибан як моҳ пеш, ӯ дар бораи оптимизатсия дар ClickHouse барои ихтисосҳои мушаххас сӯҳбат кард. Вай танҳо мегӯяд, ки дар сурати умумӣ, татбиқи C++ ё ягон амали дигар барои хуб кор кардан ба ҳисоби миёна дар беморхона мутобиқ карда шудааст. Он метавонад аз татбиқи мушаххаси дониш ба монанди мо бадтар кор кунад, дар он ҷо мо медонем, ки 32 битҳои боло асосан доимӣ мебошанд.

Саволи дуюм дорам. Фарқи асосӣ аз InfluxDB чист?

Бисёр фарқиятҳои асосӣ вуҷуд доранд. Аз нуқтаи назари самаранокӣ ва истеъмоли хотира, InfluxDB дар санҷишҳо истеъмоли хотираро барои силсилаи вақтҳои баландсифат 10 маротиба зиёдтар нишон медиҳад, вақте ки шумо шумораи зиёди онҳоро доред, масалан, миллионҳо. Масалан, VictoriaMetrics барои як миллион сатри фаъол 1 ГБ сарф мекунад, дар ҳоле ки InfluxDB 10 ГБ истеъмол мекунад. Ва ин фарқияти калон аст.

Фарқи дуввуми асосӣ дар он аст, ки InfluxDB дорои забонҳои аҷиби дархостҳо - Flux ва InfluxQL мебошад. Онҳо барои кор бо силсилаи вақт нисбат ба он чандон қулай нестанд PromQL, ки аз ҷониби VictoriaMetrics дастгирӣ карда мешавад. PromQL забони пурсиш аз Prometheus аст.

Ва як фарқияти дигар дар он аст, ки InfluxDB модели каме аҷиби маълумот дорад, ки дар он ҳар як сатр метавонад якчанд майдонҳоро бо маҷмӯи гуногуни тегҳо нигоҳ дорад. Ин сатрҳо боз ба ҷадвалҳои гуногун тақсим карда мешаванд. Ин мушкилиҳои иловагӣ кори минбаъдаро бо ин пойгоҳи додаҳо душвор мегардонанд. дастгирй кардан ва фахмидан душвор аст.

Дар VictoriaMetrics ҳама чиз хеле соддатар аст. Дар он ҷо ҳар як силсилаи вақт як арзиши калидӣ мебошад. Арзиш маҷмӯи нуқтаҳо мебошад - (timestamp, value), ва калид маҷмӯи аст label=value. Дар байни майдонҳо ва ченакҳо ягон фарқият вуҷуд надорад. Он ба шумо имкон медиҳад, ки ҳама гуна маълумотро интихоб кунед ва сипас муттаҳид кунед, илова кунед, тарҳ кунед, зарб кунед, тақсим кунед, бар хилофи InfluxDB, ки дар он ҷо ҳисобҳо байни сатрҳои гуногун то ҷое ки ман медонам, иҷро намешаванд. Ҳатто агар онҳо амалӣ шаванд, ин мушкил аст, шумо бояд кодҳои зиёде нависед.

Ман як саволи равшане дорам. Оё ман дуруст фаҳмидам, ки ягон мушкилоте вуҷуд дорад, ки шумо дар бораи он сӯҳбат мекардед, ки ин индекси баръакс ба хотира мувофиқат намекунад, бинобар ин тақсимот вуҷуд дорад?

Аввалан, ман татбиқи соддалавҳии индекси баръаксро дар харитаи стандартии Go нишон додам. Ин татбиқ барои пойгоҳи додаҳо мувофиқ нест, зеро ин индекси баръакс дар диск захира карда намешавад ва базаи маълумот бояд дар диск захира карда шавад, то ин маълумот ҳангоми бозоғозӣ дастрас боқӣ монад. Дар ин татбиқ, вақте ки шумо барномаро бозоғоз мекунед, индекси баръакси шумо нопадид мешавад. Ва шумо дастрасӣ ба ҳама маълумотро аз даст медиҳед, зеро шумо онро пайдо карда наметавонед.

Салом! Ташаккур барои гузориш! Номи ман Павел аст. Ман аз Wildberries ҳастам. Ман ба шумо чанд савол дорам. Саволи як. Оё шумо фикр мекунед, ки агар шумо ҳангоми сохтани меъмории замимаи худ принсипи дигареро интихоб мекардед ва маълумотро бо мурури замон тақсим мекардед, пас эҳтимол шумо метавонистед ҳангоми ҷустуҷӯ маълумотро буред, танҳо дар асоси он, ки як қисм барои як қисм маълумот дорад. давраи вақт, яъне дар як фосилаи вақт ва шумо набояд аз он хавотир шавед, ки пораҳои шумо ба таври гуногун пароканда шудаанд? Саволи рақами 2 - азбаски шумо як алгоритми шабеҳро бо bitset ва ҳама чизҳои дигар амалӣ карда истодаед, пас шояд шумо бо истифода аз дастурҳои протсессор кӯшиш кардаед? Шояд шумо чунин оптимизатсияҳоро санҷидаед?

Ман дарҳол ба дуюмаш ҷавоб медиҳам. Мо то ҳол ба он дараҷа нарасидем. Аммо агар лозим шавад, мо ба он ҷо мерасем. Ва аввалин, савол чӣ буд?

Шумо ду сенарияро муҳокима кардед. Ва гуфтанд, ки дуюмро бо татбиқи мураккабтар интихоб кардаанд. Ва онҳо аввалинро бартарӣ надоданд, ки дар он маълумот аз рӯи вақт тақсим карда мешавад.

Бале. Дар ҳолати аввал, ҳаҷми умумии индекс калонтар хоҳад буд, зеро дар ҳар як қисм мо бояд маълумоти такрориро барои он силсилаи вақтҳо, ки тавассути ҳамаи ин қисмҳо идома доранд, нигоҳ дорем. Ва агар суръати бекоркунии силсилаи вақти шумо хурд бошад, яъне ҳамон силсилаҳо доимо истифода мешаванд, пас дар ҳолати аввал мо дар муқоиса бо ҳолати дуюм миқдори фазои ишғоли дискро хеле зиёдтар аз даст медиҳем.

Ва ҳамин тавр - бале, тақсимоти вақт як варианти хуб аст. Прометей онро истифода мебарад. Аммо «Прометей» боз як камбудй дорад. Ҳангоми муттаҳид кардани ин қисмҳои маълумот, он бояд дар хотира мета-маълумотро барои ҳама тамғакоғазҳо ва вақтҳо нигоҳ дорад. Аз ин рӯ, агар қисмҳои маълумоте, ки он муттаҳид мекунад, калон бошад, пас сарфи хотира ҳангоми якҷояшавӣ, бар хилофи VictoriaMetrics хеле зиёд мешавад. Ҳангоми муттаҳидшавӣ, VictoriaMetrics хотираро тамоман истеъмол намекунад; новобаста аз андозаи қисмҳои додаҳои якҷояшуда танҳо якчанд килобайт сарф мешавад.

Алгоритме, ки шумо истифода мебаред, хотираро истифода мебарад. Он барчаспҳои вақтро, ки дорои арзишҳо мебошанд, қайд мекунад. Ва бо ин роҳ шумо мавҷудияти ҷуфтшударо дар як массиви додаҳо ва дар дигараш тафтиш мекунед. Ва шумо мефаҳмед, ки оё буриш рух додааст ё не. Одатан, пойгоҳи додаҳо курсорҳо ва итераторҳоро амалӣ мекунанд, ки мундариҷаи ҷории худро нигоҳ медоранд ва аз сабаби мураккабии оддии ин амалҳо тавассути маълумотҳои мураттабшуда кор мекунанд.

Чаро мо курсорҳоро барои интиқоли маълумот истифода намебарем?

Бале.

Мо сатрҳои мураттабшударо дар LevelDB ё mergeset нигоҳ медорем. Мо метавонем курсорро ҳаракат карда, чорроҳаро пайдо кунем. Чаро мо онро истифода намебарем? Зеро он суст аст. Зеро курсорҳо маънои онро доранд, ки шумо бояд функсияро барои ҳар як сатр даъват кунед. Даъвати функсия 5 наносония аст. Ва агар шумо 100 000 000 сатр дошта бошед, пас маълум мешавад, ки мо танҳо барои даъват кардани функсия ним сония сарф мекунем.

Чунин чизе ҳаст, ҳа. Ва саволи охирини ман. Савол шояд каме аҷиб садо диҳад. Чаро дар лахзаи расидани маълумот хамаи агрегатхои заруриро хонда, дар шакли зарурй нигох доштан мумкин нест? Чаро дар баъзе системаҳо, ба монанди VictoriaMetrics, ClickHouse ва ғайра ҳаҷми бузургро захира кунед ва сипас барои онҳо вақти зиёд сарф кунед?

Барои равшантар шудани он як мисол меорам. Биёед бигӯем, ки спидометри хурди бозича чӣ гуна кор мекунад? Он масофаеро, ки шумо тай кардаед, сабт мекунад, ҳама вақт онро ба як арзиш илова мекунад ва дуюм - вақт. Ва тақсим мекунад. Ва суръати миёна мегирад. Шумо метавонед дар бораи ҳамин кор кунед. Ҳама далелҳои заруриро дар парвоз илова кунед.

Хуб, ман саволро мефаҳмам. Намунаи шумо ҷои худро дорад. Агар шумо донед, ки ба шумо кадом агрегатҳо лозиманд, пас ин беҳтарин татбиқ аст. Аммо мушкилот дар он аст, ки одамон ин нишондиҳандаҳо, баъзе маълумотро дар ClickHouse захира мекунанд ва онҳо ҳанӯз намедонанд, ки чӣ гуна онҳоро дар оянда ҷамъ ва филтр мекунанд, аз ин рӯ онҳо бояд тамоми маълумоти хомро захира кунанд. Аммо агар шумо медонед, ки шумо бояд чизеро ба ҳисоби миёна ҳисоб кунед, пас чаро онро ба ҷои нигоҳ доштани як миқдори ашёи хом дар он ҷо ҳисоб накунед? Аммо ин танҳо он вақт аст, ки шумо аниқ медонед, ки ба шумо чӣ лозим аст.

Дар омади гап, пойгоҳи додаҳо барои нигоҳ доштани силсилаи вақтҳо ҳисобкунии агрегатҳоро дастгирӣ мекунанд. Масалан, Prometheus дастгирӣ мекунад қоидаҳои сабт. Яъне, ин корро кардан мумкин аст, агар шумо донед, ки ба шумо кадом воҳидҳо лозиманд. VictoriaMetrics ҳоло инро надорад, аммо одатан аз он пеш аз Prometheus ҷойгир аст, ки дар он ин корро дар қоидаҳои рамзгузорӣ кардан мумкин аст.

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

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

Ташаккур барои савол. Истифодабарандагони мо мунтазам ин саволро медиҳанд. Онҳо мепурсанд, ки кай мо барои интихоби поён дастгирӣ илова мекунем. Дар ин ҷо якчанд мушкилот вуҷуд доранд. Аввалан, ҳар як корбар мефаҳмад downsampling чизи дигар: касе мехоҳад, ки дар фосилаи додашуда ягон нуқтаи худсарона ба даст орад, касе мехоҳад, ки ҳадди аксар, ҳадди ақал ва миёна арзишҳои. Агар бисёр системаҳо ба базаи шумо маълумот нависанд, пас шумо наметавонед ҳамаи онҳоро якҷоя кунед. Шояд ҳар як система бориккунии гуногунро талаб кунад. Ва ин кор душвор аст.

Ва чизи дуюм ин аст, ки VictoriaMetrics, ба монанди ClickHouse, барои кор бо миқдори зиёди маълумоти хом оптимизатсия шудааст, аз ин рӯ, агар шумо дар системаи шумо ядроҳои зиёд дошта бошед, он метавонад дар муддати камтар аз як сония як миллиард хатро кашад. Сканкунии силсилаи вақт дар VictoriaMetrics - 50 нуқта дар як сония дар як ядро ​​​​. Ва ин иҷроиш ба ядроҳои мавҷуда миқёс дорад. Яъне, агар шумо 000 ядро ​​дошта бошед, масалан, шумо дар як сония миллиард нуқтаҳоро скан мекунед. Ва ин моликияти VictoriaMetrics ва ClickHouse эҳтиёҷоти поёнобро коҳиш медиҳад.

Хусусияти дигар ин аст, ки VictoriaMetrics ин маълумотро самаранок фишурда мекунад. Фишурда ба ҳисоби миёна дар истеҳсолот аз 0,4 то 0,8 байт дар як нуқта аст. Ҳар як нуқта тамғаи вақт + арзиш аст. Ва он ба ҳисоби миёна камтар аз як байт фишурда мешавад.

Сергей. Ман савол дорам. Кванти ҳадди ақали вақти сабт чанд аст?

Як миллисония. Мо ба наздикӣ бо дигар таҳиягарони пойгоҳи додаҳои силсилаи вақт сӯҳбат кардем. Ҳадди ақали вақти онҳо як сония аст. Ва дар Графит, масалан, он ҳам як сония аст. Дар OpenTSDB он инчунин як сония аст. InfluxDB дақиқии наносония дорад. Дар VictoriaMetrics ин як миллисония аст, зеро дар Прометей ин як миллисония аст. Ва VictoriaMetrics дар ибтидо ҳамчун нигаҳдории дурдаст барои Prometheus таҳия шудааст. Аммо ҳоло он метавонад маълумотро аз дигар системаҳо захира кунад.

Шахсе, ки ман бо онҳо сӯҳбат кардам, мегӯяд, ки онҳо дақиқии дуюм ба сония доранд - ин барои онҳо кофӣ аст, зеро он аз намуди маълумоте, ки дар пойгоҳи додаҳои силсилаи вақтҳо нигоҳ дошта мешавад, вобаста аст. Агар ин маълумоти DevOps ё маълумот аз инфрасохтор бошад, ки шумо онро бо фосилаи 30 сония дар як дақиқа ҷамъ мекунед, пас дақиқии дуюм кофӣ аст, ба шумо чизи камтаре лозим нест. Ва агар шумо ин маълумотро аз системаҳои савдои басомади баланд ҷамъ кунед, пас ба шумо дақиқии наносония лозим аст.

Аниқии миллисония дар VictoriaMetrics инчунин барои парвандаи DevOps мувофиқ аст ва метавонад барои аксари ҳолатҳое, ки ман дар аввали гузориш зикр кардам, мувофиқ бошад. Ягона чизе, ки барои он мувофиқ нест, ин системаҳои савдои басомади баланд аст.

Сипос! Ва саволи дигар. Мутобиқат дар PromQL чист?

Мутобиқати пурра ба ақиб. VictoriaMetrics PromQL-ро пурра дастгирӣ мекунад. Илова бар ин, он функсияҳои иловагии пешрафтаро дар PromQL, ки номида мешавад, илова мекунад MetricsQL. Дар бораи ин функсияи васеъ дар YouTube сухан меравад. Ман баҳор дар Санкт-Петербург дар ҷаласаи мониторингӣ сухан гуфта будам.

Канали телеграмма VictoriaMetrics.

Танҳо корбарони сабтиномшуда метавонанд дар пурсиш иштирок кунанд. даромад, Лутфан.

Чӣ шуморо аз гузаштан ба VictoriaMetrics ҳамчун нигаҳдории дарозмуддати Prometheus бозмедорад? (Дар шарҳҳо нависед, ман онро ба назарсанҷӣ илова мекунам))

  • 71,4%Ман Prometheus5-ро истифода намебарам

  • 28,6%Дар бораи VictoriaMetrics2 намедонистам

7 корбар овоз доданд. 12 корбар худдорӣ карданд.

Манбаъ: will.com

Илова Эзоҳ