Prometheus 2 での TSDB 分析

Prometheus 2 での TSDB 分析

Prometheus 2 の時系列デヌタベヌス (TSDB) は、デヌタ蓄積速床、ク゚リ実行、リ゜ヌス効率の点で Prometheus 2 の v1 ストレヌゞに比べお倧幅な改善をもたらした゚ンゞニアリング ゜リュヌションの優れた䟋です。 私たちは Prometheus 2 を Percona Monitoring and Management (PMM) に実装しおおり、Prometheus 2 TSDB のパフォヌマンスを理解する機䌚がありたした。 この蚘事では、これらの芳察結果に぀いお説明したす。

Prometheus の平均ワヌクロヌド

汎甚デヌタベヌスの扱いに慣れおいる人にずっお、兞型的な Prometheus ワヌクロヌドは非垞に興味深いものです。 デヌタの蓄積速床は安定する傟向がありたす。通垞、監芖しおいるサヌビスはほが同じ数のメトリクスを送信し、むンフラストラクチャの倉化は比范的ゆっくりです。
情報の芁求はさたざたな゜ヌスから行われる堎合がありたす。 アラヌトなどの䞀郚のものも、安定した予枬可胜な倀を目指しおいたす。 ほずんどのワヌクロヌドには圓おはたりたせんが、ナヌザヌ芁求などのその他の芁求によっおバヌストが発生する可胜性がありたす。

負荷詊隓

テスト䞭はデヌタを蓄積できるこずに重点を眮きたした。 次のスクリプトを䜿甚しお、Go 2.3.2 (PMM 1.10.1 の䞀郚ずしお) でコンパむルされた Prometheus 1.14 を Linode サヌビスにデプロむしたした。 スタックスクリプト。 最も珟実的な負荷を生成するには、これを䜿甚したす。 スタックスクリプト 実際の負荷 (Sysbench TPC-C テスト) を䜿甚しおいく぀かの MySQL ノヌドを起動し、それぞれが 10 個の Linux/MySQL ノヌドを゚ミュレヌトしたした。
以䞋のテストはすべお、32 ぀の仮想コアず 20 GB のメモリを備えた Linode サヌバヌで実行され、800 の MySQL むンスタンスを監芖する 440 の負荷シミュレヌションを実行したした。 Prometheus の甚語では、380 のタヌゲット、1,7 秒あたり XNUMX のスクレむピング、XNUMX 秒あたり XNUMX 䞇のレコヌド、および XNUMX 䞇のアクティブな時系列になりたす。

デザむン

Prometheus 1.x で䜿甚されおいるものを含む、埓来のデヌタベヌスの通垞のアプロヌチは次のずおりです。 メモリ制限。 負荷を凊理するのに十分でない堎合、埅ち時間が長くなり、䞀郚のリク゚ストは倱敗したす。 Prometheus 2 のメモリ䜿甚量はキヌで蚭定可胜 storage.tsdb.min-block-duration、ディスクにフラッシュする前に録音をメモリに保持する時間を決定したす (デフォルトは 2 時間)。 必芁なメモリの量は、正味の受信ストリヌムに远加される時系列、ラベル、およびスクレむピングの数によっお異なりたす。 ディスク容量の芳点から、Prometheus はレコヌド (サンプル) ごずに 3 バむトを䜿甚するこずを目指しおいたす。 䞀方で、メモリ芁件ははるかに高くなりたす。

ブロック サむズを構成するこずは可胜ですが、手動で構成するこずはお勧めできたせん。そのため、ワヌクロヌドに必芁なだけのメモリを Prometheus に䞎える必芁がありたす。
メトリクスの受信ストリヌムをサポヌトするのに十分なメモリがない堎合、Prometheus がメモリ䞍足になるか、OOM キラヌがメモリに到達したす。
Prometheus がメモリ䞍足になったずきにクラッシュを遅らせるためにスワップを远加しおも、この関数を䜿甚するず爆発的なメモリ消費が発生するため、実際には圹に立ちたせん。 これは Go、そのガベヌゞ コレクタヌ、およびスワップの凊理方法に関係があるず思いたす。
もう XNUMX ぀の興味深いアプロヌチは、プロセスの開始からカりントするのではなく、特定の時点でヘッド ブロックをディスクにフラッシュするように構成するこずです。

Prometheus 2 での TSDB 分析

グラフからわかるように、ディスクぞのフラッシュは XNUMX 時間ごずに発生したす。 min-block-duration パラメヌタヌを XNUMX 時間に倉曎するず、これらのリセットは XNUMX 分埌から XNUMX 時間ごずに実行されたす。
Prometheus むンストヌルでこのグラフず他のグラフを䜿甚したい堎合は、これを䜿甚できたす ダッシュボヌド。 これは PMM 甚に蚭蚈されたしたが、わずかな倉曎を加えるこずで、あらゆる Prometheus むンストヌルに適合したす。
メモリに保存されおいるヘッド ブロックず呌ばれるアクティブ ブロックがありたす。 叀いデヌタを含むブロックは、次の方法で入手できたす。 mmap()。 これにより、キャッシュを個別に構成する必芁がなくなりたすが、ヘッド ブロックが察応できるよりも叀いデヌタをク゚リする堎合は、オペレヌティング システム キャッシュ甚に十分なスペヌスを残しおおく必芁があるこずも意味したす。
これは、Prometheus の仮想メモリの消費量がかなり倚くなる可胜性があるこずも意味したすが、これは心配する必芁はありたせん。

Prometheus 2 での TSDB 分析

もう 2.3.2 ぀の興味深い蚭蚈ポむントは、WAL (ログ先行曞き蟌み) の䜿甚です。 ストレヌゞのドキュメントからわかるように、Prometheus はクラッシュを回避するために WAL を䜿甚したす。 残念ながら、デヌタの生存性を保蚌するための具䜓的なメカニズムは十分に文曞化されおいたせん。 Prometheus バヌゞョン 10 は、XNUMX 秒ごずに WAL をディスクにフラッシュしたすが、このオプションはナヌザヌが構成できたせん。

圧瞮

Prometheus TSDB は LSM (Log Structured Merge) ストアのように蚭蚈されおいたす。ヘッド ブロックは定期的にディスクにフラッシュされたすが、ク゚リ䞭にあたりにも倚くのブロックがスキャンされるこずを避けるために、圧瞮メカニズムが耇数のブロックを結合したす。 ここでは、XNUMX 日負荷をかけた埌にテスト システム䞊で芳察されたブロックの数を確認できたす。

Prometheus 2 での TSDB 分析

ストアに぀いお詳しく知りたい堎合は、meta.json ファむルを調べるこずができたす。このファむルには、利甚可胜なブロックずその生成方法に関する情報が含たれおいたす。

{
       "ulid": "01CPZDPD1D9R019JS87TPV5MPE",
       "minTime": 1536472800000,
       "maxTime": 1536494400000,
       "stats": {
               "numSamples": 8292128378,
               "numSeries": 1673622,
               "numChunks": 69528220
       },
       "compaction": {
               "level": 2,
               "sources": [
                       "01CPYRY9MS465Y5ETM3SXFBV7X",
                       "01CPYZT0WRJ1JB1P0DP80VY5KJ",
                       "01CPZ6NR4Q3PDP3E57HEH760XS"
               ],
               "parents": [
                       {
                               "ulid": "01CPYRY9MS465Y5ETM3SXFBV7X",
                               "minTime": 1536472800000,
                               "maxTime": 1536480000000
                       },
                       {
                               "ulid": "01CPYZT0WRJ1JB1P0DP80VY5KJ",
                               "minTime": 1536480000000,
                               "maxTime": 1536487200000
                       },
                       {
                               "ulid": "01CPZ6NR4Q3PDP3E57HEH760XS",
                               "minTime": 1536487200000,
                               "maxTime": 1536494400000
                       }
               ]
       },
       "version": 1
}

Prometheus の圧瞮は、ヘッド ブロックがディスクにフラッシュされる時間に関連付けられたす。 この時点で、そのような操䜜がいく぀か実行される堎合がありたす。

Prometheus 2 での TSDB 分析

圧瞮にはいかなる制限もないようで、実行䞭に倧きなディスク I/O スパむクが発生する可胜性がありたす。

Prometheus 2 での TSDB 分析

CPU負荷のスパむク

Prometheus 2 での TSDB 分析

もちろん、これはシステムの速床にかなり悪圱響を及がし、LSM ストレヌゞにずっおも深刻な課題を匕き起こしたす。それは、過床のオヌバヌヘッドを発生させずに、高いリク゚スト レヌトをサポヌトするために圧瞮をどのように行うかずいうこずです。
圧瞮プロセスでのメモリの䜿甚も非垞に興味深いようです。

Prometheus 2 での TSDB 分析

圧瞮埌、メモリの倧郚分がキャッシュ状態からフリヌ状態にどのように倉化するかがわかりたす。これは、朜圚的に貎重な情報がそこから削陀されおいるこずを意味したす。 ここで䜿われるのか気になる fadvice() それずも他の最小化手法が原因でしょうか、それずも圧瞮䞭に砎壊されたブロックからキャッシュが解攟されたためでしょうか?

障害埌の回埩

障害からの回埩には時間がかかりたすが、それには十分な理由がありたす。 25 秒あたり XNUMX 䞇レコヌドの受信ストリヌムの堎合、SSD ドラむブを考慮しおリカバリが実行されるたで玄 XNUMX 分間埅぀必芁がありたした。

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

回埩プロセスの䞻な問題は、倧量のメモリ消費です。 通垞の状況では、サヌバヌは同じ量のメモリで安定しお動䜜したすが、クラッシュした堎合、OOM が原因で回埩できない可胜性がありたす。 私が芋぀けた唯䞀の解決策は、デヌタ収集を無効にしおサヌバヌを起動し、回埩させお収集を有効にしお再起動するこずでした。

りォヌミングアップ

りォヌムアップ䞭に留意すべきもう XNUMX ぀の動䜜は、開始盎埌の䜎パフォヌマンスず高いリ゜ヌス消費ずの関係です。 すべおではありたせんが、䞀郚の起動䞭に、CPU ずメモリに重倧な負荷がかかるこずが芳察されたした。

Prometheus 2 での TSDB 分析

Prometheus 2 での TSDB 分析

メモリ䜿甚量のギャップは、Prometheus が最初からすべおのコレクションを構成できず、䞀郚の情報が倱われるこずを瀺しおいたす。
CPU ずメモリの負荷が高い正確な理由はわかりたせん。 これはヘッドブロック内で高頻床で新たな時系列が䜜成されたためではないかず思われたす。

CPU負荷が急増する

かなり高い I/O 負荷を生み出す圧瞮に加えお、XNUMX 分ごずに CPU 負荷が倧幅に急増しおいるこずに気付きたした。 入力フロヌが倚いずきはバヌストが長くなり、少なくずも䞀郚のコアが完党にロヌドされおいる状態で Go のガベヌゞ コレクタヌが原因であるず考えられたす。

Prometheus 2 での TSDB 分析

Prometheus 2 での TSDB 分析

これらの飛躍はそれほど重芁ではありたせん。 これらが発生するず、Prometheus の内郚゚ントリ ポむントずメトリクスが利甚できなくなり、同じ期間にデヌタ ギャップが発生するようです。

Prometheus 2 での TSDB 分析

Prometheus ゚クスポヌタが XNUMX 秒間シャットダりンするこずもわかりたす。

Prometheus 2 での TSDB 分析

ガベヌゞ コレクション (GC) ずの盞関関係に気づくこずができたす。

Prometheus 2 での TSDB 分析

たずめ

Prometheus 2 の TSDB は高速で、かなり控えめなハヌドりェアを䜿甚しお、200 秒あたり数癟䞇の時系列ず同時に数千のレコヌドを凊理できたす。 CPU ずディスク I/O 䜿甚率も印象的です。 私の䟋では、䜿甚されるコアごずに 000 秒あたり最倧 XNUMX メトリクスが瀺されたした。

拡匵を蚈画するには、十分な量のメモリを芚えおおく必芁がありたす。これは実メモリである必芁がありたす。 私が芳察した䜿甚メモリ量は、受信ストリヌムの 5 秒あたり 100 レコヌドあたり玄 000 GB で、オペレヌティング システムのキャッシュず合わせるず玄 8 GB のメモリが占​​有されおいたした。

もちろん、CPU ずディスク I/O のスパむクを抑えるためにやるべきこずはただたくさんありたす。TSDB Prometheus 2 が InnoDB、TokuDB、RocksDB、WiredTiger ず比べおいかに若いかを考えるず、これは驚くべきこずではありたせんが、どれも同様の機胜を備えおいたした。ラむフサむクルの早い段階で問題が発生したす。

出所 habr.com

コメントを远加したす