Armadilloフォーラム

tmpfs上で動作しているコンテナ(Prometheus)のファイル出力がエラーとなる。

rikuya-h

2024年11月18日 13時23分

お世話になっております。
長谷部と申します。
https://armadillo.atmark-techno.com/forum/armadillo/23007
上記フォーラムでは回答ありがとうございました。

その後も armadillo G4 にてprometheusを用いた監視環境を試作しております。
現在、あるエラーで悩んでおります。

ABOSのコンテナはtmpfsへ書き込まれる設定との事で...
※記事:https://armadillo.atmark-techno.com/index.php/blog/15349/12098

armadillo G4のprometheus監視環境で収集したデータがボード上のメモリ逼迫に繋がるため
データ保持期間を設けて運用を考えています。
prometheusへオプションとして

--storage.tsdb.retention.time 5m
--storage.tsdb.min-block-duration 1m

上記2点を追加して起動させているのですが
※storage.tsdb.min-block-duration => メモリ上に保持している収集データを1分間隔でローカルストレージに出力
※storage.tsdb.retention.time => ローカルストレージ内のファイルを5分間隔で削除
※間隔時間は実験的に確認するため5分と1分にしています。

tmpfs上で動作させると以下エラーがログ出力されます。
=ログ=

ts=2024-11-18T04:20:27.159Z caller=db.go:1090 level=error component=tsdb msg="compaction failed" err="preallocate: no space left on device"
ts=2024-11-18T04:21:27.186Z caller=db.go:1090 level=error component=tsdb msg="compaction failed" err="preallocate: no space left on device"
ts=2024-11-18T04:22:27.197Z caller=db.go:1090 level=error component=tsdb msg="compaction failed" err="preallocate: no space left on device"

eMMC上で動作させると以下の様に正常動作。
=ログ=

ts=2024-11-18T04:31:28.455Z caller=compact.go:580 level=info component=tsdb msg="write block" mint=1731904191385 maxt=1731904200000 ulid=01JCYRMDJXC06F71N6YQDH2VBP duration=105.811444ms ooo=false
ts=2024-11-18T04:31:28.467Z caller=head.go:1360 level=info component=tsdb msg="Head GC completed" caller=truncateMemory duration=11.189305ms
ts=2024-11-18T04:32:28.498Z caller=compact.go:580 level=info component=tsdb msg="write block" mint=1731904228312 maxt=1731904260000 ulid=01JCYRP85T1475F5BKV48R95BH duration=152.931038ms ooo=false
ts=2024-11-18T04:32:28.514Z caller=head.go:1360 level=info component=tsdb msg="Head GC completed" caller=truncateMemory duration=14.15861ms

=prometheusコンテナ内=

/prometheus/data $ ls
01JCYRMDJXC06F71N6YQDH2VBP  lock
01JCYRP85T1475F5BKV48R95BH  queries.active
chunks_head                 wal
/prometheus/data $

上記エラーはどのように設計すれば打開できますでしょうか?
ご教示頂けると大変助かります。

コメント

アットマークテクノの古賀です。

長谷部さん:
>その後も armadillo G4 にてprometheusを用いた監視環境を試作しております。
>現在、あるエラーで悩んでおります。
>
>ABOSのコンテナはtmpfsへ書き込まれる設定との事で...
>※記事:https://armadillo.atmark-techno.com/index.php/blog/15349/12098
>
>armadillo G4のprometheus監視環境で収集したデータがボード上のメモリ逼迫に繋がるため
>データ保持期間を設けて運用を考えています。
>prometheusへオプションとして

--storage.tsdb.retention.time 5m
--storage.tsdb.min-block-duration 1m

>上記2点を追加して起動させているのですが
>※storage.tsdb.min-block-duration =>メモリ上に保持している収集データを1分間隔でローカルストレージに出力
>※storage.tsdb.retention.time =>ローカルストレージ内のファイルを5分間隔で削除
>※間隔時間は実験的に確認するため5分と1分にしています。
>
>tmpfs上で動作させると以下エラーがログ出力されます。
>=ログ=

ts=2024-11-18T04:20:27.159Z caller=db.go:1090 level=error component=tsdb msg="compaction failed" err="preallocate: no space left on device"
ts=2024-11-18T04:21:27.186Z caller=db.go:1090 level=error component=tsdb msg="compaction failed" err="preallocate: no space left on device"
ts=2024-11-18T04:22:27.197Z caller=db.go:1090 level=error component=tsdb msg="compaction failed" err="preallocate: no space left on device"

>
>eMMC上で動作させると以下の様に正常動作。

prometheus のソースツリーを眺めてみると、上記のエラーは、時系列データベース(tsdb)のセグメントファイルを作成またはサイズ拡張するために fallocate() システムコールを呼び出した時に起きているようですね。
エラーメッセージを出力しているのは、
 tsdb/chunks/chunks.go
で実装されている cutSegmentFile() のようです。
cutSegmentFile() は、fileutil.Prealloca() を介して fallocate() システムコールを呼び出すようです:
 https://github.com/prometheus/prometheus/blob/main/tsdb/fileutil/preall…
 https://github.com/prometheus/prometheus/blob/main/tsdb/fileutil/preall…

>=prometheusコンテナ内=

/prometheus/data $ ls
01JCYRMDJXC06F71N6YQDH2VBP  lock
01JCYRP85T1475F5BKV48R95BH  queries.active
chunks_head                 wal
/prometheus/data $

>
>上記エラーはどのように設計すれば打開できますでしょうか?
>ご教示頂けると大変助かります。

エラーメッセージからすると、fallocate() に対して、コンテナ用の tmpfs 領域の空き容量以上のサイズが渡されている可能性が高そうですね。
試しに、ですが、 --storage.tsdb.retention.size で 10MB などの小さめの値を指定した場合は、どうなるでしょうか?
 https://prometheus.io/docs/prometheus/latest/storage/#right-sizing-rete…
 https://www.robustperception.io/configuring-prometheus-storage-retentio…

なお、prometheus の GitHub リポジトリを見ると、2021年の1月に tmpfs に関する似たような報告があり(※エラーメッセージの内容が、少し違います)、報告者の問題は解決されないまま、lock によりクローズされています:
 https://github.com/prometheus/prometheus/issues/8406
ですので、 --storage.tsdb.retention.size の値をデフォルトより小さくしても、エラーは解消しないかも知れません。

ちなみに、

>armadillo G4のprometheus監視環境で収集したデータがボード上のメモリ逼迫に繋がるため
>データ保持期間を設けて運用を考えています。

とのことでしたが、prometheus で収集して tsdb に格納したデータは、Armadillo を再起動した時に揮発させず保持したいでしょうか?
もしそうであれば、コンテナ設定ファイルに add_volume 行を追加して、/var/app/volums/ 配下のディレクトリをコンテナにマウントしてから tsdb のデータ配置に使ってください:
 https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…
マウント設定したら、コンテナにマウントしたパス(コンテナ内から見えるディレクトリパス)を --storage.tsdb.path オプションで指定すればよいでしょう:
 https://prometheus.io/docs/prometheus/latest/storage/#operational-aspec…

以上、もし参考になりましたら幸いです。