コンテンツにスキップ

動作要件

Yagra は、1 台のホストの上で Docker のコンテナ群として動きます。機能の一覧から受ける印象より、 ずっと軽いです。任意の機能をすべて有効にしたフルスタックでも、メモリは 1.0〜1.4 GB です。

この数字を動かすのは、監視するノードの数ではありません。どの任意ストアを動かすかと、 何系列のメトリクスをどれだけの期間残すかです。

以下の表では、実際に測った値と、測っていない値を区別しています。推定にはその旨を書いています。

ノード数 vCPU RAM ディスク 根拠
最小 — 評価用 〜50 2 4 GB 20 GB 実測。既定のインストールでメモリ 1.0〜1.4 GB、イメージ約 2.3 GB
推奨 — フルスタック、全機能有効 〜500 4 8 GB 100 GB 全機能を有効にした 4 vCPU / 7.6 GiB ホストで実測
中規模 〜5,000 8 16 GB 500 GB 〜 1 TB 以上 推定。 ディスクを決めるのはノード数ではなく収集するインターフェース数です。後述の計算式を使ってください
大規模 〜50,000 16 32 GB 1 TB 以上 推定(core 自体を除く。後述)

実測なのはメモリとディスクの列で、ノード数の列は実測ではありません。 上 2 行のメモリとディスクは、 その規模のホストで docker stats と docker images を実行して得た値です。一方でノード数の上限は、 どの行も外挿です。継続して動かしているフリートで最大のものは 32 ノードであり、後述の 50,000 ノードの 数値も、実際にポーリングしたフリートではなく合成データのリプレイによるものです。

ですからノード数の列は出発点として扱い、あとは Settings ▸ Yagra health を見てください。core と 各ポーラーの実際の CPU、ロードアベレージ、メモリ、ファイルシステムごとの使用量が出ます。

動作条件は、Docker と Docker Compose プラグインが動く x86-64 / ARM64 のホストであることです。 Linux では NET_RAW ケーパビリティが必要です。ポーラーが raw ソケットで ICMP を送るためです。 同梱の Compose ファイルが、これを付けます。

既定のインストールが実際に起動するもの

Section titled “既定のインストールが実際に起動するもの”

docker-compose.deploy.yml には Compose のプロファイルが 1 つも定義されていません。ですから docker compose up -d は、ClickHouse も VictoriaLogs も IP→ASN アップデータも含めて、すべての サービスを起動します。任意ストアは opt-in ではなく opt-out です。要らない場合は、そのサービスを ファイルから削除してください(あわせて core 側の対応する URL の設定も外します)。

つまりこのファイルを編集していない限り、見積もりの基準は「すべて有効」の行 — メモリ 1.0〜1.4 GB、 イメージ約 2.3 GB — であって、必須サービスだけの小計ではありません。

コンテナ別メモリ使用量(実測)

Section titled “コンテナ別メモリ使用量(実測)”

稼働中の v0.3.3 デプロイ 2 台に対して docker stats --no-stream で実測しました。どちらも監視ノード 32 件、オプション機能はすべて有効です。ホスト A は 4 vCPU / 7.6 GiB、ホスト B は 8 vCPU / 7.8 GiB:

コンテナ ホスト A ホスト B 役割
clickhouse 872 MiB 696 MiB トラフィックフロー(NetFlow/IPFIX/sFlow) — 任意。既定で起動する
core 141 MiB 111 MiB 必須 — オーケストレーション、スケジューラ、API
victoriametrics 104 MiB 117 MiB 必須 — メトリクスストア
victorialogs 98 MiB 11 MiB 受動イベント(syslog、トラップ) — 任意。既定で起動する
poller 58 MiB 62 MiB 必須 — ICMP/SNMP/API による監視
postgres 48 MiB 39 MiB 必須 — 設定、ユーザー、アラート履歴
nats 17 MiB 6 MiB 必須 — core⇄poller のバス
yagra-updater 7 MiB 1 MiB 同梱 — インプレースアップグレード
web 6 MiB 8 MiB 必須 — WebUI(nginx)
redis 6 MiB 3 MiB 同梱 — ポーラーの死活と割り当て
ipasn-updater 5 MiB 8 MiB フロー向け IP→ASN 補完 — 任意。既定で起動する

2 つの列はバージョンも監視対象も同じです。ですからこの幅は、サービスの種類による違いではなく、 そのサービスが何をしているかによる違いです。いちばん幅が大きいのは victorialogs で、これは中身が ほぼキャッシュであり、取り込み量と検索量に応じて増えます。低いほうの数字を前提に計画しないで ください。

合計すると:

構成 メモリ
必須サービスのみ — Compose ファイルから他を削除した場合 約 0.4 GB
+受動イベント監視 約 0.4〜0.5 GB
すべて有効 — 既定のインストールで動くのはこれ 約 1.0〜1.4 GB

ClickHouse だけで、スタック全体の半分以上を占めます。 トラフィックフローを集めないのであれば、 これを外すのが、メモリと CPU の両面でいちばん効く削減です。

規模が大きくなったとき、最初に別ホストへ切り出すべきサービスでもあります。I/O とページキャッシュを 多く使うからです。切り出しに必要な変更は、YAGRA_CLICKHOUSE_URL だけです。

これまで測ったどの規模でも、CPU が制約になったことはありません。

上の 32 ノードのデプロイ 2 台では、Yagra のコンテナ全体で 1 コアの 6% と 38% でした (docker stats の瞬間値)。どちらのホストでも、その 70% 以上は ClickHouse と VictoriaLogs の 後片付けです。後述の 50,000 ノードのテストでも、core の平均は 1 コアの 11.8% です。

ですからサイジングは、RAM とディスクを基準に行ってください。CPU は、ポーリングの一時的な集中と レポート生成に足りる余裕があれば十分です。計画の軸にする数字ではありません。

ディスク使用量を決めるのは、ノード数ではなく メトリクスの系列数 × 保持期間 です:

バイト数 ≈ 系列数 × (86400 ÷ 収集間隔秒) × 保持日数 × 1 サンプルあたり約 1 バイト

上の 2 台で実測すると、1 サンプルあたりの費用はインデックス込みで 0.72 バイトと 0.78 バイトでした。サンプルのデータ本体だけなら 0.39〜0.41 バイトまで圧縮されます。残りは 転置インデックスで、この 2 台ではディスク上のバイト数の 46〜48% を占めています。ですから 「1 サンプルあたり 1 バイト」は今も安全側の上限ですが、その余裕を作っているのは圧縮率ではなく インデックスぶんの取り置きです。(この 2 台は系列の入れ替わりが多いラボ機で、インデックスの比率が 大きめに出ます。安定運用のフリートではもっと小さくなるはずです。)

収集対象ごとの実測値です:

対象 系列数 内訳
ICMP チェック(応答があるノード) 2 icmp_loss_pct と icmp_rtt_ms。応答が無いノードは loss だけが残る
SNMP ノードの基本 約 4 snmp_up、snmp_neighbor_count、snmp_l3_address_count、snmp_routing_adjacency_count
収集するインターフェース 1 本ごと 11 admin/oper ステータス、HC in/out オクテット、HC in/out ユニキャストパケット、in/out エラー、in/out 破棄、リンク速度
…光モジュール対応の場合 +2 if_rx_power_dbm、if_tx_power_dbm

ベンダー固有の健全性メトリクス(CPU、メモリ、温度)が、ノードごとにさらに数本加わります。

派生値(使用率、bps、パケットレート)は問い合わせ時に計算していて、どこにも保存していません。 ですから系列は 1 本も消費しません。

インターフェース 1 本は、それがぶら下がっているノード 1 台より高くつきます。 計画の軸にすべき 数字はこれです。

出荷時の既定 — 60 秒間隔・VictoriaMetrics の保持 12 か月 — での試算を 2 つ挙げます:

フリート 系列数 メトリクスのディスク
ICMP のみのノード 50,000 件 約 100,000 約 53 GB
SNMP ノード 5,000 件 × 収集インターフェース 24 本 約 1,350,000 約 710 GB

2 行目はノード数が 10 分の 1 なのに、ディスクは 13 倍以上です。ここが要点です。ディスクを埋めるのは ノードの数ではなく、インターフェースや表の監視です。 メトリクスの保持期間を 24 か月に延ばすと、 どちらの数字も 2 倍になります。

系列の種類の多さには注意してください。上限のないラベルは、ボリュームを埋めるいちばんの近道です。

これに加えて次のぶんを見込んでください:

  • コンテナイメージ — v0.3.3 での実測。Yagra の 3 イメージで 620 MB、基盤側のイメージがさらに 910 MB(PostgreSQL 424 MB、アップデータが使う docker CLI 291 MB、Redis 58 MB、 VictoriaMetrics 54 MB、VictoriaLogs 42 MB、NATS 41 MB)。ClickHouse を動かす場合はさらに 807 MB。既定のインストールで取得するのは合計 約 2.3 GB です。
  • アップグレードの余裕 — インプレースアップグレードは、ロールバック用に旧イメージを残したまま 新しいイメージ一式を取得します。2 GB の空きを確保してください。
  • 受動イベント — VictoriaLogs の既定保持期間は 30 日、ClickHouse のフローデータは 30 日で 失効します。(90 日という数字は、PostgreSQL に残すアラート紐付きイベント行のほうの既定値で、 ログストアの話ではありません。)
  • リモートポーラー — core に到達できない間、結果をディスクにバッファします。上限 512 MB、 空き容量が 1 GB を切った時点で書き込みを止めます。

保持期間の設定場所は 1 か所ではありません。 Settings ▸ System で設定できるのは、Yagra 自身が 削除するもの — アラート紐付きイベント(90 日)、未マッチのイベント(24 時間)、レポートの実行結果 (90 日)、診断(90 日)、フローデータ(30 日)です。Victoria 系の 2 つのストアは別です。どちらも 実行時に保持期間を変更する API を持たないため、--retentionPeriod フラグは Compose ファイルの中に あり、Settings ▸ System はその値を読み取り専用で表示し、その旨の注記を出します。上の表を動かしている メトリクスの保持期間は、このフラグを編集してコンテナを作り直すことで変えます。

スケールするもの、しないもの

Section titled “スケールするもの、しないもの”

core は 50,000 ノード のフリートに対して実測しています:

実測値
core メモリ(平均) 183 MiB
core メモリ(最大) 245 MiB
core CPU(平均) 1 コアの 11.8%
取り込み遅延 約 1.0 秒

つまり 5 万ノードを抱える core の費用は、数十ノードを抱える core より少し高いだけです。

ですからサイジングの対象は、core ではなくストア側です。VictoriaMetrics の系列数と ClickHouse の フロー量を基準に計画してください。core とポーラーは、ほぼ固定費として扱ってかまいません。

拠点に置くポーラーは、小さくて済みます。以下の数値は実測値になりました。別ホストの core に 接続した、v0.3.3 の拠点ポーラー 2 台で測っています:

実測値 推奨値
メモリ 28 MiB と 34 MiB(常駐) 1 GB
CPU 1 コアの 0.2% 1 vCPU
ディスク 使用 2.0 GB、バッファは空 4 GB

どちらも作業集合は小さく、チェック仕様で 59 本と 68 本でした。ですからこの数値は上限ではなく 下限として読んでください。推奨値がこれよりかなり大きいのは、ポーラーのサイズを実際に決めるのが store-and-forward のバッファだからです。このバッファは、ディスクへ書き出す前に最大 20,000 件の 結果をメモリに持ち、書き出しファイルは上限 512 MB、空き容量 1 GB を下限としてそれ以上は使いません。

ディスクの推奨値は、ポーラーのイメージ(132 MB)に、その上限と下限を足したものです。

ポーラーは、このバッファ以外に消えては困る状態を持ちません。ですからいつでも安全に作り直せます。

コンテナごとのメモリと CPU は、全機能を有効にして動いている v0.3.3 のデプロイ 2 台(どちらも監視 ノード 32 件)に対する docker stats --no-stream の出力です。イメージサイズは、同じホストでの docker images の出力です。

対象ごとの系列数は、同じデプロイで VictoriaMetrics 自身の /api/v1/status/tsdb から取りました。 1 サンプルあたりのバイト数は、vm_data_size_bytes を vm_rows で割ったもので、ストレージと インデックスの両方を含みます。

50,000 ノードの数値は、合成の結果ジェネレータで動かしたフリートに対して測りました。5 分待って 落ち着かせたあと、20 分の窓でサンプリングしています。

リモートポーラーの数値は、拠点側ホスト 2 台での docker stats と、ポーラー自身の /metrics から 取りました。

試算表のディスク量は、実測ではありません。上の計算式から出したものです。推定にはそのつど、その旨を 書いています。