{"id":80733,"date":"2020-05-08T13:42:31","date_gmt":"2020-05-08T11:42:31","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/go-optimizations-in-victoriametrics-aleksandr-valyalkin"},"modified":"2020-05-08T13:42:31","modified_gmt":"2020-05-08T11:42:31","slug":"go-optimizations-in-victoriametrics-aleksandr-valyalkin","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/go-optimizations-in-victoriametrics-aleksandr-valyalkin","title":{"rendered":"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043a\u043e\u043d\u0446\u0430 2019 \u0433\u043e\u0434\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0412\u0430\u043b\u044f\u043b\u043a\u0438\u043d\u0430 &quot;Go optimizations in VictoriaMetrics&quot;<\/strong><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/victoriametrics.com\/\">VictoriaMetrics<\/a><\/noindex> \u2014 nj\u00eb DBMS e shpejt\u00eb dhe e shkall\u00ebzueshme p\u00ebr ruajtjen dhe p\u00ebrpunimin e t\u00eb dh\u00ebnave n\u00eb form\u00ebn e seri temporale (nj\u00eb rekord formon koh\u00ebn dhe nj\u00eb grup vlerash p\u00ebrkat\u00ebse, p\u00ebr shembull, t\u00eb marra p\u00ebrmes sondazhit periodic t\u00eb gjendjes s\u00eb sensor\u00ebve ose mbledhjes s\u00eb metrikeve).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/dd13ec10594aeb138be29ce439cc476a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Ja nj\u00eb lidhje me videon e k\u00ebtij raporti \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/MZ5P21j_HLE\">https:\/\/youtu.be\/MZ5P21j_HLE<\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.google.com\/presentation\/d\/1k7OjHvxTHA7669MFwsNTCx8hII-a8lNvpmQetLxmrEU\/edit?usp=sharing\">Slajdet<\/a><\/noindex><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/0073390d6dbcc6ab3e5305907ac6a229.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Do t\u00eb flas pak p\u00ebr veten time. Un\u00eb jam Aleksand\u00ebr Valjalkin. Ja <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/valyala\">akunty i imi n\u00eb GitHub<\/a><\/noindex>. M\u00eb p\u00eblqen Go dhe optimizimi i performanc\u00ebs. Kam shkruar shum\u00eb biblioteka t\u00eb dobishme dhe ndonj\u00ebher\u00eb jo aq t\u00eb dobishme. Ato fillojn\u00eb ose me <code>fast<\/code>, ose me <code>quick<\/code> prefiksin. <\/p>\n<p><\/p>\n<p>Aktualisht po punoj mbi VictoriaMetrics. \u00c7far\u00eb \u00ebsht\u00eb kjo dhe \u00e7far\u00eb po b\u00ebj atje? P\u00ebr k\u00ebt\u00eb do t\u00eb flas n\u00eb k\u00ebt\u00eb prezantim. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/c9194bc3fee1f615d838979bec12f7d0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Plani i raportit \u00ebsht\u00eb si vijon:<\/p>\n<p><\/p>\n<ul>\n<li>Fillimisht do t'ju tregoj se \u00e7far\u00eb \u00ebsht\u00eb VictoriaMetrics. <\/li>\n<li>Pastaj do t\u00eb flas p\u00ebr seri temporale. <\/li>\n<li>M\u00eb pas do t\u00eb tregoj si funksionon baza e t\u00eb dh\u00ebnave t\u00eb seri temporale.<\/li>\n<li>M\u00eb tej do t\u00eb flas p\u00ebr arkitektur\u00ebn e baz\u00ebs s\u00eb t\u00eb dh\u00ebnave: \u00e7far\u00eb p\u00ebrfshin ajo.<\/li>\n<li>Dhe pastaj do t\u00eb kalojm\u00eb n\u00eb optimizimet q\u00eb ekzistojn\u00eb n\u00eb VictoriaMetrics. K\u00ebto jan\u00eb optimizimi i indeksit t\u00eb invers dhe optimizimi p\u00ebr implementimin e bitset n\u00eb Go.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/3e0244b6b6fe952f660e4a094778921a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c7far\u00eb \u00ebsht\u00eb VictoriaMetrics, a e di kush n\u00eb audienc\u00eb? Ehh, shum\u00eb njer\u00ebz tashm\u00eb e din\u00eb. Kjo \u00ebsht\u00eb nj\u00eb lajm i mir\u00eb. P\u00ebr ata q\u00eb nuk e din\u00eb \u2013 \u00ebsht\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash p\u00ebr seri kohore. Ajo bazohet n\u00eb arkitektur\u00ebn ClickHouse, duke p\u00ebrfshir\u00eb disa detaje t\u00eb zbatimit t\u00eb ClickHouse. P\u00ebr shembull, disa nga ato jan\u00eb: MergeTree, llogaritje paralele n\u00eb t\u00eb gjitha b\u00ebrthamat e disponueshme t\u00eb procesorit dhe optimizimi i performanc\u00ebs me pun\u00ebn mbi blloqet e t\u00eb dh\u00ebnave q\u00eb vendosen n\u00eb cache-in e procesorit. <\/p>\n<p><\/p>\n<p>VictoriaMetrics ofron kompresimin m\u00eb t\u00eb mir\u00eb t\u00eb t\u00eb dh\u00ebnave krahasuar me bazat e tjera t\u00eb t\u00eb dh\u00ebnave p\u00ebr seri kohore. <\/p>\n<p><\/p>\n<p>Ajo shkall\u00ebzohet n\u00eb m\u00ebnyr\u00eb vertikale \u2014 dometh\u00ebn\u00eb, mund t\u00eb shtoni m\u00eb shum\u00eb procesor\u00eb, m\u00eb shum\u00eb memorie RAM n\u00eb nj\u00eb kompjuter. VictoriaMetrics do t\u00eb shfryt\u00ebzoj\u00eb me sukses k\u00ebto burime t\u00eb disponueshme dhe do t\u00eb rris\u00eb performanc\u00ebn lineare.<\/p>\n<p><\/p>\n<p>Gjithashtu, VictoriaMetrics shkall\u00ebzohet horizontalisht \u2014 dometh\u00ebn\u00eb, mund t\u00eb shtoni n\u00ebn-produkte t\u00eb tjera n\u00eb klusterin VictoriaMetrics dhe performanca e saj do t\u00eb rritet pothuajse linearisht.<\/p>\n<p><\/p>\n<p>Si e keni kuptuar, VictoriaMetrics \u00ebsht\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash e shpejt\u00eb, sepse nuk mund t\u00eb flas p\u00ebr t\u00eb tjerat. Po ashtu, \u00ebsht\u00eb shkruar n\u00eb Go, prandaj po flas p\u00ebr t\u00eb n\u00eb k\u00ebt\u00eb mitap.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/0121c9baead722eb1fe22fb6f900d4ad.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kush e di se \u00e7far\u00eb \u00ebsht\u00eb nj\u00eb seri kohore? Shum\u00eb njer\u00ebz e din\u00eb. Nj\u00eb seri kohore \u00ebsht\u00eb nj\u00eb s\u00ebr\u00eb \u00e7ift\u00ebsh <code>(timestamp, vlera)<\/code>, ku k\u00ebto \u00e7ifte jan\u00eb t\u00eb renditura sipas koh\u00ebs. Vlera p\u00ebrfaq\u00ebson nj\u00eb num\u00ebr me pik\u00eb t\u00eb l\u00ebvizshme \u2013 float64.<\/p>\n<p><\/p>\n<p>\u00c7do seri kohore identifikohet n\u00eb m\u00ebnyr\u00eb unike nga nj\u00eb \u00e7el\u00ebs. \u00c7far\u00eb p\u00ebrb\u00ebn ky \u00e7el\u00ebs? Ai p\u00ebrb\u00ebhet nga nj\u00eb grup i pand\u00ebrprer\u00eb \u00e7ift\u00ebsh \u00e7el\u00ebs-vler\u00eb. <\/p>\n<p><\/p>\n<p>Ja nj\u00eb shembull i nj\u00eb serie kohore. \u00c7el\u00ebsi i k\u00ebsaj serie \u00ebsht\u00eb nj\u00eb list\u00eb \u00e7ift\u00ebsh: <code>__name__=&quot;cpu_usage&quot;<\/code> \u2013 ky \u00ebsht\u00eb emri i metrik\u00ebs, <code>instance=&quot;my-server&quot;<\/code> \u2014 ky \u00ebsht\u00eb kompjuteri ku \u00ebsht\u00eb mbledhur kjo metrik\u00eb, <code>datacenter=&quot;us-east&quot;<\/code> \u2014 ky \u00ebsht\u00eb qendra e t\u00eb dh\u00ebnave ku ndodhet ky kompjuter.<\/p>\n<p><\/p>\n<p>Kam marr\u00eb emrin e nj\u00eb serie kohore, e cila p\u00ebrb\u00ebhet nga tri \u00e7ift\u00eb \u00e7el\u00ebs-vler\u00eb. Ky \u00e7el\u00ebs ka nj\u00eb list\u00eb \u00e7ift\u00ebsh <code>(timestamp, vlera)<\/code>. <code>t1, t3, t3, ..., tN<\/code> \u2014 k\u00ebto jan\u00eb timestamps, <code>10, 20, 12, ..., 15<\/code> \u2014 vlerat p\u00ebrkat\u00ebse. Kjo \u00ebsht\u00eb p\u00ebrdorimi i CPU n\u00eb k\u00ebt\u00eb moment p\u00ebr k\u00ebt\u00eb seri.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/76cab9db0263318d355ac607ceb7e0f6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ku mund t\u00eb p\u00ebrdoren serit\u00eb kohore? Disa ide nga ndokush? <\/p>\n<p><\/p>\n<ul>\n<li>N\u00eb DevOps mund t\u00eb matni ngarkes\u00ebn e CPU, RAM, rrjetit, rps, numrin e gabimeve etj. <\/li>\n<li>IoT \u2013 ne mund t\u00eb masim temperatur\u00ebn, presionin, koordinatat gjeografike, dhe ndonj\u00eb gj\u00eb tjet\u00ebr.<\/li>\n<li>Po ashtu n\u00eb financa \u2013 mund t\u00eb monitorojm\u00eb \u00e7mimet e aksioneve dhe valutave t\u00eb ndryshme. <\/li>\n<li>P\u00ebr m\u00eb tep\u00ebr, serit\u00eb temporale mund t\u00eb p\u00ebrdoren p\u00ebr monitorimin e proceseve prodhuese n\u00eb fabrika. Kemi p\u00ebrdorues q\u00eb p\u00ebrdorin VictoriaMetrics p\u00ebr monitorimin e turbina eolik\u00eb dhe robot\u00ebve.<\/li>\n<li>Gjithashtu, serit\u00eb temporale jan\u00eb t\u00eb dobishme p\u00ebr mbledhjen e informacionit nga sensor\u00ebt e ndrysh\u00ebm t\u00eb pajisjeve. P\u00ebr shembull, p\u00ebr motorin; p\u00ebr matjen e presionit n\u00eb goma; p\u00ebr matjen e shpejt\u00ebsis\u00eb, distanc\u00ebs; p\u00ebr matjen e konsumit t\u00eb benzin\u00ebs, etj.<\/li>\n<li>Gjithashtu, serit\u00eb temporale mund t\u00eb p\u00ebrdoren p\u00ebr monitorimin e avion\u00ebve. \u00c7do avion ka nj\u00eb kutin\u00eb e zez\u00eb q\u00eb mbledh serit\u00eb temporale sipas parametrave t\u00eb ndrysh\u00ebm t\u00eb sh\u00ebndetit t\u00eb avionit. Serie temporale jepet gjithashtu n\u00eb industrin\u00eb aviacione. <\/li>\n<li>Sh\u00ebndet\u00ebsia \u2013 jan\u00eb presioni i gjakut, puls, etj.<\/li>\n<\/ul>\n<p><\/p>\n<p>Ndoshta ka edhe aplikime t\u00eb tjera q\u00eb kam harruar, por shpresoj q\u00eb keni kuptuar se serit\u00eb temporale p\u00ebrdoren aktivisht n\u00eb bot\u00ebn moderne. Dhe volumi i p\u00ebrdorimit t\u00eb tyre po rritet \u00e7do vit.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/f1da29d372163751268b6a8f86836d04.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u00ebr \u00e7far\u00eb i nevojitet nj\u00eb baz\u00eb t\u00eb dh\u00ebnash p\u00ebr serit\u00eb e tyre? Pse nuk mund t\u00eb p\u00ebrdoret nj\u00eb baz\u00eb e zakonshme relacionale p\u00ebr ruajtjen e serive t\u00eb tyre?<\/p>\n<p><\/p>\n<p>Sepse n\u00eb serit\u00eb e tyre zakonisht ka nj\u00eb volum t\u00eb madh informacioni, q\u00eb \u00ebsht\u00eb e v\u00ebshtir\u00eb t\u00eb ruhen dhe t\u00eb procesohen n\u00eb bazat e zakonshme t\u00eb dh\u00ebnash. Prandaj jan\u00eb shfaqur BD t\u00eb specializuara p\u00ebr serit\u00eb e dh\u00ebnash. K\u00ebto baza ruajn\u00eb n\u00eb m\u00ebnyr\u00eb efektive pikat <code>(timestamp, vlera)<\/code> me nj\u00eb \u00e7el\u00ebs t\u00eb caktuar. Ato ofrojn\u00eb nj\u00eb API p\u00ebr t\u00eb lexuar t\u00eb dh\u00ebnat e ruajtura sipas \u00e7el\u00ebsit, me nj\u00eb \u00e7ift \u00e7el\u00ebs-vler\u00eb, ose me disa t\u00eb tilla, ose sipas regexp. P\u00ebr shembull, n\u00ebse d\u00ebshironi t\u00eb gjeni ngarkes\u00ebn e procesorit t\u00eb t\u00eb gjith\u00eb sh\u00ebrbimeve tuaja n\u00eb qendr\u00ebn e t\u00eb dh\u00ebnave n\u00eb Amerik\u00eb, duhet t\u00eb p\u00ebrdorni nj\u00eb k\u00ebrkes\u00eb t\u00eb till\u00eb.<\/p>\n<p><\/p>\n<p>Zakonisht bazat e dh\u00ebnash p\u00ebr serit\u00eb e dh\u00ebnash paraqesin gjuh\u00eb t\u00eb specializuara k\u00ebrkese, sepse SQL p\u00ebr serit\u00eb e dh\u00ebnash nuk \u00ebsht\u00eb shum\u00eb i p\u00ebrshtatsh\u00ebm. Edhe pse ka baza t\u00eb dh\u00ebnash q\u00eb mb\u00ebshtesin SQL, ai nuk \u00ebsht\u00eb shum\u00eb i p\u00ebrshtatsh\u00ebm. M\u00eb mir\u00eb i p\u00ebrshtaten gjuh\u00ebt e k\u00ebrkesave si <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@valyala\/promql-tutorial-for-beginners-9ab455142085\">PromQL<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.influxdata.com\/influxdb\/v1.8\/query_language\/spec\/\">InfluxQL<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.influxdata.com\/products\/flux\/\">Flux<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/code.kx.com\/q\/\">Q<\/a><\/noindex>. Shpresoj q\u00eb dikush t\u00eb ket\u00eb d\u00ebgjuar p\u00ebr ndonj\u00eb prej k\u00ebtyre gjuh\u00ebve. O PromQL, ndoshta, kan\u00eb d\u00ebgjuar shum\u00eb. Kjo \u00ebsht\u00eb gjuh\u00eb k\u00ebrkese e Prometheus.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/59e5b6d82a2f7861077bc5fe34519ee4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ja si \u00ebsht\u00eb nd\u00ebrtimi i arkitektur\u00ebs moderne t\u00eb nj\u00eb baze t\u00eb dh\u00ebnash p\u00ebr serit\u00eb kohore n\u00eb shembullin e VictoriaMetrics.<\/p>\n<p><\/p>\n<p>Ajo p\u00ebrb\u00ebhet nga dy pjes\u00eb. Kjo \u00ebsht\u00eb nj\u00eb depo p\u00ebr indeksin e inverzuar dhe nj\u00eb depo p\u00ebr vlerat e serive kohore. K\u00ebto depove jan\u00eb t\u00eb ndara. <\/p>\n<p><\/p>\n<p>Kur nj\u00eb regjistrim i ri vjen n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave, ne s\u00eb pari referohemi n\u00eb indeksin e inverzuar p\u00ebr t\u00eb gjetur identifikuesin e seris\u00eb kohore sipas nj\u00eb grupi t\u00eb caktuar <code>label=value<\/code> p\u00ebr k\u00ebt\u00eb metrik\u00eb. E gjejm\u00eb k\u00ebt\u00eb identifikues dhe ruajm\u00eb vler\u00ebn n\u00eb depo.<\/p>\n<p><\/p>\n<p>Kur vjen ndonj\u00eb k\u00ebrkes\u00eb p\u00ebr marrjen e t\u00eb dh\u00ebnave nga TSDB, ne n\u00eb radh\u00eb t\u00eb par\u00eb shkojm\u00eb n\u00eb indeksin e inverzuar. Nxjerrim t\u00eb gjitha <code>timeseries_ids<\/code> regjistrimet q\u00eb korrespondojn\u00eb me k\u00ebt\u00eb grup <code>label=value<\/code>. Dhe m\u00eb pas e nxjerrim t\u00eb gjitha t\u00eb dh\u00ebnat e nevojshme nga depon e t\u00eb dh\u00ebnave, e indeksuar sipas <code>timeseries_ids<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/eb9b36fa3c6de2188b97b56ad3839b2c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le t\u00eb shqyrtojm\u00eb nj\u00eb shembull se si baza e t\u00eb dh\u00ebnave p\u00ebr serit\u00eb kohore trajton nj\u00eb k\u00ebrkes\u00eb select t\u00eb ardhshme.<\/p>\n<p><\/p>\n<ul>\n<li>S\u00eb pari, ajo nxjerr t\u00eb gjitha <code>timeseries_ids<\/code> nga indeksi i inverzuar, t\u00eb cilat p\u00ebrmbajn\u00eb \u00e7iftet e caktuara <code>label=value<\/code>, ose q\u00eb i p\u00ebrgjigjen nj\u00eb shprehjeje rregullt t\u00eb caktuar.<\/li>\n<li>M\u00eb pas ajo nxjerr t\u00eb gjitha pikat e t\u00eb dh\u00ebnave nga depoja e t\u00eb dh\u00ebnave n\u00eb nj\u00eb interval t\u00eb caktuar kohor p\u00ebr ato t\u00eb gjetura. <code>timeseries_ids<\/code>.<\/li>\n<li>Pas k\u00ebsaj, databaza kryen disa llogaritje mbi k\u00ebto data points, sipas k\u00ebrkes\u00ebs s\u00eb p\u00ebrdoruesit. Dhe pas k\u00ebsaj, kthen nj\u00eb p\u00ebrgjigje.<\/li>\n<\/ul>\n<p><\/p>\n<p>N\u00eb k\u00ebt\u00eb prezantim do t'ju tregoj p\u00ebr pjes\u00ebn e par\u00eb. Kjo \u00ebsht\u00eb k\u00ebrkimi <code>timeseries_ids<\/code> n\u00eb indeksin e invertuar. P\u00ebr pjes\u00ebn e dyt\u00eb dhe t\u00eb tret\u00eb mund t\u00eb shikoni m\u00eb von\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/VictoriaMetrics\/VictoriaMetrics\">burimet e VictoriaMetrics<\/a><\/noindex>, ose t\u00eb prisni deri sa t\u00eb p\u00ebrgatis dokumente t\u00eb tjera \ud83d\ude42<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/3a7dab707dd1defb9bc674a342052a03.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le t'ia fillojm\u00eb indeksit t\u00eb invertuar. Disa mund t\u00eb mendojn\u00eb se \u00ebsht\u00eb e thjesht\u00eb. Kush e di se \u00e7far\u00eb \u00ebsht\u00eb nj\u00eb indeks i invertuar dhe si funksionon? Oh, tashm\u00eb nuk ka shum\u00eb njer\u00ebz. Le t'\u00eb p\u00ebrpiqemi t\u00eb kuptojm\u00eb se \u00e7far\u00eb \u00ebsht\u00eb kjo. <\/p>\n<p><\/p>\n<p>N\u00eb t\u00eb v\u00ebrtet\u00eb, gjith\u00e7ka \u00ebsht\u00eb e thjesht\u00eb. Ky \u00ebsht\u00eb thjesht nj\u00eb fjalor q\u00eb shfaq \u00e7el\u00ebsin n\u00eb vler\u00eb. \u00c7far\u00eb \u00ebsht\u00eb \u00e7el\u00ebsi? Ky \u00e7ift <code>label=value<\/code>, ku <code>etiket\u00eb<\/code> dhe <code>vlera<\/code> \u2013 jan\u00eb strings. Dhe vlerat jan\u00eb nj\u00eb grup <code>timeseries_ids<\/code>, i cili p\u00ebrfshin \u00e7iftin e caktuar <code>label=value<\/code>.<\/p>\n<p><\/p>\n<p>Indeksi i invertuar lejon t\u00eb gjeni shpejt t\u00eb gjitha <code>timeseries_ids<\/code>, t\u00eb cilat kan\u00eb t\u00eb caktuara <code>label=value<\/code>.<\/p>\n<p><\/p>\n<p>Po ashtu, ai lejon t\u00eb gjeni shpejt <code>timeseries_ids<\/code> serit\u00eb e koh\u00ebs p\u00ebr disa \u00e7ifte <code>label=value<\/code>, ose p\u00ebr \u00e7ifte <code>label=regexp<\/code>. Si ndodhi kjo? P\u00ebrmes gjetjes s\u00eb kryq\u00ebzimit t\u00eb shum\u00ebllojshm\u00ebris\u00eb <code>timeseries_ids<\/code> p\u00ebr \u00e7do \u00e7ift <code>label=value<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/837a15a078e8c9422c721f3f072c0c09.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le t\u00eb shqyrtojm\u00eb realizime t\u00eb ndryshme t\u00eb indeksit t\u00eb inkorporuar. Le t\u00eb fillojm\u00eb me realizimin m\u00eb t\u00eb thjesht\u00eb naiv. Ai duket k\u00ebshtu. <\/p>\n<p><\/p>\n<p>Funksioni <code>getMetricIDs<\/code> merr list\u00ebn e rreshtave. \u00c7do rresht p\u00ebrmban <code>label=value<\/code>. Kjo funksion kthen nj\u00eb list\u00eb <code>metricIDs<\/code>.<\/p>\n<p><\/p>\n<p>Si funksionon kjo? K\u00ebtu kemi nj\u00eb variab\u00ebl globale q\u00eb quhet <code>invertedIndex<\/code>. Ky \u00ebsht\u00eb nj\u00eb fjalor i zakonsh\u00ebm (<code>map<\/code>), q\u00eb shnd\u00ebrron rreshtin n\u00eb nj\u00eb slice int-\u00ebsh. Rreshti p\u00ebrmban <code>label=value<\/code>.<\/p>\n<p><\/p>\n<p>Realizimi i funksionit: nxjerrim <code>metricIDs<\/code> p\u00ebr t\u00eb parin <code>label=value<\/code>, pastaj kalojm\u00eb p\u00ebrmes gjith\u00eb t\u00eb tjer\u00ebve <code>label=value<\/code>, nxjerrim <code>metricIDs<\/code> p\u00ebr ta. Dhe th\u00ebrrasim funksionin <code>intersectInts<\/code>, p\u00ebr t\u00eb cilin do t\u00eb flitet m\u00eb von\u00eb. Dhe ky funksion kthen kryq\u00ebzimin e k\u00ebtyre listave.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/709beca79884a9693098781974c26f4d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si\u00e7 e shihni, realizimi i indeksit t\u00eb inkorporuar nuk \u00ebsht\u00eb shum\u00eb i komplikuar. Por kjo \u00ebsht\u00eb nj\u00eb realizim naiv. \u00c7far\u00eb t\u00eb metash ka? T\u00eb met\u00ebn kryesore t\u00eb realizimit naiv \u00ebsht\u00eb se ky indeks i inkorporuar ruhet n\u00eb memorie. Pas ribllokimit t\u00eb aplikacionit, ne e humbasim k\u00ebt\u00eb indeks. Nuk ka ruajtje t\u00eb k\u00ebtij indeksi n\u00eb disk. P\u00ebr nj\u00eb baz\u00eb t\u00eb dh\u00ebnash, ky indeks i inkorporuar v\u00ebshtir\u00eb se do t\u00eb p\u00ebrshtatet.<\/p>\n<p><\/p>\n<p>K\u00ebtu \u00ebsht\u00eb nj\u00eb problem i dyt\u00eb i lidhur me memorie. Indeksi i p\u00ebrmbysur duhet t\u00eb ruhet n\u00eb memorien operative. N\u00ebse e kalon p\u00ebrmas\u00ebn e memories operative, \u00ebsht\u00eb e qart\u00eb se do t\u00eb marrim nj\u00eb \u2013 gabim out of memory. Dhe programi nuk do t\u00eb funksionoj\u00eb.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/495394168ac03aa8cbcf56ccad1cb2b8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ky problem mund t\u00eb zgjidhet me zgjidhje t\u00eb gatshme si\u00e7 jan\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/google\/leveldb\">LevelDB<\/a><\/noindex>, ose <noindex><a rel=\"nofollow\" href=\"https:\/\/rocksdb.org\/\">RocksDB<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>N\u00eb p\u00ebrmbledhje, na nevojitet nj\u00eb baz\u00eb t\u00eb dh\u00ebnash q\u00eb lejon t\u00eb b\u00ebjm\u00eb shpejt tre operacione. <\/p>\n<p><\/p>\n<ul>\n<li>Operacioni i par\u00eb \u2013 \u00ebsht\u00eb regjistrimi <code>\u00e7el\u00ebs-vler\u00eb<\/code> n\u00eb k\u00ebt\u00eb baz\u00eb. Ajo e b\u00ebn k\u00ebt\u00eb shum\u00eb shpejt, ku <code>\u00e7el\u00ebs-vler\u00eb<\/code> jan\u00eb vargje t\u00eb rast\u00ebsishme. <\/li>\n<li>Operacioni i dyt\u00eb \u2013 \u00ebsht\u00eb k\u00ebrkimi i shpejt\u00eb i vler\u00ebs p\u00ebr nj\u00eb \u00e7el\u00ebs t\u00eb caktuar.<\/li>\n<li>Dhe operacioni i tret\u00eb \u2013 \u00ebsht\u00eb k\u00ebrkimi i shpejt\u00eb i t\u00eb gjitha vlerave p\u00ebr nj\u00eb prefiks t\u00eb caktuar. <\/li>\n<\/ul>\n<p><\/p>\n<p>LevelDB dhe RocksDB \u2013 k\u00ebto baza jan\u00eb zhvilluar n\u00eb Google dhe Facebook. Fillimisht u shfaq LevelDB. Pjesa tjet\u00ebr nga Facebook e mori LevelDB dhe filloi ta p\u00ebrmir\u00ebsoj\u00eb, duke krijuar RocksDB. Tani, n\u00eb Facebook, pothuajse t\u00eb gjitha bazat e t\u00eb dh\u00ebnave t\u00eb brendshme punojn\u00eb me RocksDB, p\u00ebrfshir\u00eb MySQL q\u00eb e kan\u00eb kaluar n\u00eb RocksDB. Ata e quajt\u00ebn <noindex><a rel=\"nofollow\" href=\"http:\/\/myrocks.io\/\">MyRocks<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Indeksi i p\u00ebrmbysur mund t\u00eb realizohet me LevelDB. Si e b\u00ebjm\u00eb k\u00ebt\u00eb? Ruajm\u00eb si \u00e7el\u00ebs <code>label=value<\/code>. Dhe si vler\u00eb \u2013 identifikuesin e seris\u00eb temporale, ku ndodhet \u00e7ifti <code>label=value<\/code>.<\/p>\n<p><\/p>\n<p>N\u00ebse kemi shum\u00eb seri temporale me k\u00ebt\u00eb \u00e7ift <code>label=value<\/code>, do t\u00eb ket\u00eb shum\u00eb rreshta n\u00eb k\u00ebt\u00eb baz\u00eb t\u00eb dh\u00ebnash me t\u00eb nj\u00ebjtin \u00e7el\u00ebs dhe t\u00eb ndrysh\u00ebm <code>timeseries_ids<\/code>. P\u00ebr t\u00eb marr\u00eb nj\u00eb list\u00eb t\u00eb gjith\u00eb <code>timeseries_ids<\/code>, q\u00eb fillojn\u00eb me k\u00ebt\u00eb <code>label=prefix<\/code>, ne b\u00ebjm\u00eb nj\u00eb skanim t\u00eb gam\u00ebs, p\u00ebr t\u00eb cilin \u00ebsht\u00eb optimizuar kjo baz\u00eb e t\u00eb dh\u00ebnave. Dometh\u00ebn\u00eb, zgjedhim t\u00eb gjith\u00eb rreshtat q\u00eb fillojn\u00eb me <code>label=prefix<\/code> dhe marrim t\u00eb nevojshmet <code>timeseries_ids<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/a40877ecb758ac3bc1979bcd568d7e83.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ja implementimi i p\u00ebraf\u00ebrt, si do t\u00eb dukej n\u00eb Go. Ne kemi nj\u00eb indeks t\u00eb inversuar. Kjo \u00ebsht\u00eb LevelDB.<\/p>\n<p><\/p>\n<p>Funksioni \u00ebsht\u00eb i nj\u00ebjt\u00eb, si p\u00ebr implementimin naive. Ajo pothuajse p\u00ebrs\u00ebrit rresht n\u00eb rresht implementimin naive. Vet\u00ebm momenti \u00ebsht\u00eb, q\u00eb n\u00eb vend t\u00eb aksesit te <code>map<\/code> ne i qasem indeksit t\u00eb inversuar. Marrim t\u00eb gjitha vlerat p\u00ebr t\u00eb par\u00ebn <code>label=value<\/code>. Pastaj kalojm\u00eb p\u00ebrmes t\u00eb gjitha \u00e7ift\u00ebve t\u00eb mbetur <code>label=value<\/code> dhe marrim grupet p\u00ebrkat\u00ebse t\u00eb metricIDs p\u00ebr ta. M\u00eb pas gjejm\u00eb nd\u00ebrprerjen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/de11b15286816ada04b22727ff78e43d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Duket gjith\u00e7ka mir\u00eb, por n\u00eb k\u00ebt\u00eb zgjidhje ka disavantazhe. VictoriaMetrics fillimisht implementoi indeksin e inversuar mbi baz\u00ebn e LevelDB. Por n\u00eb fund, iu desh t\u00eb heq\u00eb dor\u00eb nga ai.<\/p>\n<p><\/p>\n<p>Pse? Sepse LevelDB \u00ebsht\u00eb m\u00eb i ngadalsh\u00ebm se implementimi naive. N\u00eb implementimin naive, p\u00ebr \u00e7el\u00ebsin e dh\u00ebn\u00eb ne menj\u00ebher\u00eb marrim t\u00eb gjith\u00eb slice-in <code>metricIDs<\/code>. Kjo \u00ebsht\u00eb nj\u00eb operacion shum\u00eb i shpejt\u00eb \u2014 e gjith\u00eb slice \u00ebsht\u00eb gati p\u00ebr p\u00ebrdorim.<\/p>\n<p><\/p>\n<p>N\u00eb LevelDB, gjat\u00eb \u00e7do thirrjeje t\u00eb funksionit <code>GetValues<\/code> duhet t\u00eb kalosh p\u00ebrmes t\u00eb gjitha rreshtave q\u00eb fillojn\u00eb me <code>label=value<\/code>. Dhe p\u00ebr secilin rresht t\u00eb nxjerr\u00ebsh vler\u00ebn <code>timeseries_ids<\/code>. Nga t\u00eb till\u00eb <code>timeseries_ids<\/code> t\u00eb grumbullosh nj\u00eb slice t\u00eb k\u00ebtyre <code>timeseries_ids<\/code>. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0439, \u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043e\u0431\u044b\u0447\u043d\u043e\u043c\u0443 map&#8217;\u0443 \u043f\u043e \u043a\u043b\u044e\u0447\u0443.<\/p>\n<p><\/p>\n<p>Mungesa e dyt\u00eb \u00ebsht\u00eb se LevelDB \u00ebsht\u00eb shkruar n\u00eb C. Qasja n\u00eb funksionet C nga Go nuk \u00ebsht\u00eb shum\u00eb e shpejt\u00eb. Kjo merr qindra nanosekonda. Kjo nuk \u00ebsht\u00eb shum\u00eb e shpejt\u00eb, sepse n\u00eb krahasim me nj\u00eb thirrje t\u00eb zakonshme t\u00eb funksionit t\u00eb shkruar n\u00eb Go, q\u00eb z\u00eb 1-5 nanosekonda, diferenca n\u00eb performanc\u00eb \u00ebsht\u00eb shum\u00ebfish m\u00eb e madhe. P\u00ebr VictoriaMetrics, ky ishte nj\u00eb disavantazh fatal \ud83d\ude42<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/47cace825807b7b062064c2e790dc9d3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prandaj, un\u00eb shkrova nj\u00eb implementim t\u00eb vetin t\u00eb indeksit t\u00eb inversuar. Dhe e quajta <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/VictoriaMetrics\/VictoriaMetrics\/tree\/master\/lib\/mergeset\">mergeset<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Mergeset \u00ebsht\u00eb e bazuar n\u00eb struktur\u00ebn e t\u00eb dh\u00ebnave MergeTree. Kjo struktur\u00eb t\u00eb dh\u00ebnash \u00ebsht\u00eb marr\u00eb nga ClickHouse. E qart\u00eb \u00ebsht\u00eb se mergeset duhet t\u00eb jet\u00eb e optimizuar p\u00ebr k\u00ebrkime t\u00eb shpejta <code>timeseries_ids<\/code> p\u00ebr nj\u00eb \u00e7el\u00ebs t\u00eb caktuar. Mergeset \u00ebsht\u00eb shkruar plot\u00ebsisht n\u00eb Go. Ju mund t\u00eb shikoni <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/VictoriaMetrics\/VictoriaMetrics\">kodin burimor t\u00eb VictoriaMetrics n\u00eb GitHub<\/a><\/noindex>. Implementimi i mergeset ndodhet n\u00eb dosjen <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/VictoriaMetrics\/VictoriaMetrics\/tree\/master\/lib\/mergeset\">\/lib\/mergeset<\/a><\/noindex>. Ju mund t\u00eb provoni t\u00eb kuptoni se \u00e7far\u00eb ndodh atje.<\/p>\n<p><\/p>\n<p>API mergeset \u00ebsht\u00eb shum\u00eb i ngjash\u00ebm me LevelDB dhe RocksDB. Kjo do t\u00eb thot\u00eb se ai lejon ruajtjen e shpejt\u00eb t\u00eb sh\u00ebnimeve t\u00eb reja dhe shfryt\u00ebzimin e shpejt\u00eb t\u00eb sh\u00ebnimeve sipas nj\u00eb prefiksi t\u00eb caktuar.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/845704ed36f70beb468907d22701af59.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u00ebr disavantazhet e mergeset do t\u00eb flasim m\u00eb von\u00eb. Tani do t\u00eb diskutojm\u00eb p\u00ebr problemet q\u00eb jan\u00eb shfaqur me VictoriaMetrics n\u00eb produksion gjat\u00eb implementimit t\u00eb indeksit t\u00eb invertuar.<\/p>\n<p><\/p>\n<p>Pse ndodhen ato?<\/p>\n<p><\/p>\n<p>Arsyeja e par\u00eb \u00ebsht\u00eb shkalla e lart\u00eb e p\u00ebrmbysjes. N\u00eb p\u00ebrkthim n\u00eb shqip \u2013 kjo do t\u00eb thot\u00eb ndryshimi i shpesht\u00eb i serive temporale. Kjo ndodh kur nj\u00eb seri temporale p\u00ebrfundon dhe fillon nj\u00eb tjet\u00ebr, ose fillojn\u00eb shum\u00eb seria t\u00eb reja. Dhe kjo ndodh shpesh.<\/p>\n<p><\/p>\n<p>Arsyeja e dyt\u00eb \u00ebsht\u00eb numri i madh i serive temporale. N\u00eb fillim, kur monitorimi po p\u00ebrhapej, numri i serive temporale ishte i vog\u00ebl. P\u00ebr shembull, p\u00ebr \u00e7do kompjuter, duhet t\u00eb monitoroni ngarkes\u00ebn e procesorit, kujtes\u00ebs, rrjetit dhe disqet. 4 seri temporale p\u00ebr \u00e7do kompjuter. Keni, p\u00ebr shembull, 100 kompjuter\u00eb dhe 400 seria temporale. Kjo \u00ebsht\u00eb shum\u00eb pak. <\/p>\n<p><\/p>\n<p>Me koh\u00eb, njer\u00ebzit shpik\u00ebn m\u00ebnyra p\u00ebr t\u00eb matur informacion m\u00eb t\u00eb detajuar. P\u00ebr shembull, t\u00eb mat\u00ebsh ngarkes\u00ebn jo t\u00eb gjith\u00eb procesorit, por ve\u00e7 e ve\u00e7 t\u00eb \u00e7do b\u00ebrthame procesori. N\u00ebse keni 40 b\u00ebrtha procesori, at\u00ebher\u00eb, sigurisht, keni 40 her\u00eb m\u00eb shum\u00eb radh\u00eb t\u00eb cil\u00ebsuara p\u00ebr matjen e ngarkes\u00ebs s\u00eb procesorit. <\/p>\n<p><\/p>\n<p>Por kjo nuk \u00ebsht\u00eb gjith\u00e7ka. \u00c7do b\u00ebrtham\u00eb procesori mund t\u00eb ket\u00eb disa gjendje si idle, kur \u00ebsht\u00eb n\u00eb pritje. Gjithashtu, operimi n\u00eb hap\u00ebsir\u00ebn e p\u00ebrdoruesit, operimi n\u00eb hap\u00ebsir\u00ebn e b\u00ebrtham\u00ebs dhe gjendje t\u00eb tjera. Dhe \u00e7do gjendje e till\u00eb gjithashtu mund t\u00eb matet si nj\u00eb radh\u00eb e ve\u00e7ant\u00eb. Kjo shton p\u00ebr afro 7-8 her\u00eb numrin e radh\u00ebve.<\/p>\n<p><\/p>\n<p>Nga nj\u00eb metrik\u00eb, kemi marr\u00eb 40 x 8 = 320 metrika vet\u00ebm p\u00ebr nj\u00eb kompjuter. Po e shum\u00ebfishojm\u00eb me 100, dhe marrim 32,000 n\u00eb vend t\u00eb 400. <\/p>\n<p><\/p>\n<p>M\u00eb pas erdhi Kubernetes. Dhe ende nuk u p\u00ebrmir\u00ebsua, sepse n\u00eb Kubernetes mund t\u00eb hostohen shum\u00eb sh\u00ebrbime t\u00eb ndryshme. \u00c7do sh\u00ebrbim n\u00eb Kubernetes p\u00ebrb\u00ebhet nga shum\u00eb pod\u00eb. T\u00eb gjitha k\u00ebto duhen monitoruar. P\u00ebrve\u00e7 k\u00ebsaj, ne kemi nj\u00eb zhvillim t\u00eb vazhduesh\u00ebm t\u00eb versioneve t\u00eb reja t\u00eb sh\u00ebrbimeve tuaja. P\u00ebr \u00e7do version t\u00eb ri, duhet t\u00eb krijohen rreshta t\u00eb rinj temporal. Si rezultat, numri i rreshtave temporal rritet n\u00eb m\u00ebnyr\u00eb eksponenciale dhe p\u00ebrballemi me problemin e nj\u00eb numri t\u00eb madh rreshtash temporal, i njohur si high-cardinality. VictoriaMetrics e zgjidh k\u00ebt\u00eb m\u00eb me sukses krahasuar me bazat e tjera t\u00eb t\u00eb dh\u00ebnave p\u00ebr rreshta temporal. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/c11b7ce6d3294ae420243f72636af4b9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le t\u00eb shqyrtojm\u00eb m\u00eb me holl\u00ebsi high churn rate. P\u00ebr \u00e7far\u00eb arsye krijohet high churn rate n\u00eb production? Sepse disa vlera etiketash dhe tag\u00ebsh ndryshojn\u00eb vazhdimisht.<\/p>\n<p><\/p>\n<p>P\u00ebr shembull, t\u00eb marim Kubernetes, n\u00eb t\u00eb cilin ka nj\u00eb koncept <code>deployment<\/code>, \u0442. \u0435. \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Kubernetes \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u0440\u0435\u0448\u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c id\u2019\u0448\u043a\u0443 deployment&#8217;\u0430 \u0432 label.<\/p>\n<p><\/p>\n<p>\u041a \u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u043b\u043e? \u041a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043d\u043e\u0432\u043e\u043c deployment&#8217;\u0435 \u0443 \u043d\u0430\u0441 \u0432\u0441\u0435 \u0441\u0442\u0430\u0440\u044b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0440\u044f\u0434\u044b \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f, \u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0438\u0445 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0440\u044f\u0434\u044b \u0441 \u043d\u043e\u0432\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043b\u0435\u0439\u0431\u043b\u0430 <code>deployment_id<\/code>. Mund t\u00eb ket\u00eb qindra mij\u00ebra dhe madje miliona t\u00eb tilla.<\/p>\n<p><\/p>\n<p>Nj\u00eb karakteristik\u00eb e r\u00ebnd\u00ebsishme e gjith\u00e7kaje \u00ebsht\u00eb se numri total i serive temporale po rritet, por numri i serive temporale q\u00eb jan\u00eb aktualisht aktive, p\u00ebr t\u00eb cilat po vijn\u00eb t\u00eb dh\u00ebna, mbetet konstant. Ky gjendje quhet \u2013 shkall\u00eb e lart\u00eb e ndryshueshm\u00ebris\u00eb.<\/p>\n<p><\/p>\n<p>Problemi kryesor i shkall\u00ebs s\u00eb lart\u00eb t\u00eb ndryshueshm\u00ebris\u00eb \u00ebsht\u00eb t\u00eb sigurohet nj\u00eb shpejt\u00ebsi e vazhdueshme e k\u00ebrkimit p\u00ebr t\u00eb gjitha serit\u00eb temporale sipas nj\u00eb grupi t\u00eb caktuar etiketash p\u00ebr nj\u00eb interval t\u00eb caktuar kohe. Zakonisht ky \u00ebsht\u00eb nj\u00eb interval kohe p\u00ebr or\u00ebn e fundit ose p\u00ebr dit\u00ebn e fundit. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/ac18482b87cc37624d163b30c68cf7be.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si mund ta zgjidhim k\u00ebt\u00eb problem? Kjo \u00ebsht\u00eb nj\u00eb mund\u00ebsi e par\u00eb. T\u00eb ndajm\u00eb indeksin e kthyer n\u00eb pjes\u00eb t\u00eb pavarura mbi baz\u00eb t\u00eb koh\u00ebs. Kjo do t\u00eb thot\u00eb se kalon nj\u00eb interval kohe, p\u00ebrfundojm\u00eb pun\u00ebn me indeksin e kthyer aktual. Dhe krijojm\u00eb nj\u00eb indeks t\u00eb ri t\u00eb kthyer. Kalon nj\u00eb tjet\u00ebr interval kohe, krijojm\u00eb nj\u00eb tjet\u00ebr dhe nj\u00eb tjet\u00ebr. <\/p>\n<p><\/p>\n<p>Dhe kur seleksionojm\u00eb nga k\u00ebto indekse t\u00eb kthyer, ne gjejm\u00eb nj\u00eb grup indekse t\u00eb kthyer q\u00eb bien brenda intervalit t\u00eb caktuar. Dhe, p\u00ebr pasoj\u00eb, p\u00ebrzgjedhim nga aty id-t\u00eb e serive temporale. <\/p>\n<p><\/p>\n<p>Kjo lejon q\u00eb t\u00eb kursejm\u00eb burimet, sepse nuk na nevojitet t\u00eb shqyrtojm\u00eb pjes\u00eb q\u00eb nuk bien brenda intervalit t\u00eb caktuar. Pra, zakonisht, n\u00ebse zgjedhim t\u00eb dh\u00ebnat p\u00ebr or\u00ebn e fundit, ne i kalojm\u00eb k\u00ebrkesat p\u00ebr intervalet e m\u00ebparshme t\u00eb koh\u00ebs. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/1afa3a88caa7423941ae3494b9cec706.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ka nj\u00eb mund\u00ebsi tjet\u00ebr p\u00ebr t\u00eb zgjidhur k\u00ebt\u00eb problem. Kjo \u00ebsht\u00eb mbajtja e nj\u00eb liste t\u00eb ve\u00e7ant\u00eb t\u00eb identifikuesve t\u00eb serive kohore p\u00ebr \u00e7do dit\u00eb, t\u00eb cilat jan\u00eb hasur gjat\u00eb asaj dite.<\/p>\n<p><\/p>\n<p>Avantazhi i k\u00ebtij zgjidhjeje n\u00eb krahasim me zgjidhjen e m\u00ebparshme \u00ebsht\u00eb se ne nuk e p\u00ebrs\u00ebrisim informacionin mbi serit\u00eb kohore q\u00eb nuk zhduken me kalimin e koh\u00ebs. Ato jan\u00eb vazhdimisht aty dhe nuk ndryshojn\u00eb. <\/p>\n<p><\/p>\n<p>Megjithat\u00eb, ky zgjidhje \u00ebsht\u00eb m\u00eb e komplikuar p\u00ebr t'u zbatuar dhe m\u00eb sfiduese p\u00ebr tu debuguar. VictoriaMetrics ka zgjedhur k\u00ebt\u00eb zgjidhje, e cila \u00ebsht\u00eb formuar historikisht. Kjo zgjidhje gjithashtu tregon rezultate t\u00eb mira krahasuar me t\u00eb kaluar\u00ebn. P\u00ebr shkak se kjo zgjidhje nuk u implementua sepse duhej t\u00eb dyfishoheshin t\u00eb dh\u00ebnat n\u00eb \u00e7do ndarje p\u00ebr serit\u00eb temporale q\u00eb nuk ndryshojn\u00eb, pra q\u00eb nuk zhduken me kalimin e koh\u00ebs. VictoriaMetrics u optimizua kryesisht p\u00ebr konsumimin e hap\u00ebsir\u00ebs n\u00eb disk, dhe implementimi i m\u00ebparsh\u00ebm p\u00ebrkeq\u00ebsoi konsumimin e saj. Kjo implementim tani \u00ebsht\u00eb m\u00eb i p\u00ebrshtatsh\u00ebm p\u00ebr minimizimin e konsumit t\u00eb hap\u00ebsir\u00ebs n\u00eb disk, prandaj u zgjodh. <\/p>\n<p><\/p>\n<p>Kisha nevoj\u00eb t\u00eb p\u00ebrballesha me t\u00eb. Lufta ishte se n\u00eb k\u00ebt\u00eb implementim duhet t\u00eb zgjidhet nj\u00eb num\u00ebr shum\u00eb m\u00eb i madh <code>timeseries_ids<\/code> i t\u00eb dh\u00ebnave se sa kur indeksi i invertuar ndahet n\u00eb koh\u00eb.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/5b10e61aaa803428ed3bfe31815f09d3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si e zgjidh\u00ebm k\u00ebt\u00eb problem? E zgjidh\u00ebm n\u00eb nj\u00eb m\u00ebnyr\u00eb origjinale - duke ruajtur disa identifikues t\u00eb serive temporale n\u00eb \u00e7do regjistrim t\u00eb indeksit t\u00eb invertuar n\u00eb vend t\u00eb nj\u00eb identifikuesi. Pra, ne kemi nj\u00eb \u00e7el\u00ebs <code>label=value<\/code>, i cila gjendet n\u00eb \u00e7do rresht temporal. Dhe tani ne ruajm\u00eb disa <code>timeseries_ids<\/code> n\u00eb nj\u00eb regjistrim.<\/p>\n<p><\/p>\n<p>K\u00ebtu \u00ebsht\u00eb nj\u00eb shembull. M\u00eb par\u00eb ne kishim N regjistrime, tani kemi nj\u00eb regjistrim, me prefiksin e nj\u00ebjt\u00eb si t\u00eb gjith\u00eb t\u00eb tjer\u00ebt. Nj\u00eb regjistrim t\u00eb m\u00ebparsh\u00ebm kishte nj\u00eb vler\u00eb q\u00eb p\u00ebrmban t\u00eb gjith\u00eb id-et e rreshtave temporale. <\/p>\n<p><\/p>\n<p>Kjo ka lejuar t\u00eb rritet shpejt\u00ebsia e skanimit t\u00eb k\u00ebtij indeksi t\u00eb p\u00ebrmbysur deri n\u00eb 10 her\u00eb. Dhe ka lejuar t\u00eb ulet konsumimi i memories p\u00ebr cache, sepse tani ruajm\u00eb rreshtin <code>label=value<\/code> vet\u00ebm nj\u00eb her\u00eb n\u00eb cache s\u00eb bashku me N her\u00eb. Dhe ky rresht mund t\u00eb jet\u00eb i madh, n\u00ebse gjat\u00eb etiketimit dhe etiketave ruani rreshta t\u00eb gjat\u00eb q\u00eb i p\u00eblqen t\u00eb vendos\u00eb aty Kubernetes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/ae4f38a440203bad2d03cf2abd1faafe.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nj\u00eb tjet\u00ebr variant p\u00ebr shpejt\u00ebsimin e k\u00ebrkimeve n\u00eb indekset e p\u00ebrmbysura \u00ebsht\u00eb sharding. Krijimi i disa indekseve t\u00eb p\u00ebrmbysura n\u00eb vend t\u00eb nj\u00eb dhe sharding t\u00eb dh\u00ebnave mes tyre sipas \u00e7el\u00ebsit. Ky \u00ebsht\u00eb nj\u00eb grup <code>key=value<\/code> Pra. Q\u00eb do t\u00eb thot\u00eb se ne kemi disa indekse t\u00eb pavarura t\u00eb p\u00ebrmbysura, t\u00eb cilat mund t'i konsultojm\u00eb paralelisht n\u00eb disa procesor\u00eb. Zbatimet e m\u00ebparshme lejonin funksionimin vet\u00ebm n\u00eb modin me nj\u00eb procesor, pra, skanuar t\u00eb dh\u00ebnat vet\u00ebm n\u00eb nj\u00eb b\u00ebrtham\u00eb. Kjo zgjidhje lejon skanimin e t\u00eb dh\u00ebnave menj\u00ebher\u00eb n\u00eb disa b\u00ebrthama, ashtu si\u00e7 b\u00ebn ClickHouse. K\u00ebt\u00eb planifikojm\u00eb ta realizojm\u00eb.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/5ced6446efbf8ded8d7fb91694a999b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tani, le t\u00eb kthehemi te dele tona \u2013 tek funksioni i nd\u00ebrprerjes. <code>timeseries_ids<\/code>. Le t\u00eb shqyrtojm\u00eb se \u00e7far\u00eb zbatimesh mund t\u00eb ekzistojn\u00eb. Ky funksion lejon t\u00eb gjenden <code>timeseries_ids<\/code> p\u00ebr nj\u00eb grup t\u00eb caktuar. <code>label=value<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/073a155018a91120c6996c324772f9af.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Varianti i par\u00eb \u2013 \u00ebsht\u00eb zbatimi naive. Dy cikle t\u00eb ngjitur. K\u00ebtu kemi n\u00eb hyrje t\u00eb funksionit <code>intersectInts<\/code> dy slices \u2014 <code>a<\/code> dhe <code>b<\/code>. N\u00eb dalje, duhet t\u00eb na kthej\u00eb nd\u00ebrprerjen e k\u00ebtyre slices.<\/p>\n<p><\/p>\n<p>Zbatimi naive duket k\u00ebshtu. Ne kalojm\u00eb n\u00ebp\u00ebr t\u00eb gjitha vlerat nga slice <code>a<\/code>, brenda k\u00ebtij cikli kalojm\u00eb n\u00ebp\u00ebr t\u00eb gjitha vlerat e slice <code>b<\/code>. Dhe i krahasojm\u00eb ato. N\u00ebse ato p\u00ebrputhen, at\u00ebher\u00eb kemi gjetur nd\u00ebrprerjen. Dhe e ruajm\u00eb n\u00eb <code>result<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/b89dcbb4f6d73377f9cf4f50169d6dd7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cilat jan\u00eb disavantazhet? Kompleksiteti katror \u2014 ky \u00ebsht\u00eb disavantazhi i saj kryesor. P\u00ebr shembull, n\u00ebse keni dimensionet e slice <code>a<\/code> dhe <code>b<\/code> n\u00ebse ka nj\u00eb milion, at\u00ebher\u00eb kjo funksion nuk do t\u00eb kthej\u00eb kurr\u00eb nj\u00eb p\u00ebrgjigje. Sepse do t\u00eb duhet t\u00eb kryej\u00eb nj\u00eb trilion iteracione, gj\u00eb q\u00eb \u00ebsht\u00eb shum\u00eb p\u00ebr komputator\u00ebt modern\u00eb.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/bad26b0092a2fd7fc813bcb79a9138ce.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Implementimi i dyt\u00eb bazohet n\u00eb map. Ne krijojm\u00eb nj\u00eb map. Vendosim n\u00eb k\u00ebt\u00eb map t\u00eb gjitha vlerat nga slice. <code>a<\/code>. Pastaj kalojm\u00eb me nj\u00eb cik\u00ebl t\u00eb ve\u00e7ant\u00eb p\u00ebr slice. <code>b<\/code>. Dhe kontrollojm\u00eb \u2013 a ekziston kjo vler\u00eb nga slice <code>b<\/code> n\u00eb map. N\u00ebse ekziston, at\u00ebher\u00eb e shtojm\u00eb at\u00eb n\u00eb rezultat. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/1e610acf641a9cfe4c80aac1fe26044c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cilat jan\u00eb p\u00ebrfitimet? Avantazh \u00ebsht\u00eb se k\u00ebtu ekziston vet\u00ebm kompleksitet linear. K\u00ebshtu q\u00eb funksioni do t\u00eb ekzekutohet shum\u00eb m\u00eb shpejt p\u00ebr madh\u00ebsi m\u00eb t\u00eb m\u00ebdha slice. P\u00ebr nj\u00eb madh\u00ebsi nj\u00eb milion t\u00eb slice kjo funksion do t\u00eb p\u00ebrfundoj\u00eb p\u00ebr 2 milion iteracione, ndryshe nga trillioni i iteracioneve, si n\u00eb funksionin e m\u00ebparsh\u00ebm.<\/p>\n<p><\/p>\n<p>Cili \u00ebsht\u00eb disavantazhi? Disavantazhi \u00ebsht\u00eb se ky funksion k\u00ebrkon m\u00eb shum\u00eb memorie p\u00ebr t\u00eb krijuar k\u00ebt\u00eb map.<\/p>\n<p><\/p>\n<p>Disavantazhi i dyt\u00eb \u00ebsht\u00eb overhead-i i madh p\u00ebr hash-imin. Ky disavantazh nuk \u00ebsht\u00eb shum\u00eb i duksh\u00ebm. Edhe p\u00ebr ne ai nuk ishte shum\u00eb i duksh\u00ebm, prandaj fillimisht n\u00eb VictoriaMetrics implementimi i intersection ishte p\u00ebrmes map. Por m\u00eb pas profilizimi tregoi se shumica e koh\u00ebs s\u00eb procesorit shpenzohet n\u00eb shkrimin n\u00eb map dhe n\u00eb kontrollimin e ekzistenc\u00ebs s\u00eb vler\u00ebs n\u00eb k\u00ebt\u00eb map.<\/p>\n<p><\/p>\n<p>Pse shpenzohet koha e procesorit n\u00eb k\u00ebto vende? Sepse n\u00eb k\u00ebto rreshta Go kryen operacionin e hash-it. Pra, ai llogarit hash-in nga \u00e7el\u00ebsi, n\u00eb m\u00ebnyr\u00eb q\u00eb m\u00eb pas t\u00eb referohet n\u00eb indeksin e caktuar n\u00eb HashMap. Operacioni i llogaritjes s\u00eb hash-it realizohet p\u00ebr disa dhjet\u00ebra nanosekonda. Kjo \u00ebsht\u00eb e ngadalshme p\u00ebr VictoriaMetrics.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/969f10d875d88998e958894ca28b1181.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un\u00eb vendosa t\u00eb realizoj nj\u00eb bitset, t\u00eb optimizuar posa\u00e7\u00ebrisht p\u00ebr k\u00ebt\u00eb rast. Ja si duket tani nd\u00ebrveprimi i dy slices. K\u00ebtu krijojm\u00eb bitset-in. Shtojm\u00eb n\u00eb t\u00eb element\u00ebt nga slice-i i par\u00eb. Pastaj kontrollojm\u00eb pranin\u00eb e k\u00ebtyre element\u00ebve n\u00eb slice-in e dyt\u00eb. Dhe i shtojm\u00eb ata n\u00eb rezultat. Pra, pothuajse nuk ndryshon nga shembulli i m\u00ebparsh\u00ebm. E vetmja gj\u00eb \u00ebsht\u00eb se k\u00ebtu e z\u00ebvend\u00ebsuam qasjen n\u00eb map me funksione t\u00eb personalizuara. <code>shto<\/code> dhe <code>ka<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/b4ec0753d30d9684868a031f605632c0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00eb pamje t\u00eb par\u00eb duket se kjo duhet t\u00eb funksionoj\u00eb m\u00eb ngadal\u00eb, n\u00ebse m\u00eb par\u00eb aty p\u00ebrdorej nj\u00eb map standard, dhe k\u00ebtu thirren disa funksione, por profilizimi tregon se kjo gj\u00eb funksionon 10 her\u00eb m\u00eb shpejt se map-i standard p\u00ebr rastin me VictoriaMetrics.<\/p>\n<p><\/p>\n<p>P\u00ebrve\u00e7 k\u00ebsaj, ajo p\u00ebrdor shum\u00eb m\u00eb pak memorie krahasuar me realizimin n\u00eb map. Sepse ne ruajm\u00eb k\u00ebtu bite n\u00eb vend t\u00eb vlerave tet\u00ebbyte.<\/p>\n<p><\/p>\n<p>Nj\u00eb e met\u00eb e k\u00ebtij implementimi \u00ebsht\u00eb se nuk \u00ebsht\u00eb kaq e dukshme, nuk \u00ebsht\u00eb triviale. <\/p>\n<p><\/p>\n<p>Nj\u00eb tjet\u00ebr e met\u00eb, q\u00eb shum\u00eb mund t\u00eb mos e v\u00ebrejn\u00eb, \u00ebsht\u00eb se ky implementim mund t\u00eb funksionoj\u00eb keq n\u00eb disa raste. Kjo do t\u00eb thot\u00eb se \u00ebsht\u00eb optimizuar p\u00ebr nj\u00eb rast specifik, p\u00ebr k\u00ebt\u00eb rast t\u00eb prerjes s\u00eb ids t\u00eb serive t\u00eb koh\u00ebs n\u00eb VictoriaMetrics. Kjo nuk do t\u00eb thot\u00eb se do t\u00eb p\u00ebrshtatet p\u00ebr \u00e7do rast. N\u00ebse p\u00ebrdoret gabimisht, do t\u00eb kemi jo nj\u00eb rritje t\u00eb performanc\u00ebs, por nj\u00eb gabim out of memory dhe ngadal\u00ebsimin e performanc\u00ebs. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/94bd174afe43e67b3cf279dc7a1be17c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>T\u00eb shqyrtojm\u00eb implementimin e k\u00ebsaj strukture. N\u00ebse d\u00ebshironi ta shihni, ajo ndodhet n\u00eb burimet e VictoriaMetrics, n\u00eb dosjen <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/VictoriaMetrics\/VictoriaMetrics\/tree\/master\/lib\/uint64set\">lib\/uint64set<\/a><\/noindex>. Ajo \u00ebsht\u00eb optimizuar sakt\u00ebsisht p\u00ebr rastin e VictoriaMetrics, ku <code>timeseries_id<\/code> me p\u00ebrfaq\u00ebson nj\u00eb vler\u00eb 64-bitore, ku 32 bit\u00ebt e par\u00eb jan\u00eb konstant\u00eb dhe ndyshojn\u00eb vet\u00ebm 32 bit\u00ebt e fundit.<\/p>\n<p><\/p>\n<p>Kjo struktur\u00eb t\u00eb dh\u00ebnash nuk ruhet n\u00eb disk, ajo funksionon vet\u00ebm n\u00eb memorie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/e24ca65f860e2b04037e073f7acae0c1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ja API i saj. Ai nuk \u00ebsht\u00eb shum\u00eb i komplikuar. API \u00ebsht\u00eb p\u00ebrshtatur sakt\u00ebsisht p\u00ebr shembujt specifik\u00eb t\u00eb p\u00ebrdorimit n\u00eb VictoriaMetrics. Kjo do t\u00eb thot\u00eb se nuk ka funksione t\u00eb panevojshme. K\u00ebtu jan\u00eb funksionet q\u00eb p\u00ebrdoren qart\u00eb nga VictoriaMetrics.<\/p>\n<p><\/p>\n<p>Ka funksione <code>shto<\/code>, q\u00eb shton vlera t\u00eb reja. Ka nj\u00eb funksion <code>ka<\/code>, e cila kontrollon vlerat e reja. Dhe ka nj\u00eb funksion <code>fshij<\/code>, e cila heq vlerat. Ka nj\u00eb funksion ndihm\u00ebs <code>len<\/code>, e cila kthen madh\u00ebsin\u00eb e grupit. Funksioni <code>clone<\/code> klonon grupin. Dhe funksioni <code>appendto<\/code> e shnd\u00ebrron k\u00ebt\u00eb set n\u00eb nj\u00eb slice <code>timeseries_ids<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/874b04042d13f342d39f8f393e7fb78c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ja si duket implementimi i k\u00ebsaj strukture t\u00eb dh\u00ebnash. N\u00eb set ka dy elemente:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p><code>ItemsCount<\/code> \u2013 kjo \u00ebsht\u00eb nj\u00eb fush\u00eb ndihm\u00ebse, p\u00ebr t\u00eb kthyer shpejt numrin e elementeve n\u00eb set. Do t\u00eb ishte e mundur pa k\u00ebt\u00eb fush\u00eb ndihm\u00ebse, por ishte e nevojshme t\u00eb shtohej k\u00ebtu, pasi VictoriaMetrics shpesh pyet n\u00eb algoritmet e saj p\u00ebr gjat\u00ebsin\u00eb e bitset.<\/p>\n<p>\n<\/li>\n<li>\n<p>Fusha e dyt\u00eb \u2013 \u00ebsht\u00eb <code>buckets<\/code>. Ky \u00ebsht\u00eb nj\u00eb slice i struktur\u00ebs <code>bucket32<\/code>. N\u00eb \u00e7do struktur\u00eb ruhet <code>hi<\/code> fusha. K\u00ebto jan\u00eb 32 bit\u00ebt e sip\u00ebrm. Dhe dy slice \u2014 <code>b16his<\/code> dhe <code>buckets<\/code> nga <code>bucket16<\/code> strukturave. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>K\u00ebtu ruhen 16 bit\u00ebt e sip\u00ebrm t\u00eb pjes\u00ebs s\u00eb dyt\u00eb t\u00eb struktur\u00ebs 64-bit. Dhe k\u00ebtu ruhet bitsets p\u00ebr 16 bit\u00ebt m\u00eb t\u00eb posht\u00ebm t\u00eb \u00e7do byte. <\/p>\n<p><\/p>\n<p><code>Bucket64<\/code> \u00ebsht\u00eb i p\u00ebrb\u00ebr\u00eb nga nj\u00eb array <code>uint64<\/code>. Gjat\u00ebsia llogaritet me ndihm\u00ebn e k\u00ebtyre konstantave. N\u00eb nj\u00eb <code>bucket16<\/code> maksimumi mund t\u00eb ruaj\u00eb <code>2^16=65536<\/code> bit. N\u00ebse e ndan k\u00ebt\u00eb me 8, at\u00ebher\u00eb kemi 8 kilobyte. N\u00ebse e ndan p\u00ebrs\u00ebri me 8, at\u00ebher\u00eb \u00ebsht\u00eb 1000 <code>uint64<\/code> vler\u00eb. Pra, <code>Bucket16<\/code> \u2013 kjo \u00ebsht\u00eb nj\u00eb struktur\u00eb 8-kilobyte. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/1cca4e6bfafa3408a3c95e0118e26d80.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le t\u00eb shqyrtojm\u00eb se si \u00ebsht\u00eb realizuar nj\u00eb nga metodologjit\u00eb e k\u00ebsaj strukture p\u00ebr shtimin e nj\u00eb vler\u00eb t\u00eb re. <\/p>\n<p><\/p>\n<p>\u00c7do gj\u00eb fillon me <code>uint64<\/code> vler\u00ebn. Llogarisim 32 bit\u00ebt e sip\u00ebrm, llogarisim 32 bit\u00ebt e posht\u00ebm. Shkruajm\u00eb n\u00eb t\u00eb gjitha <code>buckets<\/code>. Krahasojm\u00eb 32 bit\u00ebt e sip\u00ebrm n\u00eb \u00e7do bucket me vler\u00ebn q\u00eb po shtojm\u00eb. N\u00ebse ato p\u00ebrputhen, th\u00ebrrasim funksionin <code>shto<\/code> n\u00eb struktur\u00ebn b32 <code>buckets<\/code>. Dhe shtojm\u00eb aty 32 bit\u00ebt e posht\u00ebm. N\u00ebse ky \u00ebsht\u00eb kthyer <code>e v\u00ebrtet\u00eb<\/code>, at\u00ebher\u00eb kjo do t\u00eb thot\u00eb se ne e kemi shtuar nj\u00eb vler\u00eb t\u00eb till\u00eb dhe nuk e kemi pasur m\u00eb par\u00eb. N\u00ebse ai kthen <code>false<\/code>, at\u00ebher\u00eb nj\u00eb vler\u00eb e till\u00eb ka ekzistuar tashm\u00eb. M\u00eb pas rritim numrin e elementeve n\u00eb struktur\u00eb. <\/p>\n<p><\/p>\n<p>N\u00ebse nuk gjejm\u00eb <code>bucket<\/code> me vler\u00ebn hi-p\u00ebrkat\u00ebse, at\u00ebher\u00eb th\u00ebrrasim funksionin <code>addAlloc<\/code>, i cili alokon nj\u00eb t\u00eb re <code>bucket<\/code>, duke e shtuar at\u00eb n\u00eb struktur\u00ebn bucket.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/c5d1e5de767f47c7c40e01e12b6d0617.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kjo \u00ebsht\u00eb realizimi i funksionit <code>b32.add<\/code>. Ajo \u00ebsht\u00eb e ngjashme me realizimin e m\u00ebparsh\u00ebm. Ne llogarisim 16 bit\u00ebt e lart\u00eb, 16 bit\u00ebt e ul\u00ebt.<\/p>\n<p><\/p>\n<p>Pastaj ne kalojm\u00eb n\u00eb t\u00eb gjitha 16 bit\u00ebt e sip\u00ebrm. Gjejm\u00eb p\u00ebrputhjet. N\u00eb rast p\u00ebrputhjeje, th\u00ebrrasim metod\u00ebn add, e cila do t\u00eb shqyrtohet n\u00eb faqen tjet\u00ebr p\u00ebr <code>bucket16<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/e98c4ef316f3a894fd7019c3c85696f7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dhe tani niveli m\u00eb i ul\u00ebt, i cili duhet t\u00eb jet\u00eb maksimalisht i optimizuar. Ne llogarisim p\u00ebr <code>uint64<\/code> vler\u00ebn id n\u00eb slice bit, si dhe <code>bitmask<\/code>. Ky \u00ebsht\u00eb nj\u00eb mask\u00eb p\u00ebr k\u00ebt\u00eb vler\u00eb 64-bit, sipas s\u00eb cil\u00ebs mund t\u00eb kontrolloni pranin\u00eb e k\u00ebtyre bit\u00ebve, ose t'i vendosni ato. Ne kontrollojm\u00eb pranin\u00eb e k\u00ebtyre bit\u00ebve, i vendosim ata, dhe kthejm\u00eb pranin\u00eb. Kjo \u00ebsht\u00eb implementimi yn\u00eb, i cili ka lejuar t\u00eb shpejtoj\u00eb operacionin e p\u00ebrputhjes s\u00eb IDs s\u00eb serive t\u00eb koh\u00ebs deri n\u00eb 10 her\u00eb krahasuar me maps normale.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/4dfa5a6142829a3551be22d6c9c3ab92.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00eb VictoriaMetrics, p\u00ebrve\u00e7 k\u00ebsaj optimizimi, ka shum\u00eb optimizime t\u00eb tjera. Shumica e k\u00ebtyre optimizimeve jan\u00eb shtuar jo rast\u00ebsisht, por pas profilizimit t\u00eb kodit n\u00eb production.<\/p>\n<p><\/p>\n<p>Kjo \u00ebsht\u00eb rregulli kryesor i optimizimit \u2013 mos shtoni optimizimin duke supozuar se aty do t\u00eb jet\u00eb nj\u00eb ngushtic\u00eb, sepse mund t\u00eb rezultoj\u00eb q\u00eb nuk do t\u00eb ket\u00eb ngushtic\u00eb. Optimizimi zakonisht keq\u00ebson cil\u00ebsin\u00eb e kodit. Prandaj, \u00ebsht\u00eb m\u00eb mir\u00eb t\u00eb optimizoni vet\u00ebm pas profilizimit dhe, idealisht, n\u00eb production, n\u00eb m\u00ebnyr\u00eb q\u00eb t\u00eb jen\u00eb t\u00eb dh\u00ebna reale. Ata q\u00eb jan\u00eb t\u00eb interesuar, mund t\u00eb shikoni burimet e VictoriaMetrics dhe t\u00eb studioni optimizime t\u00eb tjera q\u00eb ka.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Optimizimet Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/7585c4dc782627bac5b649e6a55e2ffb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>Kam nj\u00eb pyetje p\u00ebr bitset. \u00cbsht\u00eb shum\u00eb e ngjashme me implementimin e C++ vector bool, bitset i optimizuar. A e keni marr\u00eb implementimin nga aty?<\/em><\/p>\n<p><\/p>\n<p>Jo, jo nuk \u00ebsht\u00eb nga aty. Kur realzoja k\u00ebt\u00eb bitset, e shikoja ndihm\u00ebn nga struktura e k\u00ebtyre id-\u00ebve t\u00eb koh\u00ebs, t\u00eb cilat p\u00ebrdoren n\u00eb VictoriaMetrics. Struktura e tyre \u00ebsht\u00eb e till\u00eb q\u00eb 32 bit\u00ebt e sip\u00ebrm jan\u00eb kryesisht t\u00eb q\u00ebndruesh\u00ebm. 32 bit\u00ebt e posht\u00ebm mund t\u00eb ndryshojn\u00eb. Sa m\u00eb posht\u00eb t\u00eb jet\u00eb bit-i, aq m\u00eb shpesh mund t\u00eb ndryshoj\u00eb. Prandaj, kjo realizim \u00ebsht\u00eb optimizuar p\u00ebr k\u00ebt\u00eb struktur\u00eb t\u00eb dh\u00ebnash. Realizimi n\u00eb C++, sa di un\u00eb, \u00ebsht\u00eb optimizuar p\u00ebr rastin e p\u00ebrgjithsh\u00ebm. N\u00ebse b\u00ebni optimizim p\u00ebr rastin e p\u00ebrgjithsh\u00ebm, at\u00ebher\u00eb do t\u00eb thot\u00eb se ajo nuk do t\u00eb jet\u00eb m\u00eb optimale p\u00ebr rastin specifik.<\/p>\n<p><\/p>\n<p>Ju rekomandoj gjithashtu t\u00eb shikoni prezantimin e Aleksej Milovidit. Ai fliste diku para nj\u00eb muaji p\u00ebr optimizimet n\u00eb ClickHouse p\u00ebr specializime t\u00eb caktuara. Ai v\u00ebrtet tregon se n\u00eb rastin e p\u00ebrgjithsh\u00ebm realizimi n\u00eb C++ ose ndonj\u00eb realizim tjet\u00ebr jan\u00eb fokaluar p\u00ebr nj\u00eb pun\u00eb t\u00eb mir\u00eb n\u00eb mes t\u00eb gjith\u00eb. Ajo mund t\u00eb punoj\u00eb m\u00eb keq se nj\u00eb realizim t\u00eb specializuar p\u00ebr njohurit\u00eb specifike, si\u00e7 \u00ebsht\u00eb rasti yn\u00eb, kur ne e dim\u00eb se 32 bit\u00ebt e sip\u00ebrm jan\u00eb kryesisht t\u00eb q\u00ebndruesh\u00ebm.<\/p>\n<p><\/p>\n<p><em>Kam nj\u00eb pyetje t\u00eb dyt\u00eb. Cila \u00ebsht\u00eb ndryshimi kardinal nga InfluxDB?<\/em><\/p>\n<p><\/p>\n<p>Ka shum\u00eb dallime drastike. N\u00ebse flasim p\u00ebr performanc\u00ebn dhe konsumimin e memories, InfluxDB n\u00eb testime tregon deri n\u00eb 10 her\u00eb m\u00eb shum\u00eb konsumim t\u00eb memories p\u00ebr serit\u00eb me cardinalitet t\u00eb lart\u00eb, kur i keni shum\u00eb, p\u00ebr shembull, miliona. P\u00ebr shembull, VictoriaMetrics konsumon 1 GB p\u00ebr nj\u00eb milion serish aktive, nd\u00ebrsa InfluxDB konsumon 10 GB. Dhe kjo \u00ebsht\u00eb nj\u00eb diferenc\u00eb e madhe. <\/p>\n<p><\/p>\n<p>Dallimi i dyt\u00eb kardinal \u00ebsht\u00eb se InfluxDB ka gjuh\u00eb t\u00eb \u00e7uditshme pyetjesh \u2013 Flux dhe InfluxQL. Ato nuk jan\u00eb shum\u00eb t\u00eb p\u00ebrshtatshme p\u00ebr pun\u00ebn me serit\u00eb temporale n\u00eb krahasim me <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@valyala\/promql-tutorial-for-beginners-9ab455142085\">PromQL<\/a><\/noindex>, e cila mb\u00ebshtetet n\u00eb VictoriaMetrics. PromQL \u00ebsht\u00eb gjuha e pyetjeve nga Prometheus.<\/p>\n<p><\/p>\n<p>Dhe nj\u00eb dallim tjet\u00ebr \u00ebsht\u00eb se InfluxDB ka nj\u00eb model t\u00eb dh\u00ebnash pak t\u00eb \u00e7uditsh\u00ebm, ku n\u00eb \u00e7do rresht mund t\u00eb ruhen disa fush\u00eb me grupe t\u00eb ndryshme etiketash. K\u00ebto rreshta ndahen gjithashtu n\u00eb tabela t\u00eb ndryshme. K\u00ebto komplikime shtes\u00eb e b\u00ebjn\u00eb t\u00eb v\u00ebshtir\u00eb pun\u00ebn e m\u00ebvonshme me k\u00ebt\u00eb baz\u00eb. Ajo \u00ebsht\u00eb e v\u00ebshtir\u00eb p\u00ebr t'u mbajtur dhe kuptuar.<\/p>\n<p><\/p>\n<p>N\u00eb VictoriaMetrics gjith\u00e7ka \u00ebsht\u00eb shum\u00eb m\u00eb e thjesht\u00eb. \u00c7do seri temporale p\u00ebrfaq\u00ebson nj\u00eb \u00e7el\u00ebs-vler\u00eb. Vlera \u00ebsht\u00eb nj\u00eb grup pikash \u2013 <code>(timestamp, vlera)<\/code>, nd\u00ebrsa \u00e7el\u00ebsi \u00ebsht\u00eb nj\u00eb grup <code>label=value<\/code>. Nuk ka ndarje n\u00eb fushat dhe matjet. Kjo ju lejon t\u00eb zgjidhni \u00e7do t\u00eb dh\u00ebn\u00eb dhe pastaj t'i kombinoni, shtoni, zbritni, shum\u00ebzoni, ndajeni ndryshe nga InfluxDB, ku llogaritjet midis radh\u00ebve t\u00eb ndryshme ende nuk jan\u00eb realizuar, sa di un\u00eb. N\u00ebse jan\u00eb realizuar, at\u00ebher\u00eb \u00ebsht\u00eb e v\u00ebshtir\u00eb, duhet t\u00eb shkruani shum\u00eb kod. <\/p>\n<p><\/p>\n<p><em>Kam nj\u00eb pyetje t\u00eb sakt\u00ebsimit. E kuptova sakt\u00eb q\u00eb kishte nj\u00eb problem, p\u00ebr t\u00eb cilin keni folur, q\u00eb ky indeks i invertuar nuk fiton n\u00eb memorie, prandaj b\u00ebhet particionim?<\/em><\/p>\n<p><\/p>\n<p>\u0412\u043d\u0430\u0447\u0430\u043b\u0435 \u044f \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u043d\u0430\u0438\u0432\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 Go&#8217;\u0448\u043d\u043e\u0439 map&#8217;\u0435. \u0422\u0430\u043a\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0438\u0441\u043a\u0435, \u0430 \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043d\u0430 \u0434\u0438\u0441\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0435 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443 \u0432\u0430\u0441 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u043f\u0430\u0434\u0435\u0442. \u0418 \u0432\u044b \u043f\u043e\u0442\u0435\u0440\u044f\u0435\u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u043e \u0432\u0441\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0438\u0445. <\/p>\n<p><\/p>\n<p><em>P\u00ebrsh\u00ebndetje! Faleminderit p\u00ebr raportin! Quhem Pavel. Jam nga kompania Wildberries. Kam disa pyetje p\u00ebr ju. Pyetja e par\u00eb. Si mendoni, n\u00ebse do t\u00eb zgjidhnit nj\u00eb parim tjet\u00ebr p\u00ebr nd\u00ebrtimin e arkitektur\u00ebs s\u00eb aplikacionit tuaj dhe do t\u00eb ndanit t\u00eb dh\u00ebnat sipas koh\u00ebs, ndoshta do t\u00eb kishit mund\u00ebsi t\u00eb b\u00ebnte nd\u00ebrprerje t\u00eb t\u00eb dh\u00ebnave gjat\u00eb k\u00ebrkimit, duke u bazuar vet\u00ebm n\u00eb at\u00eb se n\u00eb nj\u00eb ndarje ndodhen t\u00eb dh\u00ebnat p\u00ebr nj\u00eb periudh\u00eb kohe, pra p\u00ebr nj\u00eb interval kohor, dhe nuk do t'ju duhej t\u00eb shqet\u00ebsoheshit se copat jan\u00eb t\u00eb shp\u00ebrndara ndryshe? Pyetja num\u00ebr 2 \u2014 pasi realizoni nj\u00eb algorit\u00ebm t\u00eb till\u00eb me bitset dhe gjith\u00e7ka tjet\u00ebr, ndoshta keni provuar t\u00eb p\u00ebrdorni instrukcionet e procesorit? Ndoshta keni provuar optimizime t\u00eb tilla?<\/em><\/p>\n<p><\/p>\n<p>P\u00ebr pyetjen e dyt\u00eb do t\u00eb p\u00ebrgjigjem menj\u00ebher\u00eb. Ne ende nuk kemi arritur aty. Por n\u00ebse do t\u00eb nevojitet, do t\u00eb arrijm\u00eb. Dhe pyetja e par\u00eb, cila ishte ajo?<\/p>\n<p><\/p>\n<p><em>Keni diskutuar dy skenar\u00eb. Dhe keni th\u00ebn\u00eb se keni zgjedhur t\u00eb dytin me nj\u00eb implementim m\u00eb t\u00eb komplikuar. Dhe nuk e preferuat t\u00eb parin, ku t\u00eb dh\u00ebnat jan\u00eb t\u00eb ndara sipas koh\u00ebs.<\/em> <\/p>\n<p><\/p>\n<p>Po. N\u00eb rastin e par\u00eb, v\u00ebllimi total i indeksit do t\u00eb ishte m\u00eb i madh, sepse n\u00eb \u00e7do ndarje do t\u00eb duhej t\u00eb mbanim t\u00eb dh\u00ebna t\u00eb dyfishta p\u00ebr ato seri temporale q\u00eb vazhdojn\u00eb p\u00ebrmes t\u00eb gjitha ndarjeve. Dhe n\u00ebse ju keni nj\u00eb raport churn t\u00eb ul\u00ebt p\u00ebr serit\u00eb temporale, do t\u00eb thot\u00eb se vazhdimisht p\u00ebrdoren t\u00eb nj\u00ebjtat seria, at\u00ebher\u00eb n\u00eb rastin e par\u00eb ne do t\u00eb humbnim shum\u00eb m\u00eb tep\u00ebr n\u00eb hap\u00ebsir\u00ebn e diskut t\u00eb p\u00ebrdorur krahasuar me rastin e dyt\u00eb.<\/p>\n<p><\/p>\n<p>Po, ndarja sipas koh\u00ebs \u00ebsht\u00eb nj\u00eb opsion i mir\u00eb. K\u00ebt\u00eb e p\u00ebrdor Prometheus. Por n\u00eb Prometheus ka nj\u00eb mang\u00ebsi tjet\u00ebr. Gjat\u00eb bashkimit t\u00eb k\u00ebtyre copave t\u00eb dh\u00ebnash, ai k\u00ebrkon t\u00eb mbaj\u00eb n\u00eb memorie metainformacionin p\u00ebr t\u00eb gjitha etiketat dhe serit\u00eb temporale. Prandaj, n\u00ebse copat e dh\u00ebnave jan\u00eb t\u00eb m\u00ebdha q\u00eb ai po bashkon, konsumimi i memories rritet shum\u00eb gjat\u00eb bashkimit, n\u00eb krahasim me VictoriaMetrics. Gjat\u00eb bashkimit, VictoriaMetrics n\u00eb t\u00ebr\u00ebsi nuk konsumon memorie, disa kilobajt p\u00ebrdoren, pa marr\u00eb parasysh p\u00ebrmasat e copave t\u00eb dh\u00ebnash q\u00eb po bashkohen.<\/p>\n<p><\/p>\n<p><em>Algoritmi, q\u00eb p\u00ebrdorni, konsumon memorie. N\u00eb t\u00eb sh\u00ebnohen etiketat e seris\u00eb temporale, ku ka vlera. K\u00ebshtu kontrolloni pranin\u00eb e \u00e7ift\u00ebzuar n\u00eb nj\u00eb grumbull t\u00eb dh\u00ebnash dhe n\u00eb tjetrin. Dhe kuptoni \u2013 a ka ndodhur nd\u00ebrprerja apo jo. Zakonisht, n\u00eb bazat e t\u00eb dh\u00ebnave implementohen kursore, itere, q\u00eb mbajn\u00eb gjendjen e tyre aktuale dhe shkelen n\u00eb t\u00eb dh\u00ebna t\u00eb renditura, p\u00ebr shkak se keni nj\u00eb kompleksitet t\u00eb thjesht\u00eb n\u00eb k\u00ebto operacione.<\/em> <\/p>\n<p><\/p>\n<p>Pse nuk p\u00ebrdorim kursore p\u00ebr nd\u00ebrprerjen e t\u00eb dh\u00ebnave?<\/p>\n<p><\/p>\n<p><em>Po.<\/em> <\/p>\n<p><\/p>\n<p>N\u00eb LevelDB apo n\u00eb mergeset kemi pik\u00ebrisht rreshtat e renditur. Mund t\u00eb kalojm\u00eb me kursor dhe t\u00eb gjejm\u00eb nd\u00ebrprerjen. Dhe pse nuk e p\u00ebrdorim? Sepse \u2013 \u00ebsht\u00eb e ngadalt\u00eb. Sepse kursor\u00ebt supozojn\u00eb se p\u00ebr \u00e7do rresht duhet t\u00eb th\u00ebrras\u00ebsh nj\u00eb funksion. Thirrja e funksionit \u2013 \u00ebsht\u00eb 5 nanosekonda. Dhe n\u00ebse keni 100,000,000 rreshta, at\u00ebher\u00eb rezulton se harxhojm\u00eb gjysm\u00eb sekonde vet\u00ebm p\u00ebr thirrjen e funksionit.<\/p>\n<p><\/p>\n<p><em>Po, ka nj\u00eb pyetje tjet\u00ebr. Pyetja ndoshta do t\u00eb ting\u00eblloj\u00eb pak e \u00e7uditshme. Pse n\u00eb momentin e marrjes s\u00eb t\u00eb dh\u00ebnave nuk mund t\u00eb llogariten t\u00eb gjith\u00eb aggregat\u00ebt e nevojsh\u00ebm dhe t\u00eb ruhet forma e duhur e tyre? Pse t\u00eb ruajm\u00eb volumet e m\u00ebdha n\u00eb disa sisteme si VictoriaMetrics, ClickHouse, etj., vet\u00ebm p\u00ebr t\u00eb shpenzuar shum\u00eb koh\u00eb m\u00eb pas p\u00ebr to?<\/em><\/p>\n<p><\/p>\n<p><em>Do t\u00eb jap nj\u00eb shembull p\u00ebr ta b\u00ebr\u00eb m\u00eb t\u00eb qart\u00eb. Supozoni, si funksionon nj\u00eb speedomet\u00ebr i vog\u00ebl lod\u00ebr? Ai regjistron distanc\u00ebn q\u00eb keni udh\u00ebtuar, duke e shtuar vazhdimisht at\u00eb n\u00eb nj\u00eb matje, dhe n\u00eb t\u00eb dyt\u00ebn \u2013 koh\u00ebn. Dhe e ndan. Dhe merr shpejt\u00ebsin\u00eb mesatare. Mund t\u00eb b\u00ebni di\u00e7ka t\u00eb ngjashme. T\u00eb mbledhni t\u00eb gjitha faktet e nevojshme n\u00eb fluturim.<\/em><\/p>\n<p><\/p>\n<p>Mir\u00eb, e kuptova pyetjen. Shembulli juaj ka vend p\u00ebr jet\u00eb. N\u00ebse e dini se cilat agregate ju nevojiten, kjo \u00ebsht\u00eb zgjidhja m\u00eb e mir\u00eb. Por problemi \u00ebsht\u00eb se njer\u00ebzit ruajn\u00eb k\u00ebto metrika, disa t\u00eb dh\u00ebna n\u00eb ClickHouse dhe ata nuk din\u00eb se si do t'i agregojn\u00eb apo filtrojn\u00eb ato n\u00eb t\u00eb ardhmen, prandaj duhet t\u00eb ruajn\u00eb t\u00eb gjitha t\u00eb dh\u00ebnat e pap\u00ebrpunuara. Po sikur t\u00eb dini se \u00e7far\u00eb duheni t\u00eb llogarisni mesatare, pse t\u00eb mos e llogarisni at\u00eb, n\u00eb vend q\u00eb t\u00eb ruani nj\u00eb sasi t\u00eb madhe t\u00eb dh\u00ebnash t\u00eb pap\u00ebrpunuara? Por kjo \u00ebsht\u00eb vet\u00ebm n\u00eb rast se e dini sakt\u00ebsisht se \u00e7far\u00eb ju nevojitet.<\/p>\n<p><\/p>\n<p>P\u00ebr m\u00eb tep\u00ebr, bazat e t\u00eb dh\u00ebnave p\u00ebr ruajtjen e serive temporale mb\u00ebshtesin llogaritjen e agregateve. P\u00ebr shembull, Prometheus mb\u00ebshtet <noindex><a rel=\"nofollow\" href=\"https:\/\/prometheus.io\/docs\/prometheus\/latest\/configuration\/recording_rules\/\">rregullat e regjistrimit<\/a><\/noindex>. Pra, kjo mund t\u00eb b\u00ebhet, n\u00ebse e dini se cilat agregate do t'ju nevojiten. N\u00eb VictoriaMetrics kjo nuk \u00ebsht\u00eb ende e disponueshme, por zakonisht p\u00ebrpara saj vendoset Prometheus, n\u00eb t\u00eb cilin mund ta b\u00ebni at\u00eb n\u00eb rregullat e regjistrimit.<\/p>\n<p><\/p>\n<p>P\u00ebr shembull, n\u00eb pun\u00ebn time t\u00eb m\u00ebparshme, ishte e nevojshme t\u00eb llogaritej numri i ngjarjeve n\u00eb nj\u00eb dritare l\u00ebviz\u00ebse p\u00ebr or\u00ebn e fundit. Problemi \u00ebsht\u00eb se, p\u00ebr k\u00ebt\u00eb, duhej t\u00eb krijoja nj\u00eb implementim t\u00eb personalizuar n\u00eb Go, pra nj\u00eb sh\u00ebrbim p\u00ebr llogaritjen e k\u00ebtij elementi. Ky sh\u00ebrbim p\u00ebrfundimisht nuk ishte i thjesht\u00eb, sepse \u00ebsht\u00eb e v\u00ebshtir\u00eb t\u00eb llogaritet. Implementimi mund t\u00eb jet\u00eb i thjesht\u00eb n\u00ebse ju nevojitet t\u00eb llogaritni disa aggragate n\u00eb intervale fikse kohore. N\u00ebse d\u00ebshoni t\u00eb llogaritni ngjarjet n\u00eb nj\u00eb dritare l\u00ebviz\u00ebse, at\u00ebher\u00eb nuk \u00ebsht\u00eb aq e thjesht\u00eb sa duket. Mendoj se kjo akoma nuk \u00ebsht\u00eb realizuar n\u00eb ClickHouse ose n\u00eb bazat e t\u00eb dh\u00ebnave t\u00eb koh\u00ebs, sepse \u00ebsht\u00eb e komplikuar p\u00ebr t'u zbatuar.<\/p>\n<p><\/p>\n<p><em>Dhe nj\u00eb pyetje tjet\u00ebr. Tani po flisnim p\u00ebr average dhe m\u00eb erdhi n\u00eb mend se dikur kishte nj\u00eb gj\u00eb si Graphite me backend Carbon. Ai e kishte aft\u00ebsin\u00eb t\u00eb filtronte t\u00eb dh\u00ebnat e vjetra, pra t\u00eb linte nj\u00eb pik\u00eb n\u00eb minut\u00eb, nj\u00eb pik\u00eb n\u00eb or\u00eb dhe k\u00ebshtu me radh\u00eb. N\u00eb parim, kjo \u00ebsht\u00eb mjaft e p\u00ebrshtatshme n\u00ebse na duhen t\u00eb dh\u00ebna t\u00eb pap\u00ebrpunuara, gjysm\u00eb t\u00eb th\u00ebn\u00eb, p\u00ebr nj\u00eb muaj, dhe gjith\u00eb t\u00eb tjerat mund t\u00eb filtrohen. Por Prometheus dhe VictoriaMetrics nuk e mb\u00ebshtesin k\u00ebt\u00eb funksionalitet. \u00cbsht\u00eb parashikuar t\u00eb mb\u00ebshtetet? N\u00ebse jo, pse?<\/em><\/p>\n<p><\/p>\n<p>Faleminderit p\u00ebr pyetjen. P\u00ebrdoruesit tan\u00eb e b\u00ebjn\u00eb at\u00eb ndonj\u00ebher\u00eb. Ata pyesin kur do ta shtojm\u00eb mb\u00ebshtetjen p\u00ebr downsampling. K\u00ebtu ka disa probleme. S\u00eb pari, \u00e7do p\u00ebrdorues e kupton n\u00ebn <code>downsampling<\/code> di\u00e7ka t\u00eb tij\u00ebn: dikush d\u00ebshiron t\u00eb marr\u00eb \u00e7do pik\u00eb t\u00eb rast\u00ebsishme n\u00eb nj\u00eb interval t\u00eb caktuar, dikush d\u00ebshiron vlerat maksimale, minimale, mesatare. N\u00ebse shum\u00eb sisteme shkruajn\u00eb t\u00eb dh\u00ebna n\u00eb baz\u00ebn tuaj, nuk mund t\u2019i trajtoni ato t\u00eb gjitha nj\u00ebsoj. Mund t\u00eb dal\u00eb q\u00eb p\u00ebr \u00e7do sistem duhet t\u00eb p\u00ebrdoret nj\u00eb downsampling i ndrysh\u00ebm. Dhe kjo \u00ebsht\u00eb e v\u00ebshtir\u00eb p\u00ebr t'u zbatuar.<\/p>\n<p><\/p>\n<p>Dhe e dyta \u00ebsht\u00eb se VictoriaMetrics, ashtu si ClickHouse, \u00ebsht\u00eb optimizuar p\u00ebr t\u00eb punuar me nj\u00eb volum t\u00eb madh t\u00eb t\u00eb dh\u00ebnave t\u00eb pap\u00ebrpunuara, prandaj ajo mund t\u00eb p\u00ebrpunoj\u00eb nj\u00eb miliard rreshta p\u00ebr m\u00eb pak se nj\u00eb sekond\u00eb, n\u00ebse keni shum\u00eb b\u00ebrthama n\u00eb sistemin tuaj. Skandimi i pikave t\u00eb serive temporale n\u00eb VictoriaMetrics \u00ebsht\u00eb 50,000,000 pika n\u00eb sekond\u00eb p\u00ebr \u00e7do b\u00ebrtham\u00eb. Dhe k\u00ebto performanca shkall\u00ebzohen n\u00eb b\u00ebrthamat ekzistuese. Pra, n\u00ebse keni 20 b\u00ebrthama, p\u00ebr shembull, do t\u00eb arrini t\u00eb skanoni nj\u00eb miliard pikash n\u00eb sekond\u00eb. Dhe kjo karakteristik\u00eb e VictoriaMetrics dhe ClickHouse zvog\u00eblon nevoj\u00ebn p\u00ebr downsampling.<\/p>\n<p><\/p>\n<p>Nj\u00eb karakteristik\u00eb tjet\u00ebr \u00ebsht\u00eb se VictoriaMetrics comprimim k\u00ebto t\u00eb dh\u00ebna me efikasitet. Kompresimi mesatar n\u00eb prodhim \u00ebsht\u00eb nga 0.4 deri n\u00eb 0.8 byte p\u00ebr pik\u00eb. \u00c7do pik\u00eb p\u00ebrfshin nj\u00eb timestamp + nj\u00eb vler\u00eb. Dhe kjo kompresohet m\u00eb pak se nj\u00eb byte n\u00eb mesatare. <\/p>\n<p><\/p>\n<p><em>Sergei. Kam nj\u00eb pyetje. Cila \u00ebsht\u00eb kuanti minimal i koh\u00ebs p\u00ebr regjistrim?<\/em><\/p>\n<p><\/p>\n<p>Nj\u00eb milisekond\u00eb. S\u00eb fundmi, kishim nj\u00eb bised\u00eb me zhvillues t\u00eb tjer\u00eb t\u00eb bazave t\u00eb t\u00eb dh\u00ebnave p\u00ebr serit\u00eb e p\u00ebrkohshme. Kuanti minimal i koh\u00ebs te ata \u00ebsht\u00eb nj\u00eb sekond\u00eb. Edhe n\u00eb Graphite, p\u00ebr shembull, \u00ebsht\u00eb gjithashtu nj\u00eb sekond\u00eb. N\u00eb OpenTSDB gjithashtu \u00ebsht\u00eb nj\u00eb sekond\u00eb. N\u00eb InfluxDB \u2013 sakt\u00ebsi nanosekondash. N\u00eb VictoriaMetrics \u2013 nj\u00eb milisekond\u00eb, sepse n\u00eb Prometheus \u00ebsht\u00eb nj\u00eb milisekond\u00eb. Dhe VictoriaMetrics \u00ebsht\u00eb zhvilluar fillimisht si ruajtje e larg\u00ebt p\u00ebr Prometheus. Por tani ajo mund t\u00eb ruaj\u00eb t\u00eb dh\u00ebna edhe nga sisteme t\u00eb tjera. <\/p>\n<p><\/p>\n<p>Njeriu me t\u00eb cilin kam biseduar thot\u00eb se ata kan\u00eb sakt\u00ebsi n\u00eb sekonda - kjo \u00ebsht\u00eb e mjaftueshme p\u00ebr ta, sepse varet nga lloji i t\u00eb dh\u00ebnave q\u00eb ruhen n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave t\u00eb serive temporale. N\u00ebse jan\u00eb t\u00eb dh\u00ebna DevOps ose t\u00eb dh\u00ebna nga infrastruktura, ku i mbledhni ato me interval prej 30 sekondash deri n\u00eb nj\u00eb minut\u00eb, at\u00ebher\u00eb sakt\u00ebsia n\u00eb sekonda \u00ebsht\u00eb e mjaftueshme; m\u00eb pak nuk \u00ebsht\u00eb e nevojshme. Por n\u00ebse po mbledhni k\u00ebto t\u00eb dh\u00ebna nga sistemet e tregtis\u00eb me frekuenc\u00eb t\u00eb lart\u00eb, at\u00ebher\u00eb sakt\u00ebsia n\u00eb nanosekonda \u00ebsht\u00eb e nevojshme.<\/p>\n<p><\/p>\n<p>Sakt\u00ebsia n\u00eb milisekonda n\u00eb VictoriaMetrics \u00ebsht\u00eb e p\u00ebrshtatshme si p\u00ebr rastin DevOps, ashtu edhe p\u00ebr shumic\u00ebn e rasteve q\u00eb p\u00ebrmenda n\u00eb fillim t\u00eb raportit. E vetmja gj\u00eb p\u00ebr t\u00eb cil\u00ebn mund t\u00eb mos jet\u00eb e p\u00ebrshtatshme \u00ebsht\u00eb p\u00ebr sistemet e tregtis\u00eb me frekuenc\u00eb t\u00eb lart\u00eb.<\/p>\n<p><\/p>\n<p><em>Faleminderit! Dhe nj\u00eb pyetje tjet\u00ebr. \u00c7far\u00eb p\u00ebrputhshm\u00ebrie ka n\u00eb PromQL?<\/em><\/p>\n<p><\/p>\n<p>P\u00ebrputhje e plot\u00eb e anasjellt\u00eb. VictoriaMetrics mb\u00ebshtet plot\u00ebsisht PromQL. P\u00ebrve\u00e7 k\u00ebsaj ajo shton edhe funksionalitete t\u00eb avancuara mbi PromQL, q\u00eb quhet <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/VictoriaMetrics\/VictoriaMetrics\/wiki\/MetricsQL\">MetricsQL<\/a><\/noindex>. N\u00eb lidhje me k\u00ebt\u00eb funksionalitet t\u00eb avancuar ka nj\u00eb raport n\u00eb YouTube. Un\u00eb kam folur n\u00eb Monitoring Meetup k\u00ebt\u00eb pranver\u00eb n\u00eb Sh\u00ebn Petersburg.<\/p>\n<p><\/p>\n<p>kanalin Telegram <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/VictoriaMetrics_ru1\">VictoriaMetrics<\/a><\/noindex>.<\/p>\n<p class=\"for_users_only_msg\">Vet\u00ebm p\u00ebrdoruesit e regjistruar mund t\u00eb marrin pjes\u00eb n\u00eb anket\u00eb. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Hyni<\/a><\/noindex>, ju lutemi.<\/p>\n<h2 class=\"default-block__polling-title\">\u00c7far\u00eb ju pengon t\u00eb kaloni n\u00eb VictoriaMetrics si nj\u00eb depo afatgjat\u00eb p\u00ebr Prometheus? (Shkruani n\u00eb komentet, un\u00eb do t\u00eb shtoj n\u00eb anket\u00eb))<\/h2>\n<ul class=\"poll-result\">\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent  poll-result__data-percent_winner\">71,4%<\/strong>Nuk e p\u00ebrdor Prometheus5<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">28,6%<\/strong>Nuk dija p\u00ebr VictoriaMetrics2<\/p>\n<\/li>\n<\/ul>\n<p>    7 p\u00ebrdorues kan\u00eb votuar. 12 p\u00ebrdorues jan\u00eb abstenues.<br \/>\n<br \/>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/500844\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043a\u043e\u043d\u0446\u0430 2019 \u0433\u043e\u0434\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0412\u0430\u043b\u044f\u043b\u043a\u0438\u043d\u0430 &quot;Go optimizations in VictoriaMetrics&quot; VictoriaMetrics \u2014 \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u0430\u044f \u0421\u0423\u0411\u0414 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0444\u043e\u0440\u043c\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0430 (\u0437\u0430\u043f\u0438\u0441\u044c \u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0438 \u043d\u0430\u0431\u043e\u0440 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u043f\u0440\u043e\u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u0438\u043b\u0438 \u0441\u0431\u043e\u0440 \u043c\u0435\u0442\u0440\u0438\u043a). \u0412\u043e\u0442 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0432\u0438\u0434\u0435\u043e \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u2014 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":80734,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-80733","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043a\u043e\u043d\u0446\u0430 2019 \u0433\u043e\u0434\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0412\u0430\u043b\u044f\u043b\u043a\u0438\u043d\u0430 &quot;Go optimizations in VictoriaMetrics&quot; VictoriaMetrics \u2014 \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u0430\u044f \u0421\u0423\u0411\u0414 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0444\u043e\u0440\u043c\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0430 (\u0437\u0430\u043f\u0438\u0441\u044c \u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0438 \u043d\u0430\u0431\u043e\u0440 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u043f\u0440\u043e\u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u0438\u043b\u0438 \u0441\u0431\u043e\u0440 \u043c\u0435\u0442\u0440\u0438\u043a). \u0412\u043e\u0442 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0432\u0438\u0434\u0435\u043e \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u2014\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/go-optimizations-in-victoriametrics-aleksandr-valyalkin\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Go optimizations in VictoriaMetrics. \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0412\u0430\u043b\u044f\u043b\u043a\u0438\u043d | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043a\u043e\u043d\u0446\u0430 2019 \u0433\u043e\u0434\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0412\u0430\u043b\u044f\u043b\u043a\u0438\u043d\u0430 &quot;Go optimizations in VictoriaMetrics&quot; VictoriaMetrics \u2014 \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u0430\u044f \u0421\u0423\u0411\u0414 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0444\u043e\u0440\u043c\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0430 (\u0437\u0430\u043f\u0438\u0441\u044c \u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0438 \u043d\u0430\u0431\u043e\u0440 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u043f\u0440\u043e\u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u0438\u043b\u0438 \u0441\u0431\u043e\u0440 \u043c\u0435\u0442\u0440\u0438\u043a). \u0412\u043e\u0442 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0432\u0438\u0434\u0435\u043e \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u2014\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/go-optimizations-in-victoriametrics-aleksandr-valyalkin\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-05-08T11:42:31+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-08T11:42:31+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Optimizimet e Go n\u00eb VictoriaMetrics. Aleksand\u00ebr Valjalkin | ProHoster","description":"Sugjeroj t\u00eb shqyrtoni interpretimin e raportit t\u00eb fundvitit 2019 nga Aleksand\u00ebr Valjalkin \"Optimizimet e Go n\u00eb VictoriaMetrics\". VictoriaMetrics \u00ebsht\u00eb nj\u00eb DBMS e shpejt\u00eb dhe e shkall\u00ebzuar p\u00ebr ruajtjen dhe p\u00ebrpunimin e t\u00eb dh\u00ebnave n\u00eb form\u00ebn e serive t\u00eb kohore (nj\u00eb regjistrim krijon koh\u00ebn dhe nj\u00eb grup vlerash p\u00ebrkat\u00ebse t\u00eb k\u00ebsaj kohe, p\u00ebr shembull, t\u00eb marra p\u00ebrmes nj\u00eb monitorimi periodik t\u00eb gjendjes s\u00eb senzor\u00ebve ose mbledhjes s\u00eb metrike). K\u00ebtu \u00ebsht\u00eb lidhja p\u00ebr videon e k\u00ebtij raporti \u2014","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/go-optimizations-in-victoriametrics-aleksandr-valyalkin","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Go optimizations in VictoriaMetrics. \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0412\u0430\u043b\u044f\u043b\u043a\u0438\u043d | ProHoster","og:description":"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043a\u043e\u043d\u0446\u0430 2019 \u0433\u043e\u0434\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0412\u0430\u043b\u044f\u043b\u043a\u0438\u043d\u0430 &quot;Go optimizations in VictoriaMetrics&quot; VictoriaMetrics \u2014 \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u0430\u044f \u0421\u0423\u0411\u0414 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0444\u043e\u0440\u043c\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0430 (\u0437\u0430\u043f\u0438\u0441\u044c \u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0438 \u043d\u0430\u0431\u043e\u0440 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u043f\u0440\u043e\u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u0438\u043b\u0438 \u0441\u0431\u043e\u0440 \u043c\u0435\u0442\u0440\u0438\u043a). \u0412\u043e\u0442 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0432\u0438\u0434\u0435\u043e \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u2014","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/go-optimizations-in-victoriametrics-aleksandr-valyalkin","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-05-08T11:42:31+00:00","article:modified_time":"2020-05-08T11:42:31+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"80733","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:12:22","updated":"2022-09-29 05:16:51"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/80733","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=80733"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/80733\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/80734"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=80733"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=80733"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=80733"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}