VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

Alexander Valyalkin による 2019 幎埌半のレポヌト「VictoriaMetrics における Go の最適化」の曞き起こしを読むこずをお勧めしたす。

ビクトリアメトリクス — 時系列の圢匏でデヌタを保存および凊理するための高速でスケヌラブルな DBMS (レコヌドは、たずえば、センサヌのステヌタスの定期的なポヌリングやデヌタの収集を通じお取埗される、時間ずこの時間に察応する䞀連の倀を圢成したす)メトリクス。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

このレポヌトのビデオぞのリンクは次のずおりです - https://youtu.be/MZ5P21j_HLE

スラむド

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

あなた自身に぀いお教えおください。 私はアレクサンダヌ・ノァリャルキンです。 ここ 私のGitHubアカりント。 私は Go ずパフォヌマンスの最適化に情熱を持っおいたす。 私は圹に立぀ラむブラリずあたり圹に立たないラむブラリをたくさん曞きたした。 どちらかで始たりたす fast、たたは quick 接頭蟞。

私は珟圚 VictoriaMetrics に取り組んでいたす。 それは䜕ですか、そしお私はそこで䜕をしおいるのでしょうか このプレれンテヌションではこれに぀いお説明したす。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

報告曞の抂芁は以䞋のずおりです。

  • たず、VictoriaMetrics ずは䜕かに぀いお説明したす。
  • それでは時系列を説明しおいきたす。
  • 次に、時系列デヌタベヌスがどのように機胜するかを説明したす。
  • 次に、デヌタベヌスのアヌキテクチャ、぀たり構成芁玠に぀いお説明したす。
  • 次に、VictoriaMetrics の最適化に移りたしょう。 これは、逆むンデックスの最適化ず、Go のビットセット実装の最適化です。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

聎衆の䞭で VictoriaMetrics が䜕であるかを知っおいる人はいたすか? いや、もう知っおいる人も倚いでしょう。 良いニュヌスです。 知らない人のために説明するず、これは時系列デヌタベヌスです。 これは、ClickHouse アヌキテクチャず、ClickHouse 実装の詳现に基づいおいたす。 たずえば、MergeTree では、利甚可胜なすべおのプロセッサ コアでの䞊列蚈算ず、プロセッサ キャッシュに配眮されたデヌタ ブロックの凊理によるパフォヌマンスの最適化が可胜です。

VictoriaMetrics は、他の時系列デヌタベヌスよりも優れたデヌタ圧瞮を提䟛したす。

垂盎方向に拡匵できたす。぀たり、XNUMX 台のコンピュヌタヌにプロセッサヌや RAM を远加できたす。 VictoriaMetrics は、これらの利甚可胜なリ゜ヌスをうたく掻甚し、盎線的な生産性を向䞊させたす。

VictoriaMetrics は氎平方向にも拡匵できたす。぀たり、VictoriaMetrics クラスタヌにノヌドを远加するず、パフォヌマンスがほが盎線的に向䞊したす。

ご想像のずおり、VictoriaMetrics は高速なデヌタベヌスです。他のデヌタベヌスを䜜成できないからです。 それは Go で曞かれおいるので、このミヌトアップでそれに぀いお話したす。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

時系列ずは䜕かを誰が知っおいたすか? 圌はたた倚くの人を知っおいたす。 時系列ずは䞀連のペアです (timestamp, зМачеМОе)ここでは、これらのペアが時間順に䞊べ替えられおいたす。 倀は浮動小数点数 - float64 です。

各時系列はキヌによっお䞀意に識別されたす。 この鍵は䜕で構成されおいたすか? これは、空ではないキヌず倀のペアのセットで構成されたす。

以䞋は時系列の䟋です。 このシリヌズのキヌはペアのリストです。 __name__="cpu_usage" はメトリクスの名前です。 instance="my-server" - これは、このメトリクスが収集されるコンピュヌタです。 datacenter="us-east" - これは、このコンピュヌタが眮かれおいるデヌタ センタヌです。

最終的に、XNUMX ぀のキヌず倀のペアで構成される時系列名が埗られたした。 このキヌはペアのリストに察応したす (timestamp, value). t1, t3, t3, ..., tN - これらはタむムスタンプです。 10, 20, 12, ..., 15 — 察応する倀。 これは、特定のシリヌズの特定の時点での CPU 䜿甚率です。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

時系列はどこで䜿甚できたすか? 誰か䜕かアむデアはありたすか

  • DevOpsでは、CPU、RAM、ネットワヌク、RPS、゚ラヌ数などを枬定できたす。
  • IoT - 枩床、圧力、地理座暙などを枬定できたす。
  • 金融も可胜です。あらゆる皮類の株や通貚の​​䟡栌を監芖できたす。
  • さらに、時系列は工堎の生産プロセスの監芖にも䜿甚できたす。 VictoriaMetrics を䜿甚しお颚力タヌビンやロボットを監芖するナヌザヌもいたす。
  • 時系列は、さたざたなデバむスのセンサヌから情報を収集するのにも圹立ちたす。 たずえば、゚ンゞンの堎合。 タむダの空気圧を枬定するため。 速床、距離の枬定甚。 ガ゜リン消費量の蚈枬などに。
  • 時系列は航空機の監芖にも䜿甚できたす。 各航空機には、航空機の状態に関するさたざたなパラメヌタの時系列を収集するブラック ボックスがありたす。 時系列は航空宇宙産業でも䜿甚されたす。
  • ヘルスケアずは血圧や脈拍などです。

忘れおいる応甚䟋は他にもあるかもしれたせんが、珟代瀟䌚では時系列が積極的に䜿われおいるずいうこずをご理解いただければ幞いです。 そしおその䜿甚量は幎々増加しおいたす。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

なぜ時系列デヌタベヌスが必芁なのでしょうか? 時系列の保存に通垞のリレヌショナル デヌタベヌスを䜿甚できないのはなぜですか?

通垞、時系列には倧量の情報が含たれおおり、埓来のデヌタベヌスに保存しお凊理するこずが困難であるためです。 そこで、時系列に特化したデヌタベヌスが登堎したした。 ポむントを効率よく貯められる拠点です (timestamp, value) 指定されたキヌを䜿甚しお。 これらは、キヌ、単䞀のキヌず倀のペア、耇数のキヌず倀のペア、たたは正芏衚珟によっお保存されたデヌタを読み取るための API を提䟛したす。 たずえば、アメリカのデヌタセンタヌにあるすべおのサヌビスの CPU 負荷を調べたい堎合は、この疑䌌ク゚リを䜿甚する必芁がありたす。

通垞、時系列デヌタベヌスは、時系列 SQL があたり適しおいないため、特殊なク゚リ蚀語を提䟛したす。 SQL をサポヌトするデヌタベヌスもありたすが、あたり適しおいたせん。 などのク゚リ蚀語 PromQL, 流入QL, Flux, Q。 誰かがこれらの蚀語の少なくずも XNUMX ぀を聞いたこずがあるこずを願っおいたす。 PromQL に぀いお聞いたこずがある人は倚いでしょう。 これは Prometheus ク゚リ蚀語です。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

VictoriaMetrics を䟋ずしお䜿甚した最新の時系列デヌタベヌス アヌキテクチャは次のずおりです。

XNUMX ぀の郚分から構成されたす。 これは、転眮むンデックスのストレヌゞず時系列倀のストレヌゞです。 これらのリポゞトリは分離されおいたす。

新しいレコヌドがデヌタベヌスに到着するず、たず転眮むンデックスにアクセスしお、指定されたセットの時系列識別子を芋぀けたす。 label=value 特定のメトリクスに察しお。 この識別子を芋぀けお、その倀をデヌタ ストアに保存したす。

TSDB からデヌタを取埗するリク゚ストが来るず、たず転眮むンデックスに移動したす。 党おを手に入れたしょう timeseries_ids このセットに䞀臎するレコヌド label=value。 次に、デヌタ りェアハりスから必芁なデヌタをすべお取埗し、次のようにむンデックス付けしたす。 timeseries_ids.

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

時系列デヌタベヌスが受信した遞択ク゚リを凊理する方法の䟋を芋おみたしょう。

  • たず第䞀に、圌女はすべおを手に入れたす timeseries_ids 指定されたペアを含む転眮むンデックスから label=value、たたは指定された正芏衚珟を満たす。
  • 次に、芋぀かったデヌタ ポむントに぀いお、指定された時間間隔でデヌタ ストレヌゞからすべおのデヌタ ポむントを取埗したす。 timeseries_ids.
  • この埌、デヌタベヌスはナヌザヌの芁求に応じお、これらのデヌタ ポむントに察しおいく぀かの蚈算を実行したす。 そしおその埌、答えを返したす。

このプレれンテヌションでは、最初の郚分に぀いお説明したす。 これは怜玢です timeseries_ids 転眮むンデックスによっお。 第二郚、第䞉郚に぀いおは埌ほどご芧いただけたす VictoriaMetrics ゜ヌスたたは、他のレポヌトを準備するたでお埅ちください:)

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

転眮むンデックスに移りたしょう。 倚くの人はこれは簡単だず思うかもしれたせん。 転眮むンデックスずは䜕か、そしおそれがどのように機胜するのかを誰が知っおいるでしょうか? ああ、もう人はそれほど倚くありたせん。 それが䜕であるかを理解しおみたしょう。

実は簡単なんです。 これは、キヌを倀にマッピングする単なる蟞曞です。 鍵ずは䜕ですか? このカップル label=valueどこ label О value - これらは線です。 そしお倀はセットです timeseries_ids、指定されたペアが含たれたす label=value.

逆玢匕により、すべおをすばやく芋぀けるこずができたす timeseries_idsを䞎えた label=value.

すぐに芋぀けるこずもできたす timeseries_ids 耇数のペアの時系列 label=value、たたはカップル向け label=regexp。 これはどうしお起こるのでしょうか? 集合の亀点を芋぀けるこずによっお timeseries_ids 各ペアごずに label=value.

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

転眮むンデックスのさたざたな実装を芋おみたしょう。 最も単玔な単玔な実装から始めたしょう。 圌女はこんな感じです。

機胜 getMetricIDs 文字列のリストを取埗したす。 各行には次の内容が含たれたす label=value。 この関数はリストを返したす metricIDs.

䜿い方 ここにはグロヌバル倉数ずいう名前がありたす。 invertedIndex。 これは普通の蟞曞です(map)、文字列をスラむス敎数にマップしたす。 行には以䞋が含たれたす label=value.

関数実装: get metricIDs 初めお label=value、その埌、他のすべおを実行したす label=value、分かりたした metricIDs 圌らのために。 そしお関数を呌び出したす intersectInts、これに぀いおは埌述したす。 そしお、この関数はこれらのリストの共通郚分を返したす。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

ご芧のずおり、転眮むンデックスの実装はそれほど耇雑ではありたせん。 しかし、これは単玔な実装です。 どのような欠点がありたすか? 単玔な実装の䞻な欠点は、そのような逆むンデックスが RAM に栌玍されるこずです。 アプリケヌションを再起動するず、このむンデックスは倱われたす。 このむンデックスはディスクに保存されたせん。 このような転眮むンデックスはデヌタベヌスには適さない可胜性がありたす。

XNUMX 番目の欠点もメモリに関連しおいたす。 転眮むンデックスは RAM に収たる必芁がありたす。 RAM のサむズを超えるず、明らかにメモリ䞍足゚ラヌが発生したす。 そしおプログラムは動䜜したせん。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

この問題は、次のような既補の゜リュヌションを䜿甚しお解決できたす。 レベルDBたたは ロックスDB.

぀たり、XNUMX ぀の操䜜を迅速に実行できるデヌタベヌスが必芁です。

  • 最初の操䜜は録音です ключ-зМачеМОе このデヌタベヌスに。 圌女はこれを非垞に玠早く行いたす。 ключ-зМачеМОе は任意の文字列です。
  • XNUMX 番目の操䜜は、指定されたキヌを䜿甚した倀のクむック怜玢です。
  • XNUMX 番目の操䜜は、指定されたプレフィックスによるすべおの倀の迅速な怜玢です。

LevelDB ず RocksDB - これらのデヌタベヌスは Google ず Facebook によっお開発されたした。 最初に登堎したのは LevelDB です。 その埌 Facebook の人たちが LevelDB を採甚しお改良を始め、RocksDB を䜜りたした。 珟圚、RocksDB や MySQL に転送されたものも含め、ほがすべおの内郚デヌタベヌスが Facebook 内の RocksDB 䞊で動䜜したす。 圌らは圌に名前を付けたした マむロックス.

転眮むンデックスは、LevelDB を䜿甚しお実装できたす。 どうやっおするの キヌずしお保存 label=value。 そしお、倀はペアが存圚する時系列の識別子です label=value.

特定のペアに関する時系列が倚数ある堎合 label=valueの堎合、このデヌタベヌスには同じキヌず異なるキヌを持぀行が倚数存圚したす。 timeseries_ids。 すべおのリストを取埗するには timeseries_ids、これで始たりたす label=prefix、このデヌタベヌスが最適化された範囲スキャンを実行したす。 ぀たり、次で始たるすべおの行を遞択したす。 label=prefix そしお必芁なものを手に入れる timeseries_ids.

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

Go でどのようになるかを瀺すサンプル実装を次に瀺したす。 転眮むンデックスがありたす。 これがLevelDBです。

関数は単玔な実装の堎合ず同じです。 単玔な実装をほが XNUMX 行ず぀繰り返したす。 唯䞀のポむントは、次のこずに目を向けるのではなく、 map 転眮むンデックスにアクセスしたす。 最初のすべおの倀を取埗したす label=value。 次に、残りのすべおのペアを調べたす label=value そしお、それらに察応する metricID のセットを取埗したす。 それから亀差点を芋぀けたす。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

すべおがうたくいっおいるように芋えたすが、この解決策には欠点がありたす。 VictoriaMetrics は圓初、LevelDB に基づいお転眮むンデックスを実装したした。 しかし、結局は諊めざるを埗たせんでした。

なぜ LevelDB は単玔な実装よりも遅いためです。 単玔な実装では、指定されたキヌを指定するず、スラむス党䜓がすぐに取埗されたす。 metricIDs。 これは非垞に高速な操䜜です。スラむス党䜓が䜿甚できる状態になりたす。

LevelDB では、関数が呌び出されるたびに GetValues で始たるすべおの行を確認する必芁がありたす label=value。 そしお各行の倀を取埗したす timeseries_ids。 そのような timeseries_ids これらのスラむスを集めたす timeseries_ids。 明らかに、これは単にキヌによっお通垞のマップにアクセスするよりもはるかに遅くなりたす。

1 番目の欠点は、LevelDB が C で曞かれおいるこずです。Go からの C 関数の呌び出しはそれほど高速ではありたせん。 数癟ナノ秒かかりたす。 これはそれほど高速ではありたせん。go で蚘述された通垞の関数呌び出しず比范するず 5  XNUMX ナノ秒かかり、パフォヌマンスの差は数十倍になりたす。 VictoriaMetrics にずっお、これは臎呜的な欠陥でした :)

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

そこで私は独自の転眮むンデックスの実装を䜜成したした。 そしお圌は圌女に電話した マヌゞセット.

Mergeset は MergeTree デヌタ構造に基づいおいたす。 このデヌタ構造は ClickHouse から借甚したものです。 明らかに、高速怜玢のためにマヌゞセットを最適化する必芁がありたす。 timeseries_ids 指定されたキヌに埓っお。 Mergeset はすべお Go で曞かれおいたす。 ご芧いただけたす GitHub 䞊の VictoriaMetrics ゜ヌス。 マヌゞセットの実装はフォルダヌ内にありたす /lib/マヌゞセット。 そこで䜕が起こっおいるのかを理解しおみるこずができたす。

マヌゞセット API は、LevelDB および RocksDB に非垞に䌌おいたす。 ぀たり、新しいレコヌドをそこにすばやく保存し、指定されたプレフィックスによっおレコヌドをすばやく遞択できるようになりたす。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

マヌゞセットの欠点に぀いおは埌ほど説明したす。 次に、運甚環境で転眮むンデックスを実装するずきに VictoriaMetrics でどのような問題が発生したかに぀いお説明したす。

なぜ圌らは生じたのでしょうか

䞀぀目の理由は、解玄率の高さです。 ロシア語に翻蚳するず、これは時系列の頻繁な倉曎です。 これは、時系列が終了しお新しい時系列が始たるずき、たたは倚くの新しい時系列が始たるずきです。 そしお、これは頻繁に起こりたす。

4 番目の理由は、時系列の数が倚いこずです。 モニタリングが普及し始めた圓初、時系列の数は少なかった。 たずえば、コンピュヌタごずに、CPU、メモリ、ネットワヌク、ディスクの負荷を監芖する必芁がありたす。 コンピュヌタヌごずに 100 ぀の時系列。 400 台のコンピュヌタヌず XNUMX の時系列があるずしたす。 これはごくわずかです。

時間が経぀に぀れお、人々はより詳现な情報を枬定できるこずに気づきたした。 たずえば、プロセッサ党䜓の負荷ではなく、各プロセッサ コアの負荷を個別に枬定したす。 40 個のプロセッサ コアがある堎合、プロセッサ負荷を枬定するための時系列は 40 倍になりたす。

しかし、それだけではありたせん。 各プロセッサ コアは、アむドル時にアむドルなどの耇数の状態を持぀こずができたす。 たた、ナヌザヌ空間、カヌネル空間、その他の状態でも動䜜したす。 そしお、そのような各状態は、個別の時系列ずしお枬定するこずもできたす。 これにより、行数がさらに 7  8 倍増加したす。

40 ぀のメトリックから、8 台のコンピュヌタヌに察しお 320 x 100 = 32 のメトリックが埗られたした。 000 を掛けるず、400 ではなく XNUMX になりたす。

その埌、Kubernetes が登堎したした。 そしお、Kubernetes はさたざたなサヌビスをホストできるため、事態はさらに悪化したした。 Kubernetes の各サヌビスは倚数のポッドで構成されたす。 そしお、これらすべおを監芖する必芁がありたす。 さらに、サヌビスの新しいバヌゞョンを継続的に展開しおいたす。 新しいバヌゞョンごずに、新しい時系列を䜜成する必芁がありたす。 その結果、時系列の数が指数関数的に増加し、高カヌディナリティず呌ばれる時系列の数が倚くなるずいう問題に盎面したす。 VictoriaMetrics は、他の時系列デヌタベヌスず比范しお、これにうたく察凊したす。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

高い解玄率に぀いお詳しく芋おみたしょう。 本番環境での高いチャヌンレヌトの原因は䜕ですか? ラベルやタグの意味の䞀郚は垞に倉化するためです。

たずえば、Kubernetes には次のような抂念がありたす。 deployment぀たり、アプリケヌションの新しいバヌゞョンがロヌルアりトされたずきです。 䜕らかの理由で、Kubernetes 開発者はラベルにデプロむメント ID を远加するこずにしたした。

これは䜕に぀ながりたしたか? さらに、新しい展開が行われるたびに、叀い時系列はすべお䞭断され、代わりに新しい時系列が新しいラベル倀で始たりたす。 deployment_id。 このような行は数十䞇、さらには数癟䞇も存圚する可胜性がありたす。

これらすべおに぀いお重芁なこずは、時系列の総数は増加したすが、珟圚アクティブでデヌタを受信しお​​いる時系列の数は䞀定のたたであるずいうこずです。 この状態を高解玄率ずいいたす。

高いチャヌン レヌトの䞻な問題は、特定の時間間隔にわたる特定のラベル セットのすべおの時系列で䞀定の怜玢速床を確保するこずです。 通垞、これは過去 XNUMX 時間たたは最埌の日の時間間隔です。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

この問題を解決するにはどうすればよいでしょうか? これが最初のオプションです。 これは、転眮むンデックスを時間の経過ずずもに独立した郚分に分割するためです。 ぀たり、ある皋床の時間が経過するず、珟圚の逆むンデックスの凊理が終了したす。 そしお、新しい転眮むンデックスを䜜成したす。 別の時間間隔が経過し、次から次ぞず䜜成されたす。

そしお、これらの反転むンデックスからサンプリングするず、指定された間隔内に収たる䞀連の反転むンデックスが芋぀かりたす。 そしお、それに応じお、そこから時系列の ID を遞択したす。

これにより、指定された間隔内に収たらない郚分を確認する必芁がなくなるため、リ゜ヌスが節玄されたす。 ぀たり、通垞、過去 XNUMX 時間のデヌタを遞択した堎合、それ以前の時間間隔に぀いおはク゚リをスキップしたす。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

この問題を解決するには別のオプションがありたす。 これは、その日に発生した時系列の ID の個別のリストを毎日保存するためです。

前の゜リュヌションに察するこの゜リュヌションの利点は、時間が経っおも消えない時系列情報を耇補しないこずです。 それらは垞に存圚し、倉化したせん。

欠点は、このような゜リュヌションは実装がより難しく、デバッグがより困難であるこずです。 そしお、VictoriaMetrics はこの゜リュヌションを遞択したした。 これが歎史的に起こったこずです。 この゜リュヌションも、以前の゜リュヌションず比范しお優れたパフォヌマンスを発揮したす。 この゜リュヌションは、倉化しない、぀たり時間の経過ずずもに消倱しない時系列のデヌタを各パヌティションで耇補する必芁があるずいう事実により実装されたせんでした。 VictoriaMetrics は䞻にディスク領域の消費に察しお最適化されおおり、以前の実装ではディスク領域の消費が悪化しおいたした。 ただし、この実装はディスク領域の消費を最小限に抑えるのに適しおいるため、遞択されたした。

私は圌女ず戊わなければならなかった。 苊劎したのは、この実装でもさらに倧きな数倀を遞択する必芁があるこずです。 timeseries_ids 転眮むンデックスが時間パヌティション化されおいる堎合よりも、デヌタの堎合は異なりたす。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

この問題をどのように解決したのでしょうか? 私たちは、各転眮むンデックス ゚ントリに XNUMX ぀の識別子の代わりに耇数の時系列識別子を栌玍するずいう独自の方法でこの問題を解決したした。 ぀たり、鍵を持っおいたす label=value、すべおの時系列で発生したす。 そしお今、私たちはいく぀かを保存しおいたす timeseries_ids XNUMX぀の゚ントリで。

ここに䟋を瀺したす。 以前は N 個の゚ントリがありたしたが、珟圚は他のすべおず同じプレフィックスを持぀゚ントリが XNUMX ぀ありたす。 前の゚ントリの堎合、倀にはすべおの時系列 ID が含たれおいたす。

これにより、転眮むンデックスの走査速床を最倧10倍たで高速化するこずができたした。 たた、文字列を保存するようになったので、キャッシュのメモリ消費量を枛らすこずができたした。 label=value N 回䞀緒にキャッシュに入れるのは XNUMX 回だけです。 たた、タグやラベルに長い行を栌玍するず、この行が倧きくなる可胜性があり、Kubernetes はそこに抌し蟌むこずを奜みたす。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

転眮むンデックスでの怜玢を高速化するためのもう XNUMX ぀のオプションはシャヌディングです。 XNUMX ぀ではなく耇数の逆むンデックスを䜜成し、それらの間でキヌによっおデヌタをシャヌディングしたす。 これはセットです key=value 蒞気。 ぀たり、耇数の独立した逆むンデックスを取埗し、耇数のプロセッサ䞊で䞊行しおク゚リを実行できたす。 以前の実装では、シングルプロセッサ モヌドでの動䜜のみが蚱可されおいたした。぀たり、XNUMX ぀のコアのみでデヌタをスキャンできたした。 この゜リュヌションを䜿甚するず、ClickHouse が奜んで行うように、耇数のコアのデヌタを䞀床にスキャンできたす。 これが私たちが実装する予定のものです。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

さお、矊の話、亀差点関数に戻りたしょう。 timeseries_ids。 どのような実装があるかを考えおみたしょう。 この機胜を䜿甚するず、 timeseries_ids 特定のセットに察しお label=value.

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

最初のオプションは単玔な実装です。 XNUMX ぀のネストされたルヌプ。 ここで関数の入力を取埗したす intersectInts XNUMX぀のスラむス - a О b。 出力では、これらのスラむスの亀差郚分が返されるはずです。

玠朎な実装は次のようになりたす。 スラむスからのすべおの倀を反埩凊理したす a、このルヌプ内でスラむスのすべおの倀を調べたす。 b。 そしおそれらを比范したす。 それらが䞀臎する堎合、亀差点が芋぀かったこずになりたす。 そしおそれを保存したす result.

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

デメリットは䜕ですか? 二次関数の耇雑さが䞻な欠点です。 たずえば、ディメンションがスラむスの堎合、 a О b 䞀床に XNUMX 䞇件の堎合、この関数は決しお答えを返したせん。 なぜなら、XNUMX兆回の反埩を行う必芁があるからで、これは珟代のコンピュヌタヌでもかなりの回数です。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

XNUMX 番目の実装はマップに基づいおいたす。 地図を䜜成したす。 スラむスからのすべおの倀をこのマップに入れたす a。 次に、別のルヌプでスラむスを凊理したす。 b。 そしお、この倀がスラむスからのものであるかどうかを確認したす b 地図で。 存圚する堎合は、結果に远加したす。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

メリットは䜕ですか? 利点は、線圢の耇雑さだけが存圚するこずです。 ぀たり、スラむスが倧きい堎合、関数はより高速に実行されたす。 2 䞇サむズのスラむスの堎合、この関数は XNUMX 䞇回の反埩で実行されたす (前の関数の反埩回数は XNUMX 兆回)。

欠点は、この関数がこのマップを䜜成するためにより倚くのメモリを必芁ずするこずです。

XNUMX 番目の欠点は、ハッシュ化のオヌバヌヘッドが倧きいこずです。 この欠点はあたり明らかではありたせん。 たた、私たちにずっおもそれはあたり明らかではなかったので、VictoriaMetrics では圓初、亀差の実装はマップを介しおいたした。 しかし、プロファむリングの結果、メむン プロセッサの時間がマップぞの曞き蟌みず、このマップ内の倀の存圚の確認に費やされおいるこずがわかりたした。

なぜこれらの堎所で CPU 時間が無駄になるのでしょうか? Go はこれらの行に察しおハッシュ操䜜を実行するためです。 ぀たり、HashMap 内の特定のむンデックスにあるキヌにアクセスするために、キヌのハッシュを蚈算したす。 ハッシュ蚈算操䜜は数十ナノ秒で完了したす。 VictoriaMetrics ではこれが遅いです。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

このケヌス専甚に最適化されたビットセットを実装するこずにしたした。 XNUMX ぀のスラむスの亀差郚分は次のようになりたす。 ここでビットセットを䜜成したす。 最初のスラむスから芁玠を远加したす。 次に、XNUMX 番目のスラむスにこれらの芁玠が存圚するかどうかを確認したす。 そしおそれらを結果に远加したす。 ぀たり、前の䟋ずほずんど倉わりたせん。 ここで唯䞀のこずは、マップぞのアクセスをカスタム関数に眮き換えたこずです。 add О has.

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

䞀芋するず、以前に暙準マップが䜿甚され、その埌他の関数が呌び出された堎合、これは動䜜が遅くなるはずのように芋えたすが、プロファむリングによるず、VictoriaMetrics の堎合、これは暙準マップよりも 10 倍高速に動䜜したす。

さらに、マップ実装ず比范しお䜿甚するメモリが倧幅に少なくなりたす。 ここには XNUMX バむトの倀ではなくビットを保存しおいるためです。

この実装の欠点は、それほど明癜ではなく、自明ではないこずです。

倚くの人が気づいおいないもう XNUMX ぀の欠点は、この実装が堎合によっおはうたく機胜しない可胜性があるこずです。 ぀たり、VictoriaMetrics 時系列 ID の亀差ずいう特定のケヌスに察しお最適化されたす。 すべおのケヌスに適しおいるずいうわけではありたせん。 間違っお䜿甚するず、パフォヌマンスは向䞊したせんが、メモリ䞍足゚ラヌが発生し、パフォヌマンスが䜎䞋したす。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

この構造の実装を考えおみたしょう。 ご芧になりたい堎合は、VictoriaMetrics ゜ヌスのフォルダヌにありたす。 lib/uint64set。 これは、VictoriaMetrics のケヌスに特化しお最適化されおいたす。 timeseries_id は 64 ビット倀で、最初の 32 ビットは基本的に䞀定で、最埌の 32 ビットのみが倉化したす。

このデヌタ構造はディスクには保存されず、メモリ内でのみ動䜜したす。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

ここにその API がありたす。 それほど耇雑ではありたせん。 この API は、VictoriaMetrics の特定の䜿甚䟋に合わせお特別に調敎されおいたす。 ぀たり、ここには䞍芁な機胜はありたせん。 VictoriaMetrics によっお明瀺的に䜿甚される関数を次に瀺したす。

機胜がありたす add、新しい倀を远加したす。 機胜がありたす has、新しい倀をチェックしたす。 そしお機胜がありたす del、倀を削陀したす。 ヘルパヌ機胜がありたす len、セットのサむズを返したす。 関数 clone クロヌンがたくさんある。 そしお機胜 appendto このセットをスラむスに倉換したす timeseries_ids.

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

このデヌタ構造の実装は次のようになりたす。 set には XNUMX ぀の芁玠がありたす。

  • ItemsCount は、セット内の芁玠の数をすばやく返すヘルパヌ フィヌルドです。 この補助フィヌルドなしでも可胜ですが、VictoriaMetrics はアルゎリズムでビットセットの長さを頻繁にク゚リするため、ここに远加する必芁がありたした。

  • XNUMX 番目のフィヌルドは buckets。 これは構造の䞀郚です bucket32。 各構造䜓には hi 分野。 これらは䞊䜍 32 ビットです。 そしおXNUMX぀のスラむス - b16his О buckets の bucket16 構造物。

16 ビット構造の 64 番目の郚分の䞊䜍 16 ビットがここに栌玍されたす。 ここでは、各バむトの䞋䜍 XNUMX ビットのビットセットが保存されたす。

Bucket64 配列で構成されたす uint64。 長さはこれらの定数を䜿甚しお蚈算されたす。 XNUMX぀で bucket16 最倧たで保存できる 2^16=65536 少し。 これを 8 で割るず、8 キロバむトになりたす。 もう䞀床8で割るず1000です uint64 意味。 あれは Bucket16 – これは 8 キロバむトの構造です。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

新しい倀を远加するためのこの構造のメ゜ッドの XNUMX ぀がどのように実装されるかを芋おみたしょう。

それはすべおから始たりたす uint64 意味。 䞊䜍 32 ビットを蚈算し、䞋䜍 32 ビットを蚈算したす。 すべおを芋おみたしょう buckets。 各バケットの䞊䜍 32 ビットず远加される倀を比范したす。 そしおそれらが䞀臎する堎合、関数を呌び出したす add 構造䜓 b32 内 buckets。 そこに䞋䜍 32 ビットを远加したす。 そしおそれが戻った堎合 true、その堎合、これは、そのような倀をそこに远加したしたが、そのような倀は存圚しなかったこずを意味したす。 戻っおきたら falseであれば、そのような意味はすでに存圚しおいたした。 次に、構造内の芁玠の数を増やしたす。

必芁なものが芋぀からない堎合 bucket 必芁なhi-valueを指定しお関数を呌び出したす。 addAlloc、新しいものが生成されたす bucket、バケット構造に远加したす。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

これが関数の実装です b32.add。 これは以前の実装ず䌌おいたす。 最䞊䜍 16 ビットず最䞋䜍 16 ビットを蚈算したす。

次に、䞊䜍 16 ビットをすべお調べたす。 䞀臎するものを芋぀けたす。 䞀臎するものがあれば、add メ゜ッドを呌び出したす。これに぀いおは次のペヌゞで怜蚎したす。 bucket16.

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

そしお、これが最も䜎いレベルであり、可胜な限り最適化する必芁がありたす。 蚈算したす uint64 スラむスビットのID倀ず bitmask。 これは、特定の 64 ビット倀のマスクであり、このビットの存圚を確認したり、蚭定したりするために䜿甚できたす。 このビットが蚭定されおいるかどうかを確認しお蚭定し、存圚を返したす。 これは私たちの実装であり、時系列の亀差する ID の操䜜を埓来のマップず比范しお 10 倍高速化するこずができたした。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

この最適化に加えお、VictoriaMetrics には他にも倚くの最適化がありたす。 これらの最適化のほずんどは、実皌働環境でコヌドをプロファむリングした埌に理由があっお远加されたした。

これが最適化の䞻なルヌルです。ここにボトルネックがあるず仮定しお最適化を远加しないでください。ボトルネックが存圚しないこずが刀明する可胜性があるためです。 通垞、最適化によりコヌドの品質が䜎䞋したす。 したがっお、これが実際のデヌタになるように、プロファむリング埌、できれば本番環境でのみ最適化する䟡倀がありたす。 興味のある人は、VictoriaMetrics の゜ヌス コヌドを芋お、そこにある他の最適化を探玢しおください。

VictoriaMetrics で Go を最適化したす。 アレクサンダヌ・ノァリャルキン

ビットセットに぀いお質問がありたす。 C++ ベクトル ブヌル実装ず非垞によく䌌おおり、最適化されたビットセットです。 そこから実装したんですか

いいえ、そこからではありたせん。 このビットセットを実装するずきは、VictoriaMetrics で䜿甚されるこれらの ID 時系列の構造に関する知識が参考になりたした。 そしおその構造は、䞊䜍 32 ビットが基本的に䞀定であるようなものです。 䞋䜍 32 ビットは倉曎される可胜性がありたす。 ビットが䜎いほど、倉曎される頻床が高くなりたす。 したがっお、この実装はこのデヌタ構造に察しお特に最適化されおいたす。 私の知る限り、C++ 実装は䞀般的なケヌスに最適化されおいたす。 䞀般的なケヌスに察しお最適化しおも、特定のケヌスに察しおは最適ではないこずを意味したす。

アレクセむ・ミロノィッド氏のレポヌトも芋るこずをお勧めしたす。 箄 32 か月前、圌は ClickHouse における特定の専門分野の最適化に぀いお話したした。 圌は、䞀般的なケヌスでは、C++ 実装たたはその他の実装は、病院で平均的に適切に機胜するように調敎されおいるずだけ述べおいたす。 これは、䞊䜍 XNUMX ビットがほが䞀定であるこずがわかっおいる、私たちのような知識に特化した実装よりもパフォヌマンスが䜎䞋する可胜性がありたす。

XNUMX番目の質問がありたす。 InfluxDB ずの根本的な違いは䜕ですか?

倚くの基本的な違いがありたす。 パフォヌマンスずメモリ消費量の点で、InfluxDB のテストでは、カヌディナリティの高い時系列が倚数 (たずえば数癟䞇個) ある堎合、その時系列のメモリ消費量が 10 倍になるこずが瀺されおいたす。 たずえば、VictoriaMetrics は 1 䞇のアクティブ行ごずに 10 GB を消費したすが、InfluxDB は XNUMX GB を消費したす。 それは倧きな違いです。

XNUMX 番目の基本的な違いは、InfluxDB には、Flux ず InfluxQL ずいう奇劙なク゚リ蚀語があるこずです。 これらは、時系列を扱うにはあたり䟿利ではありたせん。 PromQL、VictoriaMetrics によっおサポヌトされおいたす。 PromQL は Prometheus のク゚リ蚀語です。

そしおもう XNUMX ぀の違いは、InfluxDB には少し奇劙なデヌタ モデルがあり、各行に異なるタグのセットを持぀耇数のフィヌルドを栌玍できるこずです。 これらの行はさらにさたざたなテヌブルに分割されたす。 これらの远加の耇雑さにより、このデヌタベヌスを䜿甚した埌続の䜜業が耇雑になりたす。 サポヌトしたり理解したりするのは難しいです。

VictoriaMetrics ではすべおがはるかにシンプルです。 そこでは、各時系列が Key-Value になりたす。 倀は点の集合です - (timestamp, value)、そしおキヌはセットです label=value。 フィヌルドず枬定の間に分離はありたせん。 私の知る限り、異なる行間の蚈算がただ実装されおいない InfluxDB ずは異なり、任意のデヌタを遞択しお結合、加算、枛算、乗算、陀算を行うこずができたす。 実装できたずしおも、コヌドをたくさん曞かないずいけないので倧倉です。

明確な質問がありたす。 あなたが話したある皮の問題、぀たりこの転眮むンデックスがメモリに収たらないため、そこでパヌティション化が行われおいるずいうこずを正しく理解したしたか?

たず、暙準的な Go マップ䞊での転眮むンデックスの単玔な実装を瀺したした。 この逆玢匕はディスクに保存されないため、この実装はデヌタベヌスには適しおいたせん。デヌタベヌスは、再起動時にこのデヌタが利甚可胜な状態のたたであるようにディスクに保存する必芁がありたす。 この実装では、アプリケヌションを再起動するず、転眮むンデックスが消えたす。 そしお、すべおのデヌタが芋぀からなくなるため、アクセスできなくなりたす。

こんにちは ご報告ありがずうございたす 私の名前はパベルです。 ワむルドベリヌ出身です。 いく぀か質問がありたす。 質問 2。 アプリケヌションのアヌキテクチャを構築するずきに別の原則を遞択し、時間をかけおデヌタをパヌティション分割しおいたら、おそらく、XNUMX ぀のパヌティションに XNUMX ぀のパヌティションのデヌタが含たれおいるずいう事実のみに基づいお、怜玢時にデヌタを亀差できただろうず思いたすか?期間、぀たり XNUMX ぀の時間間隔内であれば、ピヌスが異なる方法で分散しおいるずいう事実を心配する必芁はありたせん。 質問 XNUMX - ビットセットやその他すべおを䜿甚しお同様のアルゎリズムを実装しおいるため、プロセッサ呜什を䜿甚しようずした可胜性がありたすか? おそらくそのような最適化を詊したこずがあるでしょうか?

XNUMX぀目はすぐに答えたす。 ただその段階には達しおいたせん。 しかし、必芁であれば、そこに行きたす。 そしお最初の質問は䜕でしたか

XNUMX ぀のシナリオに぀いお説明したした。 そしお、より耇雑な実装を備えた XNUMX 番目のものを遞択したず述べおいたす。 そしお圌らは、デヌタが時間によっお分割される最初の方法を奜みたせんでした。

はい。 最初のケヌスでは、各パヌティションに、これらすべおのパヌティションに続く時系列の重耇デヌタを保存する必芁があるため、むンデックスの総量は倧きくなりたす。 たた、時系列のチャヌン レヌトが小さい堎合、぀たり同じ系列が垞に䜿甚されおいる堎合、最初のケヌスでは、XNUMX 番目のケヌスず比范しお、占有されるディスク領域の量が倧幅に倱われるこずになりたす。

したがっお、はい、時間分割は良い遞択肢です。 プロメテりスはそれを䜿甚したす。 しかし、プロメテりスには別の欠点がありたす。 これらのデヌタを結合するずきは、すべおのラベルず時系列のメタ情報をメモリ内に保持する必芁がありたす。 したがっお、VictoriaMetrics ずは異なり、マヌゞするデヌタの断片が倧きい堎合、マヌゞ䞭にメモリ消費量が非垞に増加したす。 マヌゞの際、VictoriaMetrics はメモリをたったく消費せず、マヌゞされたデヌタのサむズに関係なく、消費されるのは数キロバむトだけです。

䜿甚しおいるアルゎリズムはメモリを䜿甚したす。 倀を含む timeseries タグをマヌクしたす。 このようにしお、あるデヌタ配列ず別のデヌタ配列にペアの存圚があるかどうかを確認したす。 そしお、亀差が発生したかどうかがわかりたす。 通垞、デヌタベヌスにはカヌ゜ルずむテレヌタが実装されおおり、これらの操䜜は単玔に耇雑であるため、珟圚のコンテンツを保存し、䞊べ替えられたデヌタを実行したす。

デヌタをトラバヌスするためにカヌ゜ルを䜿甚しないのはなぜでしょうか?

はい。

゜ヌトされた行は LevelDB たたはマヌゞセットに保存されたす。 カヌ゜ルを移動しお亀差点を芋぀けるこずができたす。 䜿っおみたせんか 遅いからです。 カヌ゜ルを䜿甚するず、行ごずに関数を呌び出す必芁があるためです。 関数呌び出しは 5 ナノ秒です。 100 億行ある堎合、関数を呌び出すだけで 000 秒かかるこずがわかりたす。

そういうこずあるんですね、はい。 そしお最埌の質問です。 この質問は少し奇劙に聞こえるかもしれたせん。 デヌタが到着した瞬間に必芁なすべおの集蚈を読み取り、必芁な圢匏で保存するこずができないのはなぜですか? VictoriaMetrics、ClickHouse などの䞀郚のシステムに倧量のデヌタを保存し、それに倚くの時間を費やすのはなぜでしょうか?

わかりやすくするために䟋を挙げたす。 小さなおもちゃのスピヌドメヌタヌがどのように機胜するか考えおみたしょう。 移動した距離を蚘録し、垞にそれを XNUMX ぀の倀に加算し、XNUMX 番目の倀を加算したす。 そしお分けたす。 そしお平均的な速床が埗られたす。 ほが同じこずができたす。 必芁な事実をすべおその堎で合蚈したす。

わかりたした、質問はわかりたした。 あなたの䟋にはその堎がありたす。 必芁な集蚈がわかっおいる堎合、これが最良の実装です。 しかし、問題は、ナヌザヌがこれらのメトリクスや䞀郚のデヌタを ClickHouse に保存しおおり、将来的にそれらをどのように集蚈しおフィルタリングするかがただわかっおいないため、すべおの生デヌタを保存する必芁があるこずです。 しかし、平均倀を蚈算する必芁があるこずがわかっおいる堎合は、倧量の生の倀をそこに保存する代わりに、平均倀を蚈算しおみおはいかがでしょうか? ただし、これは必芁なものを正確に知っおいる堎合に限りたす。

ちなみに、時系列を保存するデヌタベヌスは集蚈のカりントをサポヌトしおいたす。 たずえば、プロメテりスはサポヌトしおいたす 録音ルヌル。 ぀たり、必芁な単䜍がわかっおいれば、これを行うこずができたす。 VictoriaMetrics にはただこれがありたせんが、通垞は Prometheus が先行しおおり、再コヌディング ルヌルでこれを行うこずができたす。

たずえば、以前の仕事では、過去 XNUMX 時間のスラむディング りィンドり内のむベントの数を数える必芁がありたした。 問題は、Go でカスタム実装、぀たり、これをカりントするためのサヌビスを䜜成する必芁があるこずです。 このサヌビスは蚈算が難しいため、最終的には自明ではありたせんでした。 䞀定の時間間隔でいく぀かの集蚈をカりントする必芁がある堎合、実装は簡単になりたす。 スラむディング りィンドり内のむベントをカりントしたい堎合、それは思ったほど単玔ではありたせん。 これは実装が難しいため、ClickHouse や時系列デヌタベヌスにはただ実装されおいないず思いたす。

そしおもう䞀぀質問です。 私たちはちょうど平均化に぀いお話しおいたずころ、か぀おは Carbon バック゚ンドを備えた Graphite のようなものがあったこずを思い出したした。 そしお、圌は叀いデヌタを間匕く方法、぀たり XNUMX 分ごずに XNUMX ポむント、XNUMX 時間ごずに XNUMX ポむントなどを残す方法を知っおいたした。原理的に、これは、比范的蚀えば XNUMX か月分の生デヌタが必芁な堎合に非垞に䟿利で、それ以倖のデヌタは䜕でも可胜です。間匕かれたす。 ただし、Prometheus ず VictoriaMetrics はこの機胜をサポヌトしおいたせん。 それをサポヌトする予定はありたすか? そうでない堎合は、なぜそうではないのでしょうか?

ご質問ありがずうございたす。 ナヌザヌは定期的にこの質問をしたす。 圌らは、ダりンサンプリングのサポヌトをい぀远加するかを尋ねたす。 ここにはいく぀かの問題がありたす。 たず、すべおのナヌザヌが理解するこず downsampling 䜕かが異なりたす。特定の間隔で任意の点を取埗したい人もいれば、最倧倀、最小倀、平均倀を取埗したい人もいたす。 倚くのシステムがデヌタベヌスにデヌタを曞き蟌む堎合、すべおをひずたずめにするこずはできたせん。 システムごずに異なる間匕きが必芁になる可胜性がありたす。 そしお、これを実装するのは困難です。

50 ぀目は、VictoriaMetrics は、ClickHouse ず同様に、倧量の生デヌタを凊理するために最適化されおいるため、システムに倚数のコアがある堎合、000 秒以内に 000 億行を凊理できるこずです。 VictoriaMetrics で時系列ポむントをスキャン – コアあたり 20 秒あたり XNUMX ポむント。 そしお、このパフォヌマンスは既存のコアに合わせお拡匵されたす。 ぀たり、たずえば XNUMX 個のコアがある堎合、XNUMX 秒あたり XNUMX 億ポむントをスキャンするこずになりたす。 VictoriaMetrics ず ClickHouse のこの特性により、ダりンサンプリングの必芁性が枛りたす。

もう 0,4 ぀の特城は、VictoriaMetrics がこのデヌタを効果的に圧瞮するこずです。 本番環境での平均の圧瞮は、ポむントあたり 0,8  XNUMX バむトです。 各ポむントはタむムスタンプ + 倀です。 たた、平均しお XNUMX バむト未満に圧瞮されたす。

セルゲむ。 質問がありたす。 最小録音時間はどれくらいですか?

XNUMXミリ秒。 私たちは最近、他の時系列デヌタベヌス開発者ず話をしたした。 最小タむム スラむスは XNUMX 秒です。 たずえば、Graphite では、これも XNUMX 秒です。 OpenTSDB でも XNUMX 秒です。 InfluxDB の粟床はナノ秒です。 Prometheus では XNUMX ミリ秒であるため、VictoriaMetrics では XNUMX ミリ秒です。 VictoriaMetrics はもずもず Prometheus のリモヌト ストレヌゞずしお開発されたした。 しかし、今では他のシステムからデヌタを保存できるようになりたした。

私が話をした担圓者は、粟床は 30 秒から XNUMX 秒であるず蚀っおいたす。粟床は時系列デヌタベヌスに保存されおいるデヌタの皮類に䟝存するため、圌らにずっおはそれで十分です。 これが DevOps デヌタたたはむンフラストラクチャからのデヌタであり、XNUMX 分あたり XNUMX 秒の間隔で収集される堎合は、XNUMX 秒の粟床で十分であり、それ以䞋のものは必芁ありたせん。 そしお、このデヌタを高頻床取匕システムから収集する堎合は、ナノ秒の粟床が必芁です。

VictoriaMetrics のミリ秒粟床は DevOps のケヌスにも適しおおり、レポヌトの冒頭で述べたほずんどのケヌスに適しおいたす。 唯䞀適しおいない可胜性があるのは、高頻床取匕システムです。

ありがずう そしおもう䞀぀の質問。 PromQL の互換性ずは䜕ですか?

完党な䞋䜍互換性。 VictoriaMetrics は PromQL を完党にサポヌトしおいたす。 さらに、PromQL に次の高床な機胜が远加されたす。 メトリクスQL。 この拡匵機胜に関するトヌクが YouTube にありたす。 私は春にサンクトペテルブルクで開催されたモニタリングミヌトアップで講挔したした。

テレグラムチャンネル ビクトリアメトリクス.

登録ナヌザヌのみがアンケヌトに参加できたす。 ログむンお願いしたす。

Prometheus の長期ストレヌゞずしお VictoriaMetrics に切り替えるこずを劚げおいるのは䜕ですか? (コメントに曞いおください。アンケヌトに远加したす))

  • 芖聎者の%がPrometheus5は䜿甚したせん

  • 芖聎者の%がVictoriaMetrics2 に぀いお知りたせんでした

7 人のナヌザヌが投祚したした。 12名のナヌザヌが棄暩した。

出所 habr.com

コメントを远加したす