スニペット
バックグラウンドで10秒ごとにコンテナのAvailable領域のbyte数をmemory-available.txtへ1行ずつ追記する。
nohup watch --interval 10 "incus query /1.0/metrics | sed -n 's/^incus_memory_MemAvailable_bytes{.*}\ \([0-9\.]\+\)e+\([0-9]\+\)/\1 * 10^\2/p' | bc | cut -d. -f1 >> memory-available.txt" &
出力例
$ tail -F memory-available.txt 7936969952 7936969952 7936969952 7936969952 7936969952 7936969952 7936969952 7936900320 7936900320 7936900320 7936900320 7936900320
アイデア
Incusはメトリクスデータを取得するためのAPIエンドポイントを持っている。 これはPrometheusが読み取るように設計されていて、Incus公式のドキュメント通りにちゃんと構築すればメトリクスデータを蓄積できるのだろう。 ただ、Prometheusや可視化のためのGrafanaを構築運用するのもそれなりの人的コストが掛かる。 長期的な運用ではなく、実験のために1日未満で落としてしまうようなコンテナのリソース使用量を把握するのには過剰だ。 そこで、この記事では簡素な方法でIncus上のコンテナのRAM使用量をざっくり把握するアイデアのメモを残しておく。
まず初めに、Incusが提供するメトリクスデータはCLIでも確認できる。 次の公式ドキュメントに書かれているように、以下のコマンドで情報が得られる。
incus query /1.0/metrics
How to monitor metrics - Incus documentation
このコマンドで得られるメトリクスデータは非常に多く、コンテナごとのリソース使用量までわかる。
メモリに関してはfreeコマンドで得られる粒度の情報まで取得できる。
ということは、Totalの値からAvailableの値を減算すればざっくりRAMの使用量が分かる。
出力を抜き出すとTotalは次のように書かれていた。
ここではdebian13testは検証のために立ち上げたDebianのコンテナの名前である。
# HELP incus_memory_MemTotal_bytes The amount of used memory.
# TYPE incus_memory_MemTotal_bytes gauge
incus_memory_MemTotal_bytes{name="debian13test",project="default",type="container"} 7.95822e+09
指数表記になっていて分かりづらいが、約7,590 MiB使えることが分かる。
7.95822 * 10 ^ 9 [B] = 7,958,220,000 [B] ≈ 7,590 [MiB]
同様にAvailableの値を抜き出すと以下のように出力されていた。
# HELP incus_memory_MemAvailable_bytes The amount of available memory.
# TYPE incus_memory_MemAvailable_bytes gauge
incus_memory_MemAvailable_bytes{name="debian13test",project="default",type="container"} 7.93690032e+09
同じように分かりやすい単位に直すとAvailableは約7,569 MiBだと分かる。
7.93690032 * 10 ^ 9 [B] = 7,936,900,320 [B] ≈ 7,569 [MiB]
減算して約 20 MiB使っていると言える。
Total - Available = 7,958,220,000 [B] - 7,936,900,320 [B] = 21,319,680 [B] ≈ 20 [MiB]
Total領域の方は基本的にあまり変化しないから、Available領域の変化だけを記録しておけばRAM使用量の簡単なモニタリングができる。 ここで、なるべく高頻度で値を取得したいが先の公式ドキュメントに8秒間結果がキャッシュされると書かれている。
they are cached for 8 seconds.
だからキャッシュが切れる10秒間隔でwatchする。
最後に、モニタリング結果を他のツールで利用するための障壁として指数表記の問題がある。 より単純な整数値として保存しておきたい。 この変換にはsedとbcを使っている。 sedで「e+」の表記を「* 10 ^」という表記に変えてしまい、後続のbcコマンドで小数点計算を行っている。 bcコマンドが使えない環境ではawkなどが代替案になるかもしれない。 更に後続のcutは「.00000」のような無駄な小数点以下の文字を消すために入れている。 bcコマンドだけで処理しようとすると、計算の途中で変に丸められてしまう可能性があるからわざわざcutで処理している。