† IPFSを実行しながら学んでいく7 ~ ガベージコレクションを試してみる ~
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の構成ファイル内に記述されています。
ガベージコレクション関連としては、
- 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でのガベージコレクションを試してみました。
実際に運用していく際には、優先度の高いリソースのためにストレージのリソースをあける必要が出てくるかと思われます。