† IPFSを実行しながら学んでいく7 ~ ガベージコレクションを試してみる ~

2022.07.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

IPFSでのガベージコレクションは、不要になったと思われるデータを削除することにより、IPFSノードのディスク領域を解放します。 ストレージは有限であるため、新しいリソース用のスペースを確保するためにこれが行われます。

しかし、全てのデータがガベージコレクションの対象になる訳ではありません。 IPFSではピンニングされていないデータが対象になるため、必要なデータはピンニングして保護するようにしないといけませんね。

では実際にガベージコレクションの挙動を試していきます。

やってみる

IPFSは手動で行うガベージコレクションと自動で定期的に行うガベージコレクションがありますので、両方とも試してみましょう。

手動でガベージコレクション

ipfs repo gcコマンドを実行すると手動でガベージコレクションを実施することができます。

$ ipfs repo gc
removed bafkreihshanjznywfxaxc664xcmsnzwqydntrgsxmbnqqjqeeqxecos2w4
removed bafkreigbyivpq6rzmva4hl6n65ztg6u5u3zo2zpmgzaceqxlqtnpi77dq4
removed bafkreiblqtq4qdsdqt2ph7xsap5cp2myiuqftt7xd5crljlgj2prwlkqsa
removed bafkreib6ofpfz3wpht3fnitq5tnkrmcxwkqzqfso75djgcjutauzsfsvce
~~~~

対象のデータがないと

$ ipfs repo gc

のように何も表示はされません。

ipfs addで追加したファイルは自動的にピンニングされるため、ガベージコレクションの対象とはなりません。

$ ipfs add sample-15s.mp4
added QmQkL8yboMWQVtGt56a2gKc4NaUiSTH2hxAkz3RxuEbt3F sample-15s.mp4

$ ipfs pin ls QmQkL8yboMWQVtGt56a2gKc4NaUiSTH2hxAkz3RxuEbt3F
QmQkL8yboMWQVtGt56a2gKc4NaUiSTH2hxAkz3RxuEbt3F recursive

$ ipfs repo gc
// 実施されなかった

他のノードからダウンロードしてきたデータは自動でピンニングされないので、対象となるはず。。。

bafybeicfnbaeigdtklwkrj35r4wtfppix732zromsadvgiu33mowah74yq というCIDのデータを取得してみます。

画像が格納されているフォルダです。

$ ipfs get bafybeicfnbaeigdtklwkrj35r4wtfppix732zromsadvgiu33mowah74yq
Saving file(s) to bafybeicfnbaeigdtklwkrj35r4wtfppix732zromsadvgiu33mowah74yq

$ ipfs refs bafybeicfnbaeigdtklwkrj35r4wtfppix732zromsadvgiu33mowah74yq
bafkreifvallbyfxnedeseuvkkswt5u3hbdb2fexcygbyjqy5a5rzmhrzei

この状態で手動ガベージコレクションを実施してみると、

$ ipfs repo gc
removed bafkreicfnbaeigdtklwkrj35r4wtfppix732zromsadvgiu33mowah74yq
removed bafkreifvallbyfxnedeseuvkkswt5u3hbdb2fexcygbyjqy5a5rzmhrzei

$ ipfs ls bafkreicfnbaeigdtklwkrj35r4wtfppix732zromsadvgiu33mowah74yq
// 何も表示されない

getしたcidとそれに紐づくcidがキャッシュから削除されました。

自動でガベージコレクション

自動で行うには、IPFSデーモン起動時に--enable-gcコマンドフラグを使用します。

$ ipfs daemon --enable-gc

IPFSのガベージコレクター設定

ガベージコレクターの設定ですが、go-ipfsの構成ファイル内に記述されています。

Datastore

ガベージコレクション関連としては、

  • StorageMax
    • ipfsリポジトリのデータストアのサイズのソフト的な上限値で、デフォルトは10GB
    • StorageGCWatermark と共に、ガベージコレクションの実行をトリガーするかどうかを計算するために使用
  • StorageGCWatermark
    • ガベージコレクションが自動的にトリガーされるStorageMax値のパーセンテージで、デフォルトは90%
  • GCPeriod
    • ガベージコレクションを実行する頻度で、デフォルトは1h

です。

この設定は、--enable-gcで有効にしたときのみ反映される設定となっており、ipfs repo gcを使った手動実行では上記の設定を無視します。

※) 例

ソフトリミットを20MBで、90%以上使用していたら実行する。間隔は1h。

$ vi ~/.ipfs/config

{
  "Identity": {
    "PeerID": "12D3KooWRLy8e5YJhga8K8V3vpx2ggw5PJ5UZxzxaEffvGn64cp1",
    "PrivKey": "CAESQOaeePUAVCOa8ACQLKgt6zGd4d7nIFwg+8tD0XrVAGfY5rZDA1TeLpql9Y3DIegbnRHSB+KhiKUvNM5hNxDzza7o="
  },
  "Datastore": {
    "StorageMax": "20MB",
    "StorageGCWatermark": 90,
    "GCPeriod": "1h",
    "Spec": {
      "mounts": [
        {
~~~~~
~~~~~
}

以下のレポジトリの状態で確認してみましょう。

$ ipfs repo stat
NumObjects: 126
RepoSize:   29092541
StorageMax: 20000000
RepoPath:   /Users/mori.ryosuke/.ipfs
Version:    fs-repo@12

RepoSizeがStorageMaxで指定した20MBと、StorageGCWatermarkで指定した90%からガベージコレクションの対象となっているので、 自動的に実施されるはずです.


IPFSでのガベージコレクションを試してみました。

実際に運用していく際には、優先度の高いリソースのためにストレージのリソースをあける必要が出てくるかと思われます。