{"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\/hu\/blog\/administrirovanie\/go-optimizations-in-victoriametrics-aleksandr-valyalkin","title":{"rendered":"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Javaslom, hogy ismerkedjen meg Alexander Valyalkin 2019 v\u00e9g\u00e9n k\u00e9sz\u00fclt \"Go optimaliz\u00e1l\u00e1sok a VictoriaMetricsben\" c\u00edm\u0171 el\u0151ad\u00e1s\u00e1nak a jegyz\u0151k\u00f6nyv\u00e9vel.<\/strong><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/victoriametrics.com\/\">VictoriaMetrics<\/a><\/noindex> \u2014 gyors \u00e9s sk\u00e1l\u00e1zhat\u00f3 DBMS az id\u0151alap\u00fa adatok t\u00e1rol\u00e1s\u00e1ra \u00e9s feldolgoz\u00e1s\u00e1ra (a feljegyz\u00e9s az id\u0151t \u00e9s az ehhez az id\u0151h\u00f6z kapcsol\u00f3d\u00f3 \u00e9rt\u00e9kek egy halmaz\u00e1t k\u00e9pviseli, p\u00e9ld\u00e1ul a szenzorok \u00e1llapot\u00e1nak peri\u00f3dikus lek\u00e9rdez\u00e9s\u00e9n vagy a metrik\u00e1k gy\u0171jt\u00e9s\u00e9n kereszt\u00fcl).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander 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>Itt tal\u00e1lhat\u00f3 az el\u0151ad\u00e1s vide\u00f3ja \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\">Di\u00e1k<\/a><\/noindex><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/0073390d6dbcc6ab3e5305907ac6a229.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mes\u00e9lek egy kicsit magamr\u00f3l. \u00c9n vagyok Alekszandr Valjalkin. Itt van <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/valyala\">a GitHub fi\u00f3kom<\/a><\/noindex>. \u00c9rdekel a Go nyelv \u00e9s a teljes\u00edtm\u00e9nyoptimaliz\u00e1l\u00e1s. Sok hasznos \u00e9s kev\u00e9sb\u00e9 hasznos k\u00f6nyvt\u00e1rat \u00edrtam. Ezek vagy a <code>fast<\/code>vagy a <code>quick<\/code> el\u0151taggal kezd\u0151dnek. <\/p>\n<p><\/p>\n<p>Jelenleg a VictoriaMetrics-en dolgozom. Mi ez \u00e9s mit csin\u00e1lok ott? Err\u0151l fogok besz\u00e9lni ebben a prezent\u00e1ci\u00f3ban. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/c9194bc3fee1f615d838979bec12f7d0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Az el\u0151ad\u00e1s terve a k\u00f6vetkez\u0151:<\/p>\n<p><\/p>\n<ul>\n<li>El\u0151sz\u00f6r elmondom, mi az a VictoriaMetrics. <\/li>\n<li>Ezut\u00e1n mes\u00e9lek az id\u0151alap\u00fa sorokr\u00f3l. <\/li>\n<li>Majd elmondom, hogyan m\u0171k\u00f6dik az id\u0151alap\u00fa adatb\u00e1zis.<\/li>\n<li>Tov\u00e1bb\u00e1 besz\u00e9lek az adatb\u00e1zis architekt\u00far\u00e1j\u00e1r\u00f3l: mib\u0151l \u00e1ll.<\/li>\n<li>V\u00e9g\u00fcl \u00e1tt\u00e9rek a VictoriaMetrics-ban tal\u00e1lhat\u00f3 optimaliz\u00e1ci\u00f3kra. Ezek k\u00f6z\u00e9 tartozik a megford\u00edtott index optimaliz\u00e1l\u00e1sa \u00e9s a Go nyelv bitset megval\u00f3s\u00edt\u00e1s\u00e1nak optimaliz\u00e1l\u00e1sa.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/3e0244b6b6fe952f660e4a094778921a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tudja valaki a VictoriaMetrics-t a teremben? Nincs mit tenni, m\u00e1r sokan ismerik. Ez j\u00f3 h\u00edr. Akik nem ismerik\u2014 ez az id\u0151alap\u00fa sorok adatb\u00e1zisa. A ClickHouse architekt\u00far\u00e1j\u00e1ra \u00e9p\u00fcl, n\u00e9h\u00e1ny r\u00e9szlet a ClickHouse megval\u00f3s\u00edt\u00e1s\u00e1b\u00f3l. P\u00e9ld\u00e1ul olyanok, mint: MergeTree, p\u00e1rhuzamos sz\u00e1m\u00edt\u00e1s minden el\u00e9rhet\u0151 processzortagon, \u00e9s a teljes\u00edtm\u00e9nyoptimaliz\u00e1l\u00e1s a processzor cache-be helyezett adatr\u00e9szeken v\u00e9gzett munk\u00e1val. <\/p>\n<p><\/p>\n<p>A VictoriaMetrics a legjobb adatkompresszi\u00f3t biztos\u00edt m\u00e1s id\u0151alap\u00fa adatb\u00e1zisokhoz k\u00e9pest. <\/p>\n<p><\/p>\n<p>F\u00fcgg\u0151legesen sk\u00e1l\u00e1zhat\u00f3 \u2014 azaz t\u00f6bb processzort \u00e9s t\u00f6bb mem\u00f3ri\u00e1t adhat hozz\u00e1 egy g\u00e9pen. A VictoriaMetrics sikeresen kihaszn\u00e1lja ezeket a rendelkez\u00e9sre \u00e1ll\u00f3 er\u0151forr\u00e1sokat \u00e9s jav\u00edtja a line\u00e1ris teljes\u00edtm\u00e9nyt.<\/p>\n<p><\/p>\n<p>A VictoriaMetrics v\u00edzszintesen is sk\u00e1l\u00e1zhat\u00f3 \u2014 azaz tov\u00e1bbi csom\u00f3pontokat adhat hozz\u00e1 a VictoriaMetrics klaszterhez, \u00e9s a teljes\u00edtm\u00e9nye majdnem line\u00e1risan n\u0151.<\/p>\n<p><\/p>\n<p>Ahogy kital\u00e1ltad, a VictoriaMetrics egy gyors adatb\u00e1zis, mert m\u00e1sr\u00f3l nem tudok besz\u00e9lni. Go nyelven \u00edr\u00f3dott, ez\u00e9rt err\u0151l mes\u00e9lek ezen a meetup-on.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/0121c9baead722eb1fe22fb6f900d4ad.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ki tudja, mi az a id\u0151szaki sor? Sok ember tudja. Az id\u0151szaki sor egy p\u00e1r sorozatot jelent <code>(timestamp, \u00e9rt\u00e9k)<\/code>, ahol ezek a p\u00e1rok id\u0151rendben vannak rendezve. Az \u00e9rt\u00e9k egy lebeg\u0151pontos sz\u00e1mot jelent \u2013 float64.<\/p>\n<p><\/p>\n<p>Minden id\u0151szaki sort egy egyedi kulcs azonos\u00edt. Mi alkotja ezt a kulcsot? Ez egy nem \u00fcres kulcs-\u00e9rt\u00e9k p\u00e1r halmazb\u00f3l \u00e1ll. <\/p>\n<p><\/p>\n<p>\u00cdme egy p\u00e9lda egy id\u0151szaki sorra. Ennek a sornak a kulcsa a k\u00f6vetkez\u0151 p\u00e1rok list\u00e1ja: <code>__name__=\"cpu_usage\"<\/code> \u2013 ez a metrika neve, <code>instance=\"my-server\"<\/code> \u2014 ez az a sz\u00e1m\u00edt\u00f3g\u00e9p, ahol ezt a metrik\u00e1t \u00f6sszegy\u0171jt\u00f6tt\u00e9k, <code>datacenter=\"us-east\"<\/code> \u2014 ez az adatk\u00f6zpont, ahol ez a sz\u00e1m\u00edt\u00f3g\u00e9p tal\u00e1lhat\u00f3.<\/p>\n<p><\/p>\n<p>\u00cdgy kaptunk egy id\u0151szaki sor nevet, amely h\u00e1rom kulcs-\u00e9rt\u00e9k p\u00e1rb\u00f3l \u00e1ll. Ehhez a kulcshoz a k\u00f6vetkez\u0151 p\u00e1rok list\u00e1ja tartozik: <code>(timestamp, \u00e9rt\u00e9k)<\/code>. <code>t1, t3, t3, ..., tN<\/code> \u2014 ezek az id\u0151b\u00e9lyegek, <code>10, 20, 12, ..., 15<\/code> \u2014 a megfelel\u0151 \u00e9rt\u00e9kek. Ez a cpu-usage az adott id\u0151pontban a megadott sorhoz.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/76cab9db0263318d355ac607ceb7e0f6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hol lehet haszn\u00e1lni az id\u0151szaki sorokat? Valakinek van \u00f6tlete? <\/p>\n<p><\/p>\n<ul>\n<li>A DevOps-ban a CPU, RAM, h\u00e1l\u00f3zat, rps, hib\u00e1k sz\u00e1ma stb. terhel\u00e9s\u00e9t lehet m\u00e9rni. <\/li>\n<li>IoT \u2013 m\u00e9rhetj\u00fck a h\u0151m\u00e9rs\u00e9kletet, nyom\u00e1st, f\u00f6ldrajzi koordin\u00e1t\u00e1kat \u00e9s m\u00e9g sok m\u00e1st.<\/li>\n<li>A p\u00e9nz\u00fcgyekben \u2013 nyomon k\u00f6vethetj\u00fck a k\u00fcl\u00f6nb\u00f6z\u0151 r\u00e9szv\u00e9nyek \u00e9s valut\u00e1k \u00e1rait. <\/li>\n<li>Ezen k\u00edv\u00fcl az id\u0151szaki sorok haszn\u00e1lhat\u00f3k a gy\u00e1rt\u00e1si folyamatok monitoroz\u00e1s\u00e1ra a gy\u00e1rakban. Vannak felhaszn\u00e1l\u00f3ink, akik a VictoriaMetrics-t haszn\u00e1lj\u00e1k sz\u00e9ler\u0151m\u0171vek, robotok monitoroz\u00e1s\u00e1ra.<\/li>\n<li>Az id\u0151szaki sorok hasznosak k\u00fcl\u00f6nb\u00f6z\u0151 eszk\u00f6z\u00f6k szenzorainak inform\u00e1ci\u00f3inak gy\u0171jt\u00e9s\u00e9re is. P\u00e9ld\u00e1ul a motorok eset\u00e9ben; a gumiabroncsok nyom\u00e1s\u00e1nak m\u00e9r\u00e9s\u00e9re; a sebess\u00e9g, t\u00e1vols\u00e1g m\u00e9r\u00e9s\u00e9re; \u00fczemanyag-fogyaszt\u00e1s m\u00e9r\u00e9s\u00e9re stb.<\/li>\n<li>Az id\u0151szaki sorokat rep\u00fcl\u0151g\u00e9pek monitoroz\u00e1s\u00e1ra is haszn\u00e1lj\u00e1k. Minden rep\u00fcl\u0151g\u00e9pen van egy fekete doboz, amely id\u0151szaki sorokat gy\u0171jt a rep\u00fcl\u0151g\u00e9p eg\u00e9szs\u00e9gi param\u00e9tereir\u0151l. Az id\u0151szaki sorokat az \u0171riparban is haszn\u00e1lj\u00e1k. <\/li>\n<li>Eg\u00e9szs\u00e9g\u00fcgy \u2013 a v\u00e9rnyom\u00e1s, pulzus stb.<\/li>\n<\/ul>\n<p><\/p>\n<p>Lehet, hogy m\u00e9g vannak olyan alkalmaz\u00e1sok, amelyekr\u0151l megfeledkeztem, de rem\u00e9lem, hogy meg\u00e9rtetted, hogy az id\u0151szaki sorokat akt\u00edvan haszn\u00e1lj\u00e1k a modern vil\u00e1gban. \u00c9s a haszn\u00e1latuk volumene \u00e9vr\u0151l \u00e9vre n\u0151.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/f1da29d372163751268b6a8f86836d04.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mi\u00e9rt sz\u00fcks\u00e9ges az id\u0151szakos adatokhoz adatb\u00e1zis? Mi\u00e9rt nem lehet haszn\u00e1lni a hagyom\u00e1nyos rel\u00e1ci\u00f3s adatb\u00e1zist id\u0151szakos adatok t\u00e1rol\u00e1s\u00e1ra?<\/p>\n<p><\/p>\n<p>Mert az id\u0151szakos adatok \u00e1ltal\u00e1ban nagy mennyis\u00e9g\u0171 inform\u00e1ci\u00f3t tartalmaznak, amelyet neh\u00e9z hagyom\u00e1nyos adatb\u00e1zisokban t\u00e1rolni \u00e9s feldolgozni. Ez\u00e9rt j\u00f6ttek l\u00e9tre a specializ\u00e1lt adatb\u00e1zisok id\u0151szakos adatokhoz. Ezek az adatb\u00e1zisok hat\u00e9konyan t\u00e1rolj\u00e1k a pontokat <code>(timestamp, \u00e9rt\u00e9k)<\/code> megadott kulccsal. API-t k\u00edn\u00e1lnak az adatok kulcs alapj\u00e1n t\u00f6rt\u00e9n\u0151 olvas\u00e1s\u00e1hoz, egyetlen kulcs-\u00e9rt\u00e9k p\u00e1r szerint, vagy t\u00f6bb ilyen p\u00e1r szerint, vagy regexp alapj\u00e1n. P\u00e9ld\u00e1ul, ha szeretn\u00e9 megtal\u00e1lni az \u00f6sszes szolg\u00e1ltat\u00e1s CPU-terhel\u00e9s\u00e9t az amerikai adatk\u00f6zpontban, akkor ilyen \u00e1lk\u00e9rd\u00e9st kell haszn\u00e1lnia.<\/p>\n<p><\/p>\n<p>Az id\u0151szakos adatokhoz k\u00e9sz\u00fclt adatb\u00e1zisok \u00e1ltal\u00e1ban specializ\u00e1lt lek\u00e9rdez\u0151 nyelveket haszn\u00e1lnak, mivel az SQL nem igaz\u00e1n alkalmas az id\u0151szakos adatokra. B\u00e1r vannak adatb\u00e1zisok, amelyek t\u00e1mogatj\u00e1k az SQL-t, de az nem igaz\u00e1n megfelel\u0151. Sokkal jobban megfelelnek azok a lek\u00e9rdez\u0151 nyelvek, mint <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>. Rem\u00e9lem, hogy valaki hallott ezek k\u00f6z\u00fcl a nyelvek k\u00f6z\u00fcl legal\u00e1bb egyikr\u0151l. A PromQL-t val\u00f3sz\u00edn\u0171leg sokan ismerik. Ez a Prometheus lek\u00e9rdez\u0151 nyelve.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/59e5b6d82a2f7861077bc5fe34519ee4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00cdgy n\u00e9z ki a modern id\u0151szakos adatb\u00e1zis architekt\u00far\u00e1ja a VictoriaMetrics p\u00e9ld\u00e1j\u00e1n.<\/p>\n<p><\/p>\n<p>K\u00e9t r\u00e9szb\u0151l \u00e1ll. Ez egy t\u00e1rol\u00f3 az inverz index sz\u00e1m\u00e1ra \u00e9s egy t\u00e1rol\u00f3 az id\u0151szakos adatok \u00e9rt\u00e9kei sz\u00e1m\u00e1ra. Ezek a t\u00e1rol\u00f3k k\u00fcl\u00f6n vannak v\u00e1lasztva. <\/p>\n<p><\/p>\n<p>Amikor \u00faj bejegyz\u00e9s \u00e9rkezik az adatb\u00e1zisba, el\u0151sz\u00f6r az inverz indexet k\u00e9rdezz\u00fck le, hogy megtal\u00e1ljuk az id\u0151szakos sor azonos\u00edt\u00f3j\u00e1t a megadott <code>label=value<\/code> sorozat szerint. Megtal\u00e1ljuk ezt az azonos\u00edt\u00f3t, \u00e9s elmentj\u00fck az \u00e9rt\u00e9ket az adatb\u00e1zis t\u00e1rol\u00f3j\u00e1ba.<\/p>\n<p><\/p>\n<p>Amikor \u00e9rkezik egy k\u00e9r\u00e9s az TSDB-b\u0151l t\u00f6rt\u00e9n\u0151 adatlek\u00e9r\u00e9shez, el\u0151sz\u00f6r az inverz indexhez ny\u00falunk. Kiolvassuk az \u00f6sszes <code>timeseries_ids<\/code> bejegyz\u00e9st, amelyek megfelelnek a megadott <code>label=value<\/code>sorozatnak. Ezut\u00e1n kiolvassuk az \u00f6sszes sz\u00fcks\u00e9ges adatot az adatb\u00e1zisb\u00f3l, amely az <code>timeseries_ids<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/eb9b36fa3c6de2188b97b56ad3839b2c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tekints\u00fck meg, hogyan dolgozza fel az id\u0151szakos adatb\u00e1zis a bej\u00f6v\u0151 select k\u00e9rd\u00e9st.<\/p>\n<p><\/p>\n<ul>\n<li>El\u0151sz\u00f6r kiolvassa az \u00f6sszes <code>timeseries_ids<\/code> bejegyz\u00e9st az inverz indexb\u0151l, amelyek tartalmazz\u00e1k a megadott p\u00e1rokat <code>label=value<\/code>, vagy amelyek megfelelnek a megadott regul\u00e1ris kifejez\u00e9snek.<\/li>\n<li>Ezut\u00e1n kiolvassa az \u00f6sszes adatpontot az adatb\u00e1zisb\u00f3l a megadott id\u0151intervallumban a megtal\u00e1ltak sz\u00e1m\u00e1ra. <code>timeseries_ids<\/code>.<\/li>\n<li>Ezut\u00e1n az adatb\u00e1zis sz\u00e1m\u00edt\u00e1sokat v\u00e9gez ezekkel az adatpontokkal a felhaszn\u00e1l\u00f3i k\u00e9r\u00e9s szerint. Majd visszaadja a v\u00e1laszt.<\/li>\n<\/ul>\n<p><\/p>\n<p>A prezent\u00e1ci\u00f3mban meg fogom mutatni az els\u0151 r\u00e9szt. Ez a keres\u00e9s <code>timeseries_ids<\/code> az inverz index alapj\u00e1n. A m\u00e1sodik \u00e9s harmadik r\u00e9szt k\u00e9s\u0151bb megtekinthetik <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/VictoriaMetrics\/VictoriaMetrics\">a VictoriaMetrics forr\u00e1sk\u00f3dj\u00e1ban<\/a><\/noindex>, vagy v\u00e1rjanak, am\u00edg elk\u00e9sz\u00edtek m\u00e1s el\u0151ad\u00e1sokat \ud83d\ude42<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/3a7dab707dd1defb9bc674a342052a03.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L\u00e9pj\u00fcnk az inverz indexre. Sokan \u00fagy gondolhatj\u00e1k, hogy ez egyszer\u0171. Ki tudja, mi az inverz index \u00e9s hogyan m\u0171k\u00f6dik? Oh, m\u00e1r nem sokan vannak. Pr\u00f3b\u00e1ljuk meg\u00e9rteni, mi ez. <\/p>\n<p><\/p>\n<p>Val\u00f3j\u00e1ban minden egyszer\u0171. Ez csup\u00e1n egy sz\u00f3t\u00e1r, amely a kulcsot egy \u00e9rt\u00e9khez rendeli. Mi a kulcs? Ez a p\u00e1r <code>label=value<\/code>, ahol <code>label<\/code> \u00e9s <code>\u00e9rt\u00e9k<\/code> \u2014 ezek karakterl\u00e1ncok. Az \u00e9rt\u00e9kek pedig egy halmaz <code>timeseries_ids<\/code>, amely tartalmazza a megadott p\u00e1rt <code>label=value<\/code>.<\/p>\n<p><\/p>\n<p>Az inverz index lehet\u0151v\u00e9 teszi, hogy gyorsan megtal\u00e1ljuk az \u00f6sszes <code>timeseries_ids<\/code>, amely rendelkezik a megadottal <code>label=value<\/code>.<\/p>\n<p><\/p>\n<p>Illetve lehet\u0151v\u00e9 teszi, hogy gyorsan megtal\u00e1ljuk <code>timeseries_ids<\/code> id\u0151szakokat t\u00f6bb p\u00e1rhoz <code>label=value<\/code>, vagy a k\u00f6vetkez\u0151k szerint p\u00e1rhoz <code>label=regexp<\/code>. Hogyan t\u00f6rt\u00e9nik ez? A halmaz keresztez\u0151d\u00e9s\u00e9nek megtal\u00e1l\u00e1s\u00e1val <code>timeseries_ids<\/code> minden p\u00e1r eset\u00e9ben <code>label=value<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/837a15a078e8c9422c721f3f072c0c09.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e9zz\u00fck meg az inverz index k\u00fcl\u00f6nb\u00f6z\u0151 megval\u00f3s\u00edt\u00e1sait. Kezdj\u00fck a legbasicabb, naiv megval\u00f3s\u00edt\u00e1ssal. \u00cdgy n\u00e9z ki. <\/p>\n<p><\/p>\n<p>Funkci\u00f3 <code>getMetricIDs<\/code> megkapja a karakterl\u00e1ncok list\u00e1j\u00e1t. Minden karakterl\u00e1nc tartalmazza <code>label=value<\/code>. Ez a funkci\u00f3 visszaad egy list\u00e1t <code>metricIDs<\/code>.<\/p>\n<p><\/p>\n<p>Hogyan m\u0171k\u00f6dik ez? Itt egy glob\u00e1lis v\u00e1ltoz\u00f3, amelyet <code>invertedIndex<\/code>. Ez egy szok\u00e1sos sz\u00f3t\u00e1r (<code>map<\/code>), amely a karakterl\u00e1ncot egy int-v\u00e1gatlanra rendeli. A karakterl\u00e1nc tartalmazza <code>label=value<\/code>.<\/p>\n<p><\/p>\n<p>A funkci\u00f3 megval\u00f3s\u00edt\u00e1sa: el\u0151h\u00edvjuk <code>metricIDs<\/code> az els\u0151 sz\u00e1m\u00e1ra, majd v\u00e9gigmegy\u00fcnk az \u00f6sszes t\u00f6bbi <code>label=value<\/code>, \u00f6sszegy\u0171jtj\u00fck <code>label=value<\/code>sz\u00e1m\u00e1ra. \u00c9s megh\u00edvjuk a <code>metricIDs<\/code> intersectInts <code>funkci\u00f3t, amelyr\u0151l k\u00e9s\u0151bb sz\u00f3 lesz. Ez a funkci\u00f3 visszaadja ezen list\u00e1k keresztez\u0151d\u00e9s\u00e9t.<\/code>Amint l\u00e1tj\u00e1k, az inverz index megval\u00f3s\u00edt\u00e1sa nem t\u00fal bonyolult. De ez egy naiv megval\u00f3s\u00edt\u00e1s. Milyen h\u00e1tr\u00e1nyai vannak? A naiv megval\u00f3s\u00edt\u00e1s legf\u0151bb h\u00e1tr\u00e1nya, hogy az inverz index a mem\u00f3ri\u00e1ban t\u00e1rol\u00f3dik. Az alkalmaz\u00e1s \u00fajraind\u00edt\u00e1sa ut\u00e1n elvesz\u00edtj\u00fck ezt az indexet. Nincs a lemezre val\u00f3 ment\u00e9s. Az adatb\u00e1zis sz\u00e1m\u00e1ra ez az inverz index val\u00f3sz\u00edn\u0171leg nem alkalmas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/709beca79884a9693098781974c26f4d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Amint l\u00e1tj\u00e1k, az inverz index megval\u00f3s\u00edt\u00e1sa nem t\u00fal bonyolult. De ez egy naiv megval\u00f3s\u00edt\u00e1s. Milyen h\u00e1tr\u00e1nyai vannak? A naiv megval\u00f3s\u00edt\u00e1s legf\u0151bb h\u00e1tr\u00e1nya, hogy az inverz index a mem\u00f3ri\u00e1ban t\u00e1rol\u00f3dik. Az alkalmaz\u00e1s \u00fajraind\u00edt\u00e1sa ut\u00e1n elvesz\u00edtj\u00fck ezt az indexet. Nincs a lemezre val\u00f3 ment\u00e9s. Az adatb\u00e1zis sz\u00e1m\u00e1ra ez az inverz index val\u00f3sz\u00edn\u0171leg nem alkalmas.<\/p>\n<p><\/p>\n<p>A m\u00e1sodik h\u00e1tr\u00e1ny is a mem\u00f3ri\u00e1val \u00f6sszef\u00fcgg. Az invert\u00e1lt indexnek a RAM-ban kell lennie. Ha meghaladja a RAM m\u00e9ret\u00e9t, nyilv\u00e1nval\u00f3, hogy mem\u00f3riahib\u00e1t kapunk, \u00e9s a program nem fog m\u0171k\u00f6dni.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/495394168ac03aa8cbcf56ccad1cb2b8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ezt a probl\u00e9m\u00e1t k\u00e9sz megold\u00e1sok, p\u00e9ld\u00e1ul a k\u00f6vetkez\u0151k seg\u00edts\u00e9g\u00e9vel lehet orvosolni: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/google\/leveldb\">LevelDB<\/a><\/noindex>, vagy <noindex><a rel=\"nofollow\" href=\"https:\/\/rocksdb.org\/\">RocksDB<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>R\u00f6viden, sz\u00fcks\u00e9g\u00fcnk van egy adatb\u00e1zisra, amely lehet\u0151v\u00e9 teszi h\u00e1rom m\u0171velet gyors v\u00e9grehajt\u00e1s\u00e1t. <\/p>\n<p><\/p>\n<ul>\n<li>Az els\u0151 m\u0171velet a felv\u00e9tel <code>kulcs-\u00e9rt\u00e9k<\/code> ebbe az adatb\u00e1zisba. Ezt nagyon gyorsan v\u00e9gzi, ahol <code>kulcs-\u00e9rt\u00e9k<\/code> \u2013 ezek tetsz\u0151leges sz\u00f6vegek. <\/li>\n<li>A m\u00e1sodik m\u0171velet az \u00e9rt\u00e9k gyors keres\u00e9se a megadott kulcs alapj\u00e1n.<\/li>\n<li>A harmadik m\u0171velet pedig az \u00f6sszes \u00e9rt\u00e9k gyors keres\u00e9se a megadott prefixum alapj\u00e1n. <\/li>\n<\/ul>\n<p><\/p>\n<p>A LevelDB \u00e9s a RocksDB adatb\u00e1zisokat a Google \u00e9s a Facebook fejlesztette. El\u0151sz\u00f6r a LevelDB jelent meg. Azt\u00e1n a Facebook munkat\u00e1rsai \u00e1tvett\u00e9k a LevelDB-t \u00e9s elkezdt\u00e9k fejleszteni, l\u00e9trehozt\u00e1k a RocksDB-t. Ma a Facebookon bel\u00fcl majdnem minden bels\u0151 adatb\u00e1zis RocksDB-n fut, bele\u00e9rtve azt is, hogy a MySQL-t \u00e1t\u00e1ll\u00edtott\u00e1k RocksDB-re. Ezt \u00edgy nevezik: <noindex><a rel=\"nofollow\" href=\"http:\/\/myrocks.io\/\">MyRocks<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Az invert\u00e1lt indexet a LevelDB seg\u00edts\u00e9g\u00e9vel lehet megval\u00f3s\u00edtani. Hogyan lehet ezt megtenni? A kulcsk\u00e9nt <code>label=value<\/code>megtartjuk. Az \u00e9rt\u00e9kk\u00e9nt pedig az id\u0151sort azonos\u00edt\u00f3j\u00e1t t\u00e1roljuk, ahol a p\u00e1r tal\u00e1lhat\u00f3. <code>label=value<\/code>.<\/p>\n<p><\/p>\n<p>Ha sok id\u0151sort tartalmazunk ezzel a p\u00e1rral <code>label=value<\/code>, akkor sok sor lesz az adatb\u00e1zisban, amelyek azonos kulccsal \u00e9s k\u00fcl\u00f6nb\u00f6z\u0151 <code>timeseries_ids<\/code>rendelkeznek. Ahhoz, hogy megkapjuk az \u00f6sszes list\u00e1t <code>timeseries_ids<\/code>, amelyek ezzel kezd\u0151dnek, <code>label=prefix<\/code>, v\u00e9gz\u00fcnk egy tartom\u00e1nyi vizsg\u00e1latot, amelyre ez az adatb\u00e1zis optimaliz\u00e1lva van. Teh\u00e1t kiv\u00e1lasztunk minden olyan sort, amely ezzel kezd\u0151dik, <code>label=prefix<\/code> \u00e9s megkapjuk a sz\u00fcks\u00e9ges <code>timeseries_ids<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/a40877ecb758ac3bc1979bcd568d7e83.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00cdme egy p\u00e9ldaszer\u0171 megval\u00f3s\u00edt\u00e1s, hogy n\u00e9zne ki Go-ban. Van egy invert\u00e1lt index\u00fcnk. Ez a LevelDB.<\/p>\n<p><\/p>\n<p>A funkci\u00f3 ugyanaz, mint az naiv megval\u00f3s\u00edt\u00e1sn\u00e1l. Szinte sorban k\u00f6veti a naiv megval\u00f3s\u00edt\u00e1st. Az egyetlen elt\u00e9r\u00e9s, hogy a <code>map<\/code> helyett az invert\u00e1lt indexre hivatkozunk. Megkapjuk az \u00f6sszes \u00e9rt\u00e9ket az els\u0151 <code>label=value<\/code>. Azt\u00e1n v\u00e9gigmegy\u00fcnk az \u00f6sszes fennmarad\u00f3 p\u00e1ron <code>label=value<\/code> \u00e9s megkapjuk a megfelel\u0151 metricIDs k\u00e9szleteket sz\u00e1mukra. Ezut\u00e1n megtal\u00e1ljuk az metsz\u00e9st. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/de11b15286816ada04b22727ff78e43d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00dagy t\u0171nik, minden rendben van, de ebben a megold\u00e1sban vannak h\u00e1tr\u00e1nyok. A VictoriaMetrics kezdetben az LevelDB alap\u00fa invert\u00e1lt indexet val\u00f3s\u00edtotta meg. De v\u00e9g\u00fcl el kellett \u00e1llnia t\u0151le.<\/p>\n<p><\/p>\n<p>Mi\u00e9rt? Mert a LevelDB lassabb, mint a naiv megval\u00f3s\u00edt\u00e1s. A naiv megval\u00f3s\u00edt\u00e1sn\u00e1l a megadott kulcs alapj\u00e1n azonnal lek\u00e9rdezz\u00fck az eg\u00e9sz slice-ot. <code>metricIDs<\/code>. Ez a nagyon gyors m\u0171velet \u2013 az eg\u00e9sz slice k\u00e9szen \u00e1ll a haszn\u00e1latra.<\/p>\n<p><\/p>\n<p>A LevelDB-n\u00e9l azonban minden h\u00edv\u00e1sn\u00e1l a <code>GetValues<\/code> f\u00fcggv\u00e9nyt a <code>label=value<\/code>. Minden egyes sor eset\u00e9ben ki kell nyerni az \u00e9rt\u00e9ket <code>timeseries_ids<\/code>. Ezekb\u0151l <code>timeseries_ids<\/code> \u00f6ssze kell gy\u0171jteni a slice-ot. <code>timeseries_ids<\/code>. Nyilv\u00e1nval\u00f3, hogy ez sokkal lassabb, mint egyszer\u0171en egy klasszikus map-hez kulcs alapj\u00e1n hozz\u00e1f\u00e9rni.<\/p>\n<p><\/p>\n<p>A m\u00e1sodik h\u00e1tr\u00e1ny az, hogy a LevelDB C nyelven \u00edr\u00f3dott. A Go nyelvb\u0151l C f\u00fcggv\u00e9nyek h\u00edv\u00e1sa nem t\u00fal gyors. Ez t\u00f6bb sz\u00e1z nanosekundumot ig\u00e9nyel. Ez nem t\u00fal gyors, mert egy \u00e1tlagos Go f\u00fcggv\u00e9nyh\u00edv\u00e1s, ami 1-5 nanosekundumot vesz ig\u00e9nybe, t\u00edzszeres teljes\u00edtm\u00e9nybeli elt\u00e9r\u00e9shez vezet. A VictoriaMetrics sz\u00e1m\u00e1ra ez \u00e9letbev\u00e1g\u00f3 h\u00e1tr\u00e1ny volt \ud83d\ude42<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/47cace825807b7b062064c2e790dc9d3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ez\u00e9rt \u00edrtam egy saj\u00e1t megold\u00e1st az inverz indexre. Ezt nevezt\u00fck <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/VictoriaMetrics\/VictoriaMetrics\/tree\/master\/lib\/mergeset\">mergeset-nek<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>A mergeset a MergeTree adatstrukt\u00far\u00e1ra \u00e9p\u00fcl. Ez az adatstrukt\u00fara a ClickHouse-b\u00f3l sz\u00e1rmazik. Nyilv\u00e1nval\u00f3, hogy a mergeset-nek optimaliz\u00e1lva kell lennie a gyors keres\u00e9shez <code>timeseries_ids<\/code> egy megadott kulcsra. A mergeset teljes eg\u00e9sz\u00e9ben Go nyelven \u00edr\u00f3dott. Megn\u00e9zheti a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/VictoriaMetrics\/VictoriaMetrics\">VictoriaMetrics forr\u00e1sk\u00f3dj\u00e1t a GitHub-on<\/a><\/noindex>. A mergeset megval\u00f3s\u00edt\u00e1sa a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/VictoriaMetrics\/VictoriaMetrics\/tree\/master\/lib\/mergeset\">\/lib\/mergeset<\/a><\/noindex>mapp\u00e1ban tal\u00e1lhat\u00f3. Megpr\u00f3b\u00e1lhatja meg\u00e9rteni, mi t\u00f6rt\u00e9nik ott.<\/p>\n<p><\/p>\n<p>A mergeset API-ja nagyon hasonl\u00edt a LevelDB \u00e9s RocksDB API-j\u00e1ra. Azaz lehet\u0151v\u00e9 teszi \u00faj bejegyz\u00e9sek gyors elment\u00e9s\u00e9t \u00e9s a bejegyz\u00e9sek gyors kiv\u00e1laszt\u00e1s\u00e1t egy megadott prefix alapj\u00e1n.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/845704ed36f70beb468907d22701af59.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A mergeset h\u00e1tr\u00e1nyair\u00f3l k\u00e9s\u0151bb besz\u00e9l\u00fcnk. Most a VictoriaMetrics-szal kapcsolatos inverz index megval\u00f3s\u00edt\u00e1sa sor\u00e1n felmer\u00fclt probl\u00e9m\u00e1kr\u00f3l besz\u00e9lgess\u00fcnk.<\/p>\n<p><\/p>\n<p>Mi\u00e9rt mer\u00fcltek fel?<\/p>\n<p><\/p>\n<p>Az els\u0151 ok a magas churn rate. Magyarra ford\u00edtva \u2013 ez a gyakori id\u0151beli sorok v\u00e1ltakoz\u00e1sa. Amikor egy id\u0151beli sor v\u00e9get \u00e9r, \u00e9s egy \u00faj kezd\u0151dik, vagy sok \u00faj id\u0151beli sor kezd\u0151dik. Ez gyakran el\u0151fordul.<\/p>\n<p><\/p>\n<p>A m\u00e1sodik ok az id\u0151beli sorok magas sz\u00e1ma. Eleinte, amikor a monitoroz\u00e1s n\u00e9pszer\u0171v\u00e9 v\u00e1lt, az id\u0151beli sorok sz\u00e1ma kicsi volt. P\u00e9ld\u00e1ul minden sz\u00e1m\u00edt\u00f3g\u00e9phez figyelni kell a CPU, mem\u00f3ria, h\u00e1l\u00f3zat \u00e9s lemez terhel\u00e9s\u00e9t. 4 id\u0151beli sor minden sz\u00e1m\u00edt\u00f3g\u00e9phez. Tegy\u00fck fel, hogy 100 sz\u00e1m\u00edt\u00f3g\u00e9pe van, \u00e9s 400 id\u0151beli sorral rendelkezik. Ez nagyon kev\u00e9s. <\/p>\n<p><\/p>\n<p>Id\u0151vel az emberek kital\u00e1lt\u00e1k, hogy r\u00e9szletesebb inform\u00e1ci\u00f3kat lehet m\u00e9rni. P\u00e9ld\u00e1ul m\u00e9rheti a CPU terhel\u00e9s\u00e9t nem az eg\u00e9sz processzor, hanem minden egyes processzormag k\u00fcl\u00f6n-k\u00fcl\u00f6n. Ha 40 processzormagja van, akkor 40-szer annyi id\u0151sorral rendelkezik a CPU terhel\u00e9s\u00e9nek m\u00e9r\u00e9s\u00e9re. <\/p>\n<p><\/p>\n<p>De ez m\u00e9g nem minden. Minden egyes processzormagnak lehet t\u00f6bb \u00e1llapota, mint p\u00e9ld\u00e1ul az idle, amikor t\u00e9tlen. Ezen k\u00edv\u00fcl m\u0171k\u00f6d\u00e9s user space-ben, kernel space-ben \u00e9s m\u00e1s \u00e1llapotok is. Mindezeket az \u00e1llapotokat is m\u00e9rhetj\u00fck k\u00fcl\u00f6n id\u0151sork\u00e9nt. Ez 7-8-szoros\u00e1ra n\u00f6veli az id\u0151sorok sz\u00e1m\u00e1t.<\/p>\n<p><\/p>\n<p>Egy metrik\u00e1b\u00f3l 40 x 8 = 320 metrik\u00e1nk van mind\u00f6ssze egy sz\u00e1m\u00edt\u00f3g\u00e9p eset\u00e9ben. Szorozzuk meg 100-zal, \u00edgy 32 000-et kapunk a 400 helyett. <\/p>\n<p><\/p>\n<p>Azt\u00e1n megjelent a Kubernetes. Ez m\u00e9g fokozta a helyzetet, mert a Kubernetesben sok k\u00fcl\u00f6nb\u00f6z\u0151 szolg\u00e1ltat\u00e1s hosztolhat\u00f3. Minden szolg\u00e1ltat\u00e1s t\u00f6bb podb\u00f3l \u00e1ll. Ezt mind figyelni kell. Ezenk\u00edv\u00fcl folyamatosan telep\u00edtj\u00fck az \u00faj verzi\u00f3kat a szolg\u00e1ltat\u00e1saib\u00f3l. Minden \u00faj verzi\u00f3hoz \u00faj id\u0151sorokat kell l\u00e9trehozni. Ennek eredm\u00e9nyek\u00e9ppen az id\u0151sorok sz\u00e1ma exponenci\u00e1lisan n\u0151, \u00e9s szembes\u00fcl\u00fcnk a nagy sz\u00e1m\u00fa id\u0151sorral foglalkoz\u00f3 probl\u00e9m\u00e1val, amelyet high-cardinality-nek nevez\u00fcnk. A VictoriaMetrics sikeresen kezeli ezt m\u00e1s id\u0151sor adatb\u00e1zisokkal \u00f6sszehasonl\u00edtva. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/c11b7ce6d3294ae420243f72636af4b9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tov\u00e1bb\u00edtsuk r\u00e9szletesebben a high churn rate-t. Mi\u00e9rt alakul ki a high churn rate a production k\u00f6rnyezetben? Mert egyes c\u00edmk\u00e9k \u00e9s tagek \u00e1lland\u00f3an v\u00e1ltoznak.<\/p>\n<p><\/p>\n<p>P\u00e9ld\u00e1ul vegy\u00fck a Kubernetest, amelyben l\u00e9tezik a fogalom <code>stb.);<\/code>, azaz amikor \u00faj verzi\u00f3t hozunk be az alkalmaz\u00e1s\u00e1hoz. A Kubernetes fejleszt\u0151i valami\u00e9rt \u00fagy d\u00f6nt\u00f6ttek, hogy belefoglalj\u00e1k a deployment azonos\u00edt\u00f3j\u00e1t a c\u00edmk\u00e9be.<\/p>\n<p><\/p>\n<p>Mire vezetett ez? Arra, hogy minden \u00faj deploymentn\u00e9l az \u00f6sszes r\u00e9gi id\u0151beli sor megszakad, \u00e9s helyett\u00fck \u00faj id\u0151beli sorok kezd\u0151dnek \u00faj c\u00edmke\u00e9rt\u00e9kkel. <code>deployment_id<\/code>. Ezekb\u0151l az id\u0151sorokb\u00f3l sz\u00e1mtalan, ak\u00e1r milli\u00f3 is lehet.<\/p>\n<p><\/p>\n<p>Fontos jellemz\u0151je ennek az eg\u00e9sznek, hogy az \u00f6sszes id\u0151sor mennyis\u00e9ge n\u0151, de az akt\u00edv id\u0151sorok, amelyekhez adatok \u00e9rkeznek, \u00e1lland\u00f3ak maradnak. Ezt az \u00e1llapotot high churn rate-nek nevezik.<\/p>\n<p><\/p>\n<p>A f\u0151 probl\u00e9ma a magas fluktu\u00e1ci\u00f3val kapcsolatban, hogy biztos\u00edtsuk az \u00f6sszes id\u0151sort keres\u0151 \u00e1lland\u00f3 sebess\u00e9g\u00e9t egy adott c\u00edmkehalmaz eset\u00e9n egy meghat\u00e1rozott id\u0151intervallumban. \u00c1ltal\u00e1ban ez az id\u0151intervallum az elm\u00falt \u00f3ra vagy az elm\u00falt nap. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/ac18482b87cc37624d163b30c68cf7be.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hogyan oldhatjuk meg ezt a probl\u00e9m\u00e1t? \u00cdme az els\u0151 lehet\u0151s\u00e9g. Az inverz indexet k\u00fcl\u00f6n\u00e1ll\u00f3 id\u0151szakokra osztjuk. Vagyis eltelik egy id\u0151intervallum, befejezz\u00fck a munk\u00e1t a jelenlegi inverz indexszel. \u00c9s l\u00e9trehozunk egy \u00faj inverz indexet. M\u00e9g egy id\u0151intervallum eltelik, l\u00e9trehozunk egy m\u00e1sikat \u00e9s m\u00e9g egyet. <\/p>\n<p><\/p>\n<p>\u00c9s ezekb\u0151l az inverz indexekb\u0151l kiv\u00e1lasztunk egy halmazt, amely az adott id\u0151intervallumba esik. Ennek megfelel\u0151en innen v\u00e1lasztjuk ki az id\u0151sorok azonos\u00edt\u00f3it. <\/p>\n<p><\/p>\n<p>Ez lehet\u0151v\u00e9 teszi az er\u0151forr\u00e1sok megtakar\u00edt\u00e1s\u00e1t, mert nem kell \u00e1tn\u00e9zn\u00fcnk azokat a r\u00e9szeket, amelyek nem esnek az adott id\u0151intervallumba. Vagyis \u00e1ltal\u00e1ban, ha az elm\u00falt \u00f3ra adatait v\u00e1lasztjuk ki, akkor a kor\u00e1bbi id\u0151intervallumok eset\u00e9ben kihagyjuk a lek\u00e9rdez\u00e9seket. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/1afa3a88caa7423941ae3494b9cec706.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Van m\u00e9g egy megold\u00e1si lehet\u0151s\u00e9g erre a probl\u00e9m\u00e1ra. Ez minden napra k\u00fcl\u00f6n list\u00e1t t\u00e1rolni az azonos\u00edt\u00f3kr\u00f3l, amelyek az adott napon tal\u00e1lkoztak.<\/p>\n<p><\/p>\n<p>Ennek a megold\u00e1snak az el\u0151nye a kor\u00e1bbi megold\u00e1shoz k\u00e9pest, hogy nem duplik\u00e1ljuk az id\u0151sorokkal kapcsolatos inform\u00e1ci\u00f3kat, amelyek id\u0151vel nem t\u0171nnek el. \u00c1lland\u00f3an jelen vannak \u00e9s nem v\u00e1ltoznak. <\/p>\n<p><\/p>\n<p>A h\u00e1tr\u00e1nya az, hogy egy ilyen megold\u00e1s bonyolultabb a megval\u00f3s\u00edt\u00e1sban \u00e9s nehezebb a hibakeres\u00e9sben. A VictoriaMetrics ezt a megold\u00e1st v\u00e1lasztotta. T\u00f6rt\u00e9nelmileg alakult \u00edgy. Ez a megold\u00e1s is j\u00f3l teljes\u00edt a kor\u00e1bbihoz k\u00e9pest. Mivel ezt a megold\u00e1st nem a megv\u00e1ltoztathatatlan id\u0151sorok adatinak minden part\u00edci\u00f3ban val\u00f3 duplik\u00e1l\u00e1sa miatt val\u00f3s\u00edtott\u00e1k meg. A VictoriaMetrics els\u0151dlegesen a lemezter\u00fclet fogyaszt\u00e1s\u00e1nak optimaliz\u00e1l\u00e1s\u00e1ra \u00f6sszpontos\u00edtott, \u00e9s a kor\u00e1bbi megval\u00f3s\u00edt\u00e1s rontotta a lemezter\u00fclet felhaszn\u00e1l\u00e1s\u00e1t. Ez a megold\u00e1s viszont jobban alkalmas a lemezter\u00fclet fogyaszt\u00e1s\u00e1nak minimaliz\u00e1l\u00e1s\u00e1ra, ez\u00e9rt ezt v\u00e1lasztott\u00e1k. <\/p>\n<p><\/p>\n<p>Meg kellett k\u00fczdeni vele. A k\u00fczdelem abban \u00e1llt, hogy ebben a megval\u00f3s\u00edt\u00e1sban akkor is sokkal nagyobb mennyis\u00e9get kell kiv\u00e1lasztani <code>timeseries_ids<\/code> az adatok sz\u00e1m\u00e1ra, mint amikor az inverz index id\u0151ben van felosztva.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/5b10e61aaa803428ed3bfe31815f09d3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hogyan oldottuk meg ezt a probl\u00e9m\u00e1t? Eredeti m\u00f3don oldottuk meg \u2013 az\u00e1ltal, hogy t\u00f6bb id\u0151sort azonos\u00edt\u00f3 t\u00e1roltunk az invert\u00e1lt index minden rekordj\u00e1ban, nem pedig egyet. Teh\u00e1t van egy kulcsunk <code>label=value<\/code>, amely minden id\u0151szakban megtal\u00e1lhat\u00f3. Mostant\u00f3l t\u00f6bb ilyet t\u00e1rolunk <code>timeseries_ids<\/code> egy rekordban.<\/p>\n<p><\/p>\n<p>\u00cdme egy p\u00e9lda. Kor\u00e1bban N rekordunk volt, most pedig egy rekordunk van, amelynek prefixe megegyezik az \u00f6sszes t\u00f6bbi\u00e9vel. Az el\u0151z\u0151 rekord \u00e9rt\u00e9ke tartalmazta az \u00f6sszes id\u0151sort azonos\u00edt\u00f3 id-t. <\/p>\n<p><\/p>\n<p>Ez lehet\u0151v\u00e9 tette, hogy az ilyen invert\u00e1lt indexek bej\u00e1r\u00e1si sebess\u00e9g\u00e9t 10-szeres\u00e9re n\u00f6velj\u00fck. R\u00e1ad\u00e1sul cs\u00f6kkentette a mem\u00f3riafogyaszt\u00e1st a cache sz\u00e1m\u00e1ra, mert most egyetlen sort t\u00e1rolunk <code>label=value<\/code> csak egyszer a cache-ben, \u00f6sszehasonl\u00edtva N-szer. Ez a sor nagy lehet, ha a c\u00edmk\u00e9kben \u00e9s a tagekben hossz\u00fa sz\u00f6vegek t\u00e1rol\u00f3dnak, ahogy azt a Kubernetes szeret csin\u00e1lni.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/ae4f38a440203bad2d03cf2abd1faafe.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Egy m\u00e1sik lehet\u0151s\u00e9g az invert\u00e1lt index keres\u00e9s\u00e9nek felgyors\u00edt\u00e1s\u00e1ra a sharding. T\u00f6bb invert\u00e1lt index l\u00e9trehoz\u00e1sa egyetlen helyett, \u00e9s az adatok shardingja k\u00f6z\u00f6tt\u00fck egy kulcs szerint. Ez egy halmaz <code>key=value<\/code> p\u00e1rokkal. Teh\u00e1t t\u00f6bb f\u00fcggetlen invert\u00e1lt index\u00fcnk van, amelyeket p\u00e1rhuzamosan k\u00e9rdezhet\u00fcnk le t\u00f6bb processzoron. Az el\u0151z\u0151 megval\u00f3s\u00edt\u00e1sok csak egymagos \u00fczemm\u00f3dban m\u0171k\u00f6dtek, teh\u00e1t csak egyetlen magon tudt\u00e1k bej\u00e1rni az adatokat. Ez a megold\u00e1s lehet\u0151v\u00e9 teszi az adatok bej\u00e1r\u00e1s\u00e1t egyszerre t\u00f6bb magon, ahogy a ClickHouse is szereti csin\u00e1lni. Ezt tervezz\u00fck megval\u00f3s\u00edtani.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/5ced6446efbf8ded8d7fb91694a999b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Most pedig t\u00e9rj\u00fcnk vissza a diszn\u00f3inkhoz \u2013 a metszeti f\u00fcggv\u00e9nyhez <code>timeseries_ids<\/code>. N\u00e9zz\u00fck meg, milyen megval\u00f3s\u00edt\u00e1sok lehets\u00e9gesek. Ez a f\u00fcggv\u00e9ny lehet\u0151v\u00e9 teszi, hogy megtal\u00e1ljunk <code>timeseries_ids<\/code> egy adott halmaz sz\u00e1m\u00e1ra <code>label=value<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/073a155018a91120c6996c324772f9af.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Az els\u0151 lehet\u0151s\u00e9g a naiv megval\u00f3s\u00edt\u00e1s. K\u00e9t egym\u00e1sba \u00e1gyazott ciklus. \u00cdgy \u00e9rkezik be a f\u00fcggv\u00e9nybe <code>funkci\u00f3t, amelyr\u0151l k\u00e9s\u0151bb sz\u00f3 lesz. Ez a funkci\u00f3 visszaadja ezen list\u00e1k keresztez\u0151d\u00e9s\u00e9t.<\/code> k\u00e9t slice \u2014 <code>a<\/code> \u00e9s <code>b<\/code>. A kimenetnek vissza kell adnia nek\u00fcnk ezen slice-ok metszet\u00e9t.<\/p>\n<p><\/p>\n<p>A naiv megval\u00f3s\u00edt\u00e1s \u00edgy n\u00e9z ki. V\u00e9gigmegy\u00fcnk a slice <code>a<\/code>\u00f6sszes \u00e9rt\u00e9k\u00e9n, bel\u00fcl pedig v\u00e9gigmegy\u00fcnk a slice <code>b<\/code>\u00f6sszes \u00e9rt\u00e9k\u00e9n. \u00d6sszehasonl\u00edtjuk \u0151ket. Ha megegyeznek, akkor megtal\u00e1ltuk a metszetet. \u00c9s elmentj\u00fck azt <code>eredm\u00e9ny<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/b89dcbb4f6d73377f9cf4f50169d6dd7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mik a h\u00e1tr\u00e1nyok? A kvadratikus bonyolults\u00e1g \u2013 ez a legf\u0151bb h\u00e1tr\u00e1nya. P\u00e9ld\u00e1ul, ha a slice-ok m\u00e9retei <code>a<\/code> \u00e9s <code>b<\/code> Ha milli\u00f3r\u00f3l van sz\u00f3, ez a funkci\u00f3 soha nem ad v\u00e1laszt. Mert egymilli\u00f3 iter\u00e1ci\u00f3t kellene v\u00e9grehajtania, ami nagyon sok, m\u00e9g a modern sz\u00e1m\u00edt\u00f3g\u00e9pek sz\u00e1m\u00e1ra is.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/bad26b0092a2fd7fc813bcb79a9138ce.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A m\u00e1sodik megval\u00f3s\u00edt\u00e1s a map-re alapoz. L\u00e9trehozzuk a map-et. Ezt a map-et felt\u00f6ltj\u00fck a slice \u00f6sszes \u00e9rt\u00e9k\u00e9vel. <code>a<\/code>. Ezut\u00e1n egy k\u00fcl\u00f6n ciklussal v\u00e9gigmegy\u00fcnk a slice-on. <code>b<\/code>. \u00c9s ellen\u0151rizz\u00fck \u2013 van-e ez az \u00e9rt\u00e9k a slice-ban. <code>b<\/code> a map-ben. Ha van, akkor hozz\u00e1adjuk az eredm\u00e9nyhez. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/1e610acf641a9cfe4c80aac1fe26044c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mik a el\u0151ny\u00f6k? Az el\u0151ny az, hogy itt csak line\u00e1ris bonyolults\u00e1g van. Teh\u00e1t a funkci\u00f3 sokkal gyorsabban fog v\u00e9grehajt\u00f3dni nagyobbn\u00e1l nagyobb slice-ok eset\u00e9n. Egymilli\u00f3s m\u00e9ret\u0171 slice eset\u00e9n a funkci\u00f3 2 milli\u00f3 iter\u00e1ci\u00f3 alatt fog teljes\u00fclni, szemben a trilli\u00f3 iter\u00e1ci\u00f3val, mint az el\u0151z\u0151 funkci\u00f3ban.<\/p>\n<p><\/p>\n<p>A h\u00e1tr\u00e1nya viszont az, hogy ez a funkci\u00f3 t\u00f6bb mem\u00f3ri\u00e1t ig\u00e9nyel a map l\u00e9trehoz\u00e1s\u00e1hoz.<\/p>\n<p><\/p>\n<p>A m\u00e1sodik h\u00e1tr\u00e1ny \u2013 ez egy nagy vazon van a hash-el\u00e9s miatt. Ez a h\u00e1tr\u00e1ny nem t\u00fal nyilv\u00e1nval\u00f3. Sz\u00e1munkra sem volt t\u00fal nyilv\u00e1nval\u00f3, ez\u00e9rt kezdetben a VictoriaMetricsben a keresztmetszet megval\u00f3s\u00edt\u00e1sa a map-en kereszt\u00fcl t\u00f6rt\u00e9nt. De k\u00e9s\u0151bb a profiloz\u00e1s megmutatta, hogy a f\u0151 processzorfed\u00e9si id\u0151 a map \u00edr\u00e1s\u00e1ra \u00e9s az \u00e9rt\u00e9k megl\u00e9t\u00e9nek ellen\u0151rz\u00e9s\u00e9re megy el ebben a map-ben.<\/p>\n<p><\/p>\n<p>Mi\u00e9rt pazarolj\u00e1k \u00edgy a processzort? Mert a Go ezekben a sorokban hash-el\u00e9si m\u0171veletet v\u00e9gez. Teh\u00e1t kisz\u00e1m\u00edtja a kulcs hash-\u00e9t, hogy k\u00e9s\u0151bb a megadott index alapj\u00e1n hozz\u00e1f\u00e9rjen a HashMap-hez. A hash sz\u00e1m\u00edt\u00e1si m\u0171veletek t\u00edz nanom\u00e1sodperc alatt v\u00e9grehajthat\u00f3k. Ez lass\u00fa a VictoriaMetrics sz\u00e1m\u00e1ra.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/969f10d875d88998e958894ca28b1181.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00dagy d\u00f6nt\u00f6ttem, hogy bitset-et val\u00f3s\u00edtok meg, kifejezetten erre az esetre optimaliz\u00e1lva. \u00cdgy n\u00e9z ki most a k\u00e9t slice keresztmetszete. Itt l\u00e9trehozunk egy bitsetet. Hozz\u00e1adjuk az elemeket az els\u0151 slice-b\u00f3l. Majd ellen\u0151rizz\u00fck ezeknek az elemeknek a megl\u00e9t\u00e9t a m\u00e1sodik slice-ban. \u00c9s hozz\u00e1adjuk \u0151ket az eredm\u00e9nyhez. Teh\u00e1t szinte nem k\u00fcl\u00f6nb\u00f6zik az el\u0151z\u0151 p\u00e9ld\u00e1t\u00f3l. Az egyetlen, amit itt tett\u00fcnk, hogy a map el\u00e9r\u00e9s\u00e9t egyedi funkci\u00f3kkal helyettes\u00edtett\u00fck. <code>add<\/code> \u00e9s <code>has<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/b4ec0753d30d9684868a031f605632c0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Els\u0151 pillant\u00e1sra \u00fagy t\u0171nik, hogy ez lassabban kellene m\u0171k\u00f6dj\u00f6n, ha kor\u00e1bban a standard mapet haszn\u00e1lt\u00e1k, \u00e9s most m\u00e9g valami m\u00e1s funkci\u00f3kat is h\u00edvnak, de a profiloz\u00e1s azt mutatja, hogy ez a megold\u00e1s t\u00edzszer gyorsabb, mint a standard map a VictoriaMetrics eset\u00e9ben.<\/p>\n<p><\/p>\n<p>Ezenk\u00edv\u00fcl sokkal kevesebb mem\u00f3ri\u00e1t haszn\u00e1l az map-re alapozott megold\u00e1shoz k\u00e9pest. Mivel itt biteket t\u00e1rolunk a nyolchb\u00e1jtos \u00e9rt\u00e9kek helyett.<\/p>\n<p><\/p>\n<p>A h\u00e1tr\u00e1nya ennek a megval\u00f3s\u00edt\u00e1snak, hogy nem annyira nyilv\u00e1nval\u00f3, nem trivi\u00e1lis. <\/p>\n<p><\/p>\n<p>Egy m\u00e1sik h\u00e1tr\u00e1ny, amit sokan \u00e9szre sem vesznek, hogy ez a megval\u00f3s\u00edt\u00e1s bizonyos esetekben rosszul m\u0171k\u00f6dhet. Vagyis, ez egy adott esetre optimaliz\u00e1lt, a VictoriaMetrics id\u0151beli sorok azonos\u00edt\u00f3inak metszet\u00e9hez. Ez nem jelenti azt, hogy minden esetben alkalmazhat\u00f3. Ha rosszul haszn\u00e1lj\u00e1k, nem teljes\u00edtm\u00e9ny-n\u00f6veked\u00e9st, hanem out of memory hib\u00e1t \u00e9s teljes\u00edtm\u00e9nycs\u00f6kken\u00e9st kapunk. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/94bd174afe43e67b3cf279dc7a1be17c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e9zz\u00fck meg ennek a strukt\u00far\u00e1nak a megval\u00f3s\u00edt\u00e1s\u00e1t. Ha szeretn\u00e9k l\u00e1tni, akkor a VictoriaMetrics forr\u00e1sk\u00f3dj\u00e1ban tal\u00e1lhat\u00f3, a mapp\u00e1ban <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/VictoriaMetrics\/VictoriaMetrics\/tree\/master\/lib\/uint64set\">lib\/uint64set<\/a><\/noindex>. Ez kifejezetten a VictoriaMetrics eset\u00e9re van optimaliz\u00e1lva, ahol <code>timeseries_id<\/code> egy 64 bites \u00e9rt\u00e9ket k\u00e9pvisel, ahol az els\u0151 32 bit alapvet\u0151en \u00e1lland\u00f3, \u00e9s csak az utols\u00f3 32 bit v\u00e1ltozik.<\/p>\n<p><\/p>\n<p>Ez az adatstrukt\u00fara nem t\u00e1rol\u00f3dik lemezen, csak a mem\u00f3ri\u00e1ban m\u0171k\u00f6dik. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/e24ca65f860e2b04037e073f7acae0c1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00cdme az API-ja. Nem t\u00fal bonyolult. Az API kifejezetten a VictoriaMetrics konkr\u00e9t felhaszn\u00e1l\u00e1si p\u00e9ld\u00e1j\u00e1hoz van igaz\u00edtva. Vagyis itt nincsenek felesleges funkci\u00f3k. Csak azok a funkci\u00f3k tal\u00e1lhat\u00f3k itt, amelyeket kifejezetten a VictoriaMetrics haszn\u00e1l.<\/p>\n<p><\/p>\n<p>Van egy <code>add<\/code>funkci\u00f3, amely \u00faj \u00e9rt\u00e9keket ad hozz\u00e1. Van egy <code>has<\/code>funkci\u00f3, amely ellen\u0151rzi az \u00faj \u00e9rt\u00e9keket. \u00c9s van egy <code>del<\/code>funkci\u00f3, amely t\u00f6rli az \u00e9rt\u00e9keket. Van egy seg\u00e9dfunkci\u00f3 is, <code>len<\/code>, amely visszaadja a halmaz m\u00e9ret\u00e9t. A <code>clone<\/code> funkci\u00f3 kl\u00f3nozza a halmazt. \u00c9s a <code>appendto<\/code> funkci\u00f3 \u00e1talak\u00edtja ezt a halmazt szeletre. <code>timeseries_ids<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/874b04042d13f342d39f8f393e7fb78c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00cdme, hogyan n\u00e9z ki ennek az adatstrukt\u00far\u00e1nak a megval\u00f3s\u00edt\u00e1sa. A halmazban k\u00e9t elem tal\u00e1lhat\u00f3:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p><code>ItemsCount<\/code> \u2013 ez egy seg\u00e9dfeldolgoz\u00f3 mez\u0151, amely lehet\u0151v\u00e9 teszi, hogy gyorsan visszaadja az elemek sz\u00e1m\u00e1t a halmazban. El lehetett volna \u00e9lni n\u00e9lk\u00fcle, de hozz\u00e1 kellett adni, mert a VictoriaMetrics gyakran lek\u00e9rdezi a bitset hossz\u00e1t az algoritmusai sor\u00e1n.<\/p>\n<p>\n<\/li>\n<li>\n<p>A m\u00e1sodik mez\u0151 pedig a <code>buckets.<\/code>Ez egy szelet a <code>bucket32<\/code>strukt\u00far\u00e1b\u00f3l. Minden egyes strukt\u00far\u00e1ban t\u00e1rol\u00f3dik a <code>hi<\/code> mez\u0151. Ez a fels\u0151 32 bit. \u00c9s k\u00e9t szelet \u2013 <code>b16his<\/code> \u00e9s <code>buckets.<\/code> a <code>bucket16<\/code> strukt\u00far\u00e1k. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Itt t\u00e1rol\u00f3dnak a 64 bites strukt\u00fara m\u00e1sodik r\u00e9sz\u00e9nek fels\u0151 16 bitjei. Itt pedig a legals\u00f3 16 bit bitsetei tal\u00e1lhat\u00f3k minden egyes byte-hoz. <\/p>\n<p><\/p>\n<p><code>A Bucket64<\/code> egy <code>uint64<\/code>t\u00f6mbb\u0151l \u00e1ll. A hossza ezekb\u0151l a konstansokb\u00f3l sz\u00e1m\u00edt\u00f3dik. Egy <code>bucket16<\/code> maximum 4096 <code>2^16=65536<\/code> bitet t\u00e1rolhat. Ha ezt 8-cal osztjuk, akkor az 8 kilob\u00e1jt. Ha ezt ism\u00e9t 8-cal osztjuk, akkor az 1000 <code>uint64<\/code> \u00e9rt\u00e9ket jelent. Vagyis a <code>Bucket16 \u2013 ez sz\u00e1munkra egy 8 kilob\u00e1jtos strukt\u00fara.<\/code> \u2013 ez egy 8 kilob\u00e1jtos strukt\u00fara. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/1cca4e6bfafa3408a3c95e0118e26d80.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e9zz\u00fck meg, hogyan val\u00f3s\u00edtj\u00e1k meg ennek a strukt\u00far\u00e1nak az egyik m\u00f3dszer\u00e9t, amely \u00faj \u00e9rt\u00e9k hozz\u00e1ad\u00e1s\u00e1ra szolg\u00e1l. <\/p>\n<p><\/p>\n<p>Minden a k\u00f6vetkez\u0151vel kezd\u0151dik: <code>uint64<\/code> \u00e9rt\u00e9k. Kiszak\u00edtjuk a fels\u0151 32 bitet, kiszak\u00edtjuk az als\u00f3 32 bitet. V\u00e9gigmegy\u00fcnk az \u00f6sszes <code>buckets.<\/code>. \u00d6sszehasonl\u00edtjuk a fels\u0151 32 bitet minden egyes bucketben a hozz\u00e1adand\u00f3 \u00e9rt\u00e9kkel. Ha azok megegyeznek, akkor megh\u00edvjuk a <code>add<\/code> b32 strukt\u00far\u00e1ban l\u00e9v\u0151 <code>buckets.<\/code>. \u00c9s hozz\u00e1adjuk az als\u00f3 32 bitet. Ha ez visszaadott <code>igaz<\/code>, akkor ez azt jelenti, hogy ezt az \u00e9rt\u00e9ket hozz\u00e1adtuk, \u00e9s eddig nem volt ilyen \u00e9rt\u00e9k\u00fcnk. Ha ez visszaadja <code>hamis<\/code>, akkor ilyen \u00e9rt\u00e9k m\u00e1r l\u00e9tezett. Ezut\u00e1n n\u00f6velj\u00fck az elemek sz\u00e1m\u00e1t a strukt\u00far\u00e1ban. <\/p>\n<p><\/p>\n<p>Ha nem tal\u00e1ltunk sz\u00fcks\u00e9ges <code>t\u00e1rol\u00f3<\/code> a megfelel\u0151 hi-\u00e9rt\u00e9kkel, akkor megh\u00edvjuk a <code>addAlloc<\/code>, amely \u00faj <code>t\u00e1rol\u00f3<\/code>t foglal, \u00e9s hozz\u00e1adja azt a bucket strukt\u00far\u00e1hoz.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/c5d1e5de767f47c7c40e01e12b6d0617.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ez a <code>b32.add<\/code>f\u00fcggv\u00e9ny megval\u00f3s\u00edt\u00e1sa. Hasonl\u00f3 az el\u0151z\u0151 megval\u00f3s\u00edt\u00e1shoz. Kisz\u00e1m\u00edtjuk a fels\u0151 16 bitet, az als\u00f3 16 bitet.<\/p>\n<p><\/p>\n<p>Azt\u00e1n v\u00e9gigmegy\u00fcnk az \u00f6sszes fels\u0151 16 biten. Megtal\u00e1ljuk a megegyez\u00e9seket. Ha megegyez\u00e9s t\u00f6rt\u00e9nik, akkor megh\u00edvjuk az add m\u00f3dszert, amit a k\u00f6vetkez\u0151 oldalon vizsg\u00e1lunk meg a <code>bucket16<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/e98c4ef316f3a894fd7019c3c85696f7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c9s ez a legalacsonyabb szint, amelyet a lehet\u0151 legjobban optimaliz\u00e1lni kell. Kisz\u00e1m\u00edtjuk az <code>uint64<\/code> id \u00e9rt\u00e9k\u00e9t a szelet bitben, valamint a <code>bitmask<\/code>. Ez a maszk a 64 bites \u00e9rt\u00e9khez, amely seg\u00edts\u00e9g\u00e9vel ellen\u0151rizhetj\u00fck ennek a bitnek a megl\u00e9t\u00e9t, vagy be\u00e1ll\u00edthatjuk azt. Ellen\u0151rizz\u00fck, hogy ez a bit be van-e \u00e1ll\u00edtva, majd be\u00e1ll\u00edtjuk, \u00e9s visszaadjuk a megl\u00e9te. Ez a megval\u00f3s\u00edt\u00e1sunk lehet\u0151v\u00e9 tette, hogy a tempor\u00e1lis sorokban l\u00e9v\u0151 ids keresztmetszete 10-szer gyorsabb legyen a szok\u00e1sos mapokhoz k\u00e9pest.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/4dfa5a6142829a3551be22d6c9c3ab92.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A VictoriaMetricsben ezen optimaliz\u00e1ci\u00f3 mellett sok m\u00e1s optimaliz\u00e1ci\u00f3 is van. Ezek t\u00f6bbs\u00e9g\u00e9t nem csak \u00fagy adt\u00e1k hozz\u00e1, hogy ide\u00e1lisnak t\u0171nt, hanem a k\u00f3d profiloz\u00e1sa ut\u00e1n a termel\u00e9sben.<\/p>\n<p><\/p>\n<p>Ez a legfontosabb optimaliz\u00e1l\u00e1si szab\u00e1ly - ne adjunk hozz\u00e1 optimaliz\u00e1ci\u00f3t, felt\u00e9telezve, hogy ott lesz a sz\u0171k keresztmetszet, mert el\u0151fordulhat, hogy ott nem lesz. Az optimaliz\u00e1ci\u00f3 \u00e1ltal\u00e1ban rontja a k\u00f3d min\u0151s\u00e9g\u00e9t. Ez\u00e9rt \u00e9rdemes optimaliz\u00e1lni csak profiloz\u00e1s ut\u00e1n, \u00e9s lehet\u0151leg a termel\u00e9sben, hogy val\u00f3s adatokkal dolgozzunk. Aki \u00e9rdekl\u0151dik, megn\u00e9zheti a VictoriaMetrics forr\u00e1sk\u00f3dj\u00e1t, \u00e9s tanulm\u00e1nyozhatja a t\u00f6bbi ott tal\u00e1lhat\u00f3 optimaliz\u00e1ci\u00f3t.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Golang optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ben. Alexander Valjalkin\" src=\"\/wp-content\/uploads\/2020\/05\/7585c4dc782627bac5b649e6a55e2ffb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>K\u00e9rd\u00e9sem van a bitsettel kapcsolatban. Nagyon hasonl\u00edt a C++ vector bool megval\u00f3s\u00edt\u00e1s\u00e1ra, optimaliz\u00e1lt bitset. Onnan vett\u00e9k a megval\u00f3s\u00edt\u00e1st?<\/em><\/p>\n<p><\/p>\n<p>Nem, nem onnan. E bitset megval\u00f3s\u00edt\u00e1sa sor\u00e1n az ids timeseries strukt\u00far\u00e1j\u00e1ra t\u00e1maszkodtam, amelyeket a VictoriaMetrics haszn\u00e1l. Az \u0151 strukt\u00far\u00e1juk \u00fagy van kialak\u00edtva, hogy a fels\u0151 32 bit jellemz\u0151en \u00e1lland\u00f3. Az als\u00f3 32 bit v\u00e1ltozhat. Min\u00e9l alacsonyabb a bit, ann\u00e1l gyakrabban v\u00e1ltozhat. \u00c9ppen ez\u00e9rt ez a megval\u00f3s\u00edt\u00e1s kifejezetten erre az adatszerkezetre van optimaliz\u00e1lva. A C++ megval\u00f3s\u00edt\u00e1s, amennyire tudom, az \u00e1ltal\u00e1nos esetre van optimaliz\u00e1lva. Ha az \u00e1ltal\u00e1nos esetet optimaliz\u00e1ljuk, az azt jelenti, hogy nem lesz a legoptim\u00e1lisabb a konkr\u00e9t esethez k\u00e9pest.<\/p>\n<p><\/p>\n<p>Aj\u00e1nlom, hogy n\u00e9zze meg Alexey Milovid el\u0151ad\u00e1s\u00e1t is. K\u00f6r\u00fclbel\u00fcl egy h\u00f3nappal ezel\u0151tt besz\u00e9lt a ClickHouse specifikus optimaliz\u00e1l\u00e1sair\u00f3l. \u0150 \u00e9ppen azt mondja, hogy az \u00e1ltal\u00e1nos esetben a C++ megval\u00f3s\u00edt\u00e1s vagy b\u00e1rmely m\u00e1s megold\u00e1s j\u00f3l m\u0171k\u00f6dik \u00e1tlagosan. Lehet, hogy rosszabbul teljes\u00edt, mint egy specializ\u00e1lt megold\u00e1s, amikor tudjuk, hogy a fels\u0151 32 bit jellemz\u0151en \u00e1lland\u00f3.<\/p>\n<p><\/p>\n<p><em>Van egy m\u00e1sodik k\u00e9rd\u00e9sem. Mi a radik\u00e1lis k\u00fcl\u00f6nbs\u00e9g az InfluxDB-hoz k\u00e9pest?<\/em><\/p>\n<p><\/p>\n<p>Sok radik\u00e1lis k\u00fcl\u00f6nbs\u00e9g van. Ha a teljes\u00edtm\u00e9nyt \u00e9s a mem\u00f3riafogyaszt\u00e1st n\u00e9zz\u00fck, az InfluxDB a tesztekben 10-szer t\u00f6bb mem\u00f3riafogyaszt\u00e1st mutat a magas kardinalit\u00e1s\u00fa id\u0151sorok eset\u00e9n, amikor sok van bel\u0151l\u00fck, p\u00e9ld\u00e1ul milli\u00f3k. P\u00e9ld\u00e1ul a VictoriaMetrics 1 GB-ot fogyaszt egymilli\u00f3 akt\u00edv sorra, m\u00edg az InfluxDB 10 GB-ot. Ez jelent\u0151s k\u00fcl\u00f6nbs\u00e9g. <\/p>\n<p><\/p>\n<p>A m\u00e1sodik radik\u00e1lis k\u00fcl\u00f6nbs\u00e9g az, hogy az InfluxDB-nek furcsa lek\u00e9rdez\u00e9si nyelvei vannak \u2013 Flux \u00e9s InfluxQL. Ezek nem t\u00fal k\u00e9nyelmesek az id\u0151sorokkal val\u00f3 munk\u00e1hoz a <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@valyala\/promql-tutorial-for-beginners-9ab455142085\">PromQL<\/a><\/noindex>, amelyet a VictoriaMetrics t\u00e1mogat. A PromQL a Prometheus lek\u00e9rdez\u00e9si nyelve.<\/p>\n<p><\/p>\n<p>\u00c9s egy m\u00e1sik k\u00fcl\u00f6nbs\u00e9g az, hogy az InfluxDB-nek kiss\u00e9 furcsa az adatmodellje, ahol minden egyes sorban t\u00f6bb field t\u00e1rolhat\u00f3 elt\u00e9r\u0151 c\u00edmkehalmazzal. Ezeket a sorokat tov\u00e1bbi t\u00e1bl\u00e1kra osztj\u00e1k. Ezek a tov\u00e1bbi bonyodalmak megnehez\u00edtik az ebb\u0151l a database-b\u00f3l val\u00f3 k\u00e9s\u0151bbi munk\u00e1t. Nehezen karbantarthat\u00f3 \u00e9s \u00e9rthet\u0151.<\/p>\n<p><\/p>\n<p>A VictoriaMetricsn\u00e9l minden sokkal egyszer\u0171bb. Ott minden id\u0151sor egy kulcs-\u00e9rt\u00e9k p\u00e1rt k\u00e9pvisel. Az \u00e9rt\u00e9k egy pontok halmaza \u2013 <code>(timestamp, \u00e9rt\u00e9k)<\/code>, m\u00edg a kulcs egy halmaz <code>label=value<\/code>Nincsen megoszt\u00e1s a fields \u00e9s measurements k\u00f6z\u00f6tt. Ez lehet\u0151v\u00e9 teszi, hogy b\u00e1rmilyen adatot v\u00e1lassz, majd kombin\u00e1lj, \u00f6sszeadj, kivonj, szorozz, oszd, ellent\u00e9tben az InfluxDB-vel, ahol a k\u00fcl\u00f6nb\u00f6z\u0151 sorok k\u00f6z\u00f6tti sz\u00e1m\u00edt\u00e1sok eddig nem val\u00f3sultak meg, amennyire tudom. M\u00e9g ha meg is val\u00f3sultak, neh\u00e9zkes, rengeteg k\u00f3dot kell \u00edrni. <\/p>\n<p><\/p>\n<p><em>Van egy pontos\u00edt\u00f3 k\u00e9rd\u00e9sem. J\u00f3l \u00e9rtettem, hogy volt egy probl\u00e9ma, amir\u0151l besz\u00e9lt, amely miatt ez az inverz index nem f\u00e9rt el a mem\u00f3ria, ez\u00e9rt van a particion\u00e1l\u00e1s?<\/em><\/p>\n<p><\/p>\n<p>El\u0151sz\u00f6r megmutattam a megford\u00edtott index naiv megval\u00f3s\u00edt\u00e1s\u00e1t a standard Go map-j\u00e9n. Ez a megval\u00f3s\u00edt\u00e1s nem alkalmas adatb\u00e1zisokhoz, mert ez a megford\u00edtott index nem t\u00e1rol\u00f3dik lemezre, pedig az adatb\u00e1zisnak le kell menteni az adatokat, hogy azok \u00fajraind\u00edt\u00e1s ut\u00e1n is el\u00e9rhet\u0151ek legyenek. Ebben a megval\u00f3s\u00edt\u00e1sban az alkalmaz\u00e1s \u00fajraind\u00edt\u00e1sakor a megford\u00edtott index elt\u0171nik. \u00c9s hozz\u00e1f\u00e9rhetetlenn\u00e9 v\u00e1lik az \u00f6sszes adat, mert nem tudja \u0151ket megtal\u00e1lni. <\/p>\n<p><\/p>\n<p><em>\u00dcdv\u00f6zl\u00f6m! K\u00f6sz\u00f6n\u00f6m a prezent\u00e1ci\u00f3t! A nevem Pavel. A Wildberries c\u00e9gt\u0151l j\u00f6v\u00f6k. Van n\u00e9h\u00e1ny k\u00e9rd\u00e9sem \u00f6nh\u00f6z. Az els\u0151 k\u00e9rd\u00e9s. \u00d6n szerint, ha m\u00e1s elvet v\u00e1lasztott volna az alkalmaz\u00e1s architekt\u00far\u00e1j\u00e1nak fel\u00e9p\u00edt\u00e9s\u00e9re \u00e9s id\u0151 szerint particion\u00e1lta volna az adatokat, tal\u00e1n lehetne lehet\u0151s\u00e9ge, hogy az adatok keres\u00e9sekor metszeteket v\u00e9gezzen, csak azon alapulva, hogy egy particion bel\u00fcl vannak az adatok egy adott id\u0151szakra, azaz egy id\u0151intervallumra, \u00e9s nem kellene agg\u00f3dnia amiatt, hogy az \u00f6n adatai k\u00fcl\u00f6nb\u00f6z\u0151 m\u00f3don vannak sz\u00e9tsz\u00f3rva? A m\u00e1sodik k\u00e9rd\u00e9s - mivel hasonl\u00f3 algoritmust val\u00f3s\u00edt meg bitsettel \u00e9s minden m\u00e1ssal, tal\u00e1n megpr\u00f3b\u00e1lta haszn\u00e1lni a processzor utas\u00edt\u00e1sait? Tal\u00e1n kipr\u00f3b\u00e1lta ezeket az optimaliz\u00e1l\u00e1sokat?<\/em><\/p>\n<p><\/p>\n<p>A m\u00e1sodikra azonnal v\u00e1laszolok. M\u00e9g nem jutottunk el eddig. De ha sz\u00fcks\u00e9g lesz r\u00e1, megtessz\u00fck. Az els\u0151, mi volt a k\u00e9rd\u00e9s?<\/p>\n<p><\/p>\n<p><em>K\u00e9t forgat\u00f3k\u00f6nyvet besz\u00e9ltek meg. Azt mondt\u00e1k, hogy a m\u00e1sodikat v\u00e1lasztott\u00e1k, amely bonyolultabb megval\u00f3s\u00edt\u00e1ssal b\u00edr. \u00c9s nem r\u00e9szes\u00edtett\u00e9k el\u0151nyben az els\u0151t, ahol az adatok id\u0151 szerint lettek particion\u00e1lva.<\/em> <\/p>\n<p><\/p>\n<p>Igen. Az els\u0151 esetben a teljes indexm\u00e9ret nagyobb lenne, mert minden partici\u00f3n\u00e1l t\u00e1rolnunk kellene a duplik\u00e1lt adatokat azokon az id\u0151tartom\u00e1nyokon, amelyek \u00e1tfedik ezeket a partici\u00f3kat. Ha az id\u0151tartom\u00e1nyok churn rate-je alacsony, vagyis folyamatosan ugyanazokat a sorokat haszn\u00e1lj\u00e1k, akkor az els\u0151 esetben jelent\u0151sen nagyobb diszkter\u00fcletet vesz\u00edten\u00e9nk a m\u00e1sodik esethez k\u00e9pest.<\/p>\n<p><\/p>\n<p>Igen, a id\u0151alap\u00fa particion\u00e1l\u00e1s j\u00f3 megold\u00e1s. Ezt haszn\u00e1lja a Prometheus is. De a Prometheusszal kapcsolatban van egy m\u00e1sik h\u00e1tr\u00e1ny. Az adatok egyes\u00edt\u00e9s\u00e9n\u00e9l meg kell tartania a mem\u00f3ri\u00e1ban minden label \u00e9s id\u0151tartom\u00e1ny meta-inform\u00e1ci\u00f3j\u00e1t. Ez\u00e9rt, ha az egyes\u00edtett adatok nagyok, a mem\u00f3riafogyaszt\u00e1s jelent\u0151sen megn\u0151 az egyes\u00edt\u00e9si folyamat sor\u00e1n, ellent\u00e9tben a VictoriaMetrics-el. A VictoriaMetrics egyes\u00edt\u00e9sekor gyakorlatilag nem fogyaszt mem\u00f3ri\u00e1t, csak n\u00e9h\u00e1ny kilob\u00e1jtot ig\u00e9nyel, f\u00fcggetlen\u00fcl az egyes\u00edtett adatok m\u00e9ret\u00e9t\u0151l.<\/p>\n<p><\/p>\n<p><em>Az algoritmus, amit haszn\u00e1lnak, mem\u00f3riaig\u00e9nyes. Itt a timeseries c\u00edmk\u00e9ket t\u00e1rolj\u00e1k, amelyekhez \u00e9rt\u00e9kek tartoznak. \u00cdgy ellen\u0151rzik a p\u00e1ros megl\u00e9tet egy adatm\u00e1trixban \u00e9s egy m\u00e1sikban. \u00c9s \u00edgy meg\u00e9rtik, hogy t\u00f6rt\u00e9nt-e \u00e1tfed\u00e9s vagy sem. \u00c1ltal\u00e1ban az adatb\u00e1zisokban kurzorokat, iter\u00e1torokat val\u00f3s\u00edtanak meg, amelyek t\u00e1rolj\u00e1k a jelenlegi \u00e1llapotukat, \u00e9s v\u00e9gigj\u00e1rj\u00e1k a rendezett adatokon, mivel \u00edgy egyszer\u0171 id\u0151beli \u00f6sszetett m\u0171veleteket kapunk.<\/em> <\/p>\n<p><\/p>\n<p>Mi\u00e9rt nem haszn\u00e1lunk kurzorokat az adatok \u00e1tfed\u00e9s\u00e9re?<\/p>\n<p><\/p>\n<p><em>Igen.<\/em> <\/p>\n<p><\/p>\n<p>A LevelDB-ben vagy a mergeset-ben \u00e9ppen az rendezett sorok vannak t\u00e1rolva. \u00c1t tudunk menni rajtuk egy kurzorral, \u00e9s megtal\u00e1lni az \u00e1tfed\u00e9st. De mi\u00e9rt nem haszn\u00e1ljuk? Mert ez lass\u00fa. A kurzorok azt felt\u00e9telezik, hogy minden egyes sorhoz funkci\u00f3t kell h\u00edvni. A funkci\u00f3h\u00edv\u00e1s 5 nanosekundum. \u00c9s ha 100 000 000 sor van, akkor csak a funkci\u00f3h\u00edv\u00e1sra f\u00e9l m\u00e1sodpercet k\u00f6lt\u00fcnk.<\/p>\n<p><\/p>\n<p><em>Ilyen van, igen. \u00c9s az utols\u00f3 k\u00e9rd\u00e9sem. A k\u00e9rd\u00e9s tal\u00e1n kicsit furcs\u00e1n hangzik. Mi\u00e9rt nem sz\u00e1m\u00edtjuk ki az \u00f6sszes sz\u00fcks\u00e9ges aggreg\u00e1tumot \u00e9s t\u00e1roljuk azokat a sz\u00fcks\u00e9ges form\u00e1ban, amikor az adatok be\u00e9rkeznek? Mi\u00e9rt kell hatalmas mennyis\u00e9get t\u00e1rolni olyan rendszerekben, mint a VictoriaMetrics, ClickHouse stb., hogy azt\u00e1n sok id\u0151t pazaroljunk r\u00e1juk?<\/em><\/p>\n<p><\/p>\n<p><em>Hoztok egy p\u00e9ld\u00e1t, hogy \u00e9rthet\u0151bb legyen. Tegy\u00fck fel, hogy hogyan m\u0171k\u00f6dik egy kicsi j\u00e1t\u00e9ksebess\u00e9gm\u00e9r\u0151? R\u00f6gz\u00edti a megtett t\u00e1vols\u00e1got, \u00e9s folyamatosan hozz\u00e1adja egy m\u00e9rt\u00e9khez, a m\u00e1sikhoz pedig az id\u0151t. Majd elosztja. \u00cdgy kapja meg az \u00e1tlagsebess\u00e9get. Hasonl\u00f3k\u00e9ppen el lehet j\u00e1rni. Az \u00f6sszes sz\u00fcks\u00e9ges t\u00e9nyt folyamatosan \u00f6sszegy\u0171jteni.<\/em><\/p>\n<p><\/p>\n<p>Rendben, \u00e9rtem a k\u00e9rd\u00e9st. Az \u00d6n p\u00e9ld\u00e1ja \u00e9letk\u00e9pes. Ha tudja, hogy milyen aggreg\u00e1tumokra van sz\u00fcks\u00e9ge, akkor ez a legjobb megold\u00e1s. De a probl\u00e9ma az, hogy az emberek ezeket a metrik\u00e1kat \u00e9s adatokat a ClickHouse-n\u00e1l t\u00e1rolj\u00e1k, \u00e9s nem tudj\u00e1k, hogyan fogj\u00e1k ezeket a j\u00f6v\u0151ben aggreg\u00e1lni, sz\u0171rni, ez\u00e9rt minden nyers adatot meg kell \u0151rizni\u00fck. De ha tudja, hogy valami \u00e1tlagot kell sz\u00e1molnia, mi\u00e9rt ne sz\u00e1moln\u00e1 azt, ahelyett, hogy egy rak\u00e1s nyers \u00e9rt\u00e9ket t\u00e1rolna? De ez csak akkor, ha pontosan tudja, hogy mire van sz\u00fcks\u00e9ge.<\/p>\n<p><\/p>\n<p>Egy\u00e9bk\u00e9nt, a id\u0151szakos sorok t\u00e1rol\u00e1s\u00e1ra szolg\u00e1l\u00f3 adatb\u00e1zisok t\u00e1mogatj\u00e1k az aggreg\u00e1tumok sz\u00e1m\u00edt\u00e1s\u00e1t. P\u00e9ld\u00e1ul a Prometheus t\u00e1mogatja <noindex><a rel=\"nofollow\" href=\"https:\/\/prometheus.io\/docs\/prometheus\/latest\/configuration\/recording_rules\/\">a r\u00f6gz\u00edt\u00e9si szab\u00e1lyokat<\/a><\/noindex>. Teh\u00e1t ezt meg lehet csin\u00e1lni, ha tudja, hogy milyen aggreg\u00e1tumokra lesz sz\u00fcks\u00e9ge. A VictoriaMetrics-n\u00e9l ez jelenleg nincs, de \u00e1ltal\u00e1ban el\u00e9 ker\u00fcl a Prometheus, amelyben ezt a recoding szab\u00e1lyokban meg lehet csin\u00e1lni.<\/p>\n<p><\/p>\n<p>P\u00e9ld\u00e1ul, az el\u0151z\u0151 munk\u00e1mban sz\u00fcks\u00e9g volt az esem\u00e9nyek sz\u00e1m\u00e1nak sz\u00e1ml\u00e1l\u00e1s\u00e1ra egy mozg\u00f3 ablakban az utols\u00f3 \u00f3r\u00e1ban. A probl\u00e9ma az volt, hogy egy egyedi megold\u00e1st kellett k\u00e9sz\u00edtenem Go nyelven, teh\u00e1t egy szolg\u00e1ltat\u00e1st az ilyen dolog sz\u00e1m\u00edt\u00e1s\u00e1ra. Ez a szolg\u00e1ltat\u00e1s v\u00e9g\u00fcl nem volt trivi\u00e1lis, mert neh\u00e9z volt sz\u00e1molni. A megval\u00f3s\u00edt\u00e1s egyszer\u0171 lehet, ha fix id\u0151intervallumokban kell sz\u00e1molni valamilyen aggreg\u00e1tumot. Ha azonban esem\u00e9nyeket szeretne sz\u00e1molni egy mozg\u00f3 ablakban, akkor ez nem olyan egyszer\u0171, mint amilyennek l\u00e1tszik. Azt hiszem, ezt a ClickHouse-ban vagy az id\u0151szakos adatb\u00e1zisokban m\u00e9g mindig nem val\u00f3s\u00edtott\u00e1k meg, mert a megval\u00f3s\u00edt\u00e1sa bonyolult.<\/p>\n<p><\/p>\n<p><em>\u00c9s m\u00e9g egy k\u00e9rd\u00e9s. Most az \u00e1tlagol\u00e1sr\u00f3l besz\u00e9lt\u00fcnk, \u00e9s eszembe jutott, hogy r\u00e9gen l\u00e9tezett egy Graphite nev\u0171 dolog a Carbon h\u00e1tt\u00e9rrel. Ez k\u00e9pes volt a r\u00e9gi adatokat ritk\u00edtani, azaz egy pontot hagyott egy percben, egy pontot egy \u00f3r\u00e1ban stb. Alapvet\u0151en ez el\u00e9g k\u00e9nyelmes, ha nyers adatokat akarunk, mondjuk egy h\u00f3napra, a t\u00f6bbit pedig lehet ritk\u00edtani. De a Prometheus \u00e9s a VictoriaMetrics nem t\u00e1mogatj\u00e1k ezt a funkci\u00f3t. Tervezik ezt t\u00e1mogatni? Ha nem, akkor mi\u00e9rt?<\/em><\/p>\n<p><\/p>\n<p>K\u00f6sz\u00f6nj\u00fck a k\u00e9rd\u00e9st. Felhaszn\u00e1l\u00f3ink rendszeresen felteszik ezt. K\u00e9rdezik, mikor fogjuk hozz\u00e1adni a downsampling t\u00e1mogat\u00e1s\u00e1t. Itt t\u00f6bb probl\u00e9ma van. El\u0151sz\u00f6r is, minden felhaszn\u00e1l\u00f3 m\u00e1st \u00e9rt alatta <code>downsampling<\/code> valami saj\u00e1tos: valaki egy tetsz\u0151leges pontot szeretne a megadott intervallumban, m\u00e1sok a maxim\u00e1lis, minim\u00e1lis, \u00e1tlagos \u00e9rt\u00e9keket keresik. Ha a rendszeredbe sok k\u00fcl\u00f6nb\u00f6z\u0151 rendszer \u00edr adatokat, akkor nem lehet mindent egy kalap al\u00e1 venni. Lehet, hogy minden egyes rendszerhez m\u00e1s downsampling sz\u00fcks\u00e9ges. \u00c9s ez neh\u00e9z a megval\u00f3s\u00edt\u00e1sban.<\/p>\n<p><\/p>\n<p>A m\u00e1sodik probl\u00e9ma pedig az, hogy a VictoriaMetrics, ak\u00e1rcsak a ClickHouse, a nagy mennyis\u00e9g\u0171 nyers adatok feldolgoz\u00e1s\u00e1ra van optimaliz\u00e1lva, \u00edgy ak\u00e1r m\u00e1sodpercenk\u00e9nt k\u00e9pes egy milli\u00e1rd sort is \u00e1tvizsg\u00e1lni, ha sok mag van a rendszeredben. A VictoriaMetrics id\u0151szakos adatai eset\u00e9n 50 000 000 pont m\u00e1sodpercenk\u00e9nt egy magra. Ez a teljes\u00edtm\u00e9ny sk\u00e1l\u00e1zhat\u00f3 a rendelkez\u00e9sre \u00e1ll\u00f3 magok sz\u00e1m\u00e1val. Teh\u00e1t ha p\u00e9ld\u00e1ul 20 magod van, akkor m\u00e1sodpercenk\u00e9nt egy milli\u00e1rd pontot tudsz \u00e1tvizsg\u00e1lni. Ez a VictoriaMetrics \u00e9s a ClickHouse tulajdons\u00e1ga cs\u00f6kkenti a downsampling ir\u00e1nti ig\u00e9nyt.<\/p>\n<p><\/p>\n<p>Egy m\u00e1sik tulajdons\u00e1ga, hogy a VictoriaMetrics hat\u00e9konyan t\u00f6m\u00f6r\u00edti ezeket az adatokat. A t\u00f6m\u00f6r\u00edt\u00e9s \u00e1tlagosan 0,4 \u00e9s 0,8 byte k\u00f6z\u00f6tt van egy pont eset\u00e9ben \u00e9lesben. Minden pont egy timestamp + \u00e9rt\u00e9k. \u00c9s ez \u00e1tlagosan kevesebb mint egy byte-ra t\u00f6m\u00f6r\u00fcl. <\/p>\n<p><\/p>\n<p><em>Szergej. Van egy k\u00e9rd\u00e9sem. Mi a minim\u00e1lis teljes\u00edtm\u00e9nyn\u00f6vel\u00e9si id\u0151?<\/em><\/p>\n<p><\/p>\n<p>Egy milliszekundum. Nemr\u00e9g besz\u00e9lgett\u00fcnk m\u00e1s id\u0151szakos adatb\u00e1zis-fejleszt\u0151kkel. N\u00e1luk a minim\u00e1lis id\u0151intervallum egy m\u00e1sodperc. A Graphite-n\u00e1l p\u00e9ld\u00e1ul szint\u00e9n egy m\u00e1sodperc. Az OpenTSDB eset\u00e9ben is egy m\u00e1sodperc. Az InfluxDB m\u00e1sodperces pontoss\u00e1ggal m\u0171k\u00f6dik. A VictoriaMetrics pedig egy milliszekundumot haszn\u00e1l, mert a Prometheusn\u00e1l is egy milliszekundum van. A VictoriaMetrics-t eredetileg a Prometheus t\u00e1voli t\u00e1rol\u00f3jak\u00e9nt fejlesztett\u00e9k ki. De ma m\u00e1r k\u00e9pes adatokat t\u00e1rolni m\u00e1s rendszerekb\u0151l is. <\/p>\n<p><\/p>\n<p>A f\u00e9rfi, akivel besz\u00e9ltem, azt mondta, hogy n\u00e1luk m\u00e1sodperces pontoss\u00e1g van \u2014 nekik ez elegend\u0151, mert ez att\u00f3l f\u00fcgg, milyen t\u00edpus\u00fa adatokat t\u00e1rolnak az id\u0151szakos adatb\u00e1zisban. Ha DevOps-adatokr\u00f3l vagy infrastrukt\u00far\u00e1val kapcsolatos adatokkal van sz\u00f3, ahol 30 m\u00e1sodpercenk\u00e9nt, egy percenk\u00e9nt gy\u0171jt\u00f6d \u0151ket, akkor ott a m\u00e1sodperces pontoss\u00e1g elegend\u0151, kevesebb m\u00e1r nem sz\u00fcks\u00e9ges. Ha azonban ezek az adatok high frequency trading rendszerekb\u0151l sz\u00e1rmaznak, akkor nanosekund\u00e1s pontos\u00edt\u00e1sra van sz\u00fcks\u00e9g.<\/p>\n<p><\/p>\n<p>A millisecundum pontoss\u00e1ga a VictoriaMetricsben mind a DevOps-esetekhez, mind pedig a legt\u00f6bb olyan esetre megfelel\u0151, amelyet a besz\u00e9dem elej\u00e9n eml\u00edtettem. Az egyetlen dolog, amire nem val\u00f3sz\u00edn\u0171, hogy megfelel\u0151 lenne, az a nagy frekvenci\u00e1j\u00fa keresked\u00e9si rendszerek.<\/p>\n<p><\/p>\n<p><em>K\u00f6sz\u00f6n\u00f6m! M\u00e9g egy k\u00e9rd\u00e9sem van. Milyen a PromQL kompatibilit\u00e1s?<\/em><\/p>\n<p><\/p>\n<p>Teljes visszafel\u00e9 kompatibilit\u00e1s. A VictoriaMetrics teljes m\u00e9rt\u00e9kben t\u00e1mogatja a PromQL-t. Ezen k\u00edv\u00fcl hozz\u00e1ad egy olyan kieg\u00e9sz\u00edt\u0151, kib\u0151v\u00edtett funkci\u00f3t a PromQL-hez, amelyet \u00fagy h\u00edvnak, hogy <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/VictoriaMetrics\/VictoriaMetrics\/wiki\/MetricsQL\">MetricsQL<\/a><\/noindex>. A kib\u0151v\u00edtett funkci\u00f3val kapcsolatban van egy el\u0151ad\u00e1s a YouTube-on. Tavasszal a Monitoring Meetup-on besz\u00e9ltem err\u0151l Szentp\u00e9terv\u00e1ron.<\/p>\n<p><\/p>\n<p>Telegram csatorna <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/VictoriaMetrics_ru1\">VictoriaMetrics<\/a><\/noindex>.<\/p>\n<p class=\"for_users_only_msg\">Csak a regisztr\u00e1lt felhaszn\u00e1l\u00f3k vehetnek r\u00e9szt a szavaz\u00e1son. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">K\u00e9rem, jelentkezzen be.<\/a><\/noindex>, k\u00e9rem.<\/p>\n<h2 class=\"default-block__polling-title\">Mi akad\u00e1lyozza meg, hogy a VictoriaMetricsra v\u00e1lts hossz\u00fa t\u00e1v\u00fa t\u00e1rol\u00f3k\u00e9nt a Prometheus sz\u00e1m\u00e1ra? (\u00cdrjatok megjegyz\u00e9sben, hozz\u00e1adom a k\u00e9rd\u0151\u00edvhez))<\/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>Nem haszn\u00e1lok Prometheus5<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">28,6%<\/strong>Nem tudtam a VictoriaMetrics2-r\u0151l<\/p>\n<\/li>\n<\/ul>\n<p>    7 felhaszn\u00e1l\u00f3 szavazott. 12 felhaszn\u00e1l\u00f3 tart\u00f3zkodott.<br \/>\n<br \/>Forr\u00e1s: <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 5.0.3 - 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;\" \/>\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\/hu\/blog\/administrirovanie\/go-optimizations-in-victoriametrics-aleksandr-valyalkin\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\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;\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hu\/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\udd47Go optimaliz\u00e1l\u00e1sok a VictoriaMetricsben. Alexander Valyalkin | ProHoster","description":"Javaslom, hogy ismerkedjen meg Alekszandr Valjalkin 2019 v\u00e9gi el\u0151ad\u00e1s\u00e1nak \"Go optimaliz\u00e1l\u00e1sok a VictoriaMetrics-ban\" \u00e1t\u00edr\u00e1s\u00e1val.","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/go-optimizations-in-victoriametrics-aleksandr-valyalkin","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","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;","og:url":"https:\/\/prohoster.info\/hu\/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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/80733","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=80733"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/80733\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/80734"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=80733"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=80733"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=80733"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}