btrfsの巨大なメタデータの割り当て
この質問は、パーティションのデータサイズの大きさと、新しいバージョンのLinuxカーネル4.4を除いて、 btrfs:巨大なメタデータが割り当てられています とほぼ同じです。
Btrfsパーティションのフルイメージバックアップを作成しようとしています。 btrfs fil usage
は以下を示しています:
Overall:
Device size: 4.50GiB
Device allocated: 3.17GiB
Device unallocated: 1.33GiB
Device missing: 0.00B
Used: 1.70GiB
Free (estimated): 1.58GiB (min: 936.52MiB)
Data ratio: 1.00
Metadata ratio: 2.00
Global reserve: 512.00MiB (used: 0.00B)
Data,single: Size:1.85GiB, Used:1.61GiB
/dev/vda2 1.85GiB
Metadata,DUP: Size:640.00MiB, Used:49.38MiB
/dev/vda2 1.25GiB
System,DUP: Size:32.00MiB, Used:16.00KiB
/dev/vda2 64.00MiB
実際のメタデータサイズは100MiB未満であるのに対し、メタデータは最大1.25GiBを占めることがわかりました。ご覧のとおり、ディスクボリューム全体は4.5GiBです。このようなスペースの浪費は受け入れられません。
btrfs balance start -m
とbtrfs balance start -musage=x
を実行しようとしましたが、xは0から50まで変化しますが、どれも役に立ちませんでした。
Btrfsにメタデータの割り当てサイズを強制的に減らす方法はありますか?または、実際に使用したサイズに近いbtrfsパーティションのサイズを変更する方法はありますか?
最後に私はこれを BTRFS wiki で見つけました:
メタデータブロックグループの一般的なサイズは、256MiB(50GiBより小さいファイルシステム)と1GiB(50GiBより大きい)で、データの場合は1GiBです。システムブロックグループのサイズは数メガバイトです。
そのため、メタデータは512MiB(=メタデータのデフォルトRAID1の場合は256MiB * 2)を使用しています。ただし、メタデータのチャンクサイズはユーザーが指定できないようです。 このメール を参照してください。
このような巨大なチャンクサイズ(256MiB)をデフォルトにする目的がわかりません。最近の大容量のストレージを考えると、メタデータの断片化を減らすためかもしれません。とにかく現在、それに対処する方法はありません。したがって、非常に小さなパーティションが必要な場合は、btrfsを忘れてください。
この質問に関するいくつかの追加の話:
ルートパーティションとしてbtrfsを使用するテンプレートVMのディスクダンプを作成しようとしたとき、この質問の状況が発生しました。未割り当ての部分は、コンプレッサーを通過した後はサイズに追加されませんが、生の画像サイズが増加するため、不便な場合があります。一方、未使用のメタデータスペースは、非常に少量(5GiB未満)では依然として大きな無駄です。
結局、私はrootfsにext4を使用する必要があり、btrfsが提供するすべての凝った機能を除外します(そしておそらくリスクもあります)。いつの日かbtrfsが十分に成熟し、チャンクサイズの制御が公開されることを願っています。次に、それを使用してダンプを再度作成してみます。
PS:混合チャンクは、ボリュームが小さい場合は不完全な方法であり、完全なダンプを作成するのではなく、btrfsバックアップを使用します。前者には、データチャンクサイズを調整できない場合に空き領域が無駄になるという問題や、その他の潜在的な問題があります。後者は、ダンプからa VMをビルドするために追加のスペースとステップを必要とし、btrfsサポートのない環境で実行しないでください。
あなたはあなたの質問に解決策を書きます、あなたがあなた自身に課す限界はかなり低いです:
Btrfs balance start-mとbtrfsbalance start -musage = xを実行しようとしましたが、xは0から50まで変化しますが、どれも役に立ちませんでした。
50は、100-50 = 50%の未使用スペース(無駄)のチャンクを許可していることを示します。 60を入力すると、無駄なスペースが最大で40%のwnatチャンクのみが表示されるため、空きスペースが多いチャンクはマージされて解放されます。
大きい数値を使用するだけです。その数値は、各チャンクで使用する必要があるチャンクスペースの割合を示します。チャンクの使用率がその割合より少ない場合は、他のチャンクとマージされて新しいチャンクになり、チャンクが解放されます。
目的の結果が得られるまで、55、60、65、70 ... 85、90、95、100で試してみてください。
または、十分な時間があれば、100を直接使用するだけです。そうすれば、すべてのチャンクが再配置され、使用するチャンクができるだけ少なくなります。
100を入力しても、各チャンク(1未満の各チャンクも)が100%満たされることを意味するわけではありませんが、1つを除くすべてのチャンクが可能な限り最大に満たされることを意味するため、大量のデータ/メタデータを移動するコスト。そのため、ユーザーが無駄なスペースに満足するまで、できるだけ少ないデータ/メタデータを移動するために、すべての人が小さな増分で大きな値を試してみることをお勧めします。
いつの日かドキュメントが私のようなユーザー(初心者)にとって、そして(専門家)上級者だけでなく、より明確になることを願っています...データのチャンクサイズが1GiBであることを発見するのに時間がかかりました...私は小さなものを書いていました(<1KiB)ファイルを新たにbtrfsレイド1(2つのデバイス)に追加すると、空き領域が2GiB少なくなりました(各デバイスに1つ)...さらにファイルを書き込むため、すべてのデータが失われると思っていましたフリーサイズは変更されませんでした...すべてが1つのチャンク全体(実際には2つのチャンク、各デバイスに1つ)に書き込まれていました... 1GiBの単位で事前割り当てがあることがわかるまで。
1つのチャンクが満たされていない場合でも、1GiBのスペースが必要です。したがって、75%が満たされた2つのチャンクがある場合、1GiBの2つのチャンクの25%、つまり各チャンクで250MiBが無駄になります。したがって、合計500MiBで、RAID 1について説明しているので、両方のデバイスでも同じように発生します。合計で、無駄は4GiBの1GiB(2チャンク* 1GiB * 2デバイス)であり、これは25%の無駄なスペースです。
ただし、値として50を入力しているため、100%-50%= 50%の無駄なスペースを受け入れています。 75を入力すると、100%-75%= 25%になるため、無駄なスペースは25%になります。安藤など。
無駄なスペースを最小限に抑えたい場合は、99や100などの高い値を使用してください。ただし、CoW(コピーオンライト)、SSD/NVMEなどを使用する場合は特に注意が必要です。また、USBフラッシュメモリ/カードなどには特に注意が必要です。
これがあなたや他の人に理解してもらうことを願っています。
注:実際のチャンクがいっぱいになるまでBtrfsに新しいチャンクを使用しないように強制する方法を誰かが知っている場合、それは私が知るのに最適です!手動でバランスをとらないという意味です
まず、BTRFSはメタデータ(およびデータ)を一度に1つのチャンクに割り当てます。各チャンクは1GBです。メタデータのチャンクが割り当てられている場合でも、このチャンクが完全に使用されていることを意味するわけではありません。 BTRFSはメタデータに小さなファイルも保存するため、メタデータの「高」使用に寄与する可能性があることに注意してください。
デフォルトでは、BTRFSはメタデータも複製して、破損した場合にファイルシステムが回復できる可能性を高めます。データは複製されません。
メタデータを単一のプロファイルにリバランスすることでメタデータの使用量を減らすことができますが、ユースケースによっては回復の可能性があります。あなたはそうするようにします:
btrfs balance start -dconvert=single /mountpoint
混合ブロックグループを検索して、BTRFSが個別のメタデータチャンクを割り当てずに、データとメタデータを同じチャンクに格納するようにすることもできます。
また、使用率フィルターを使用してバランスを実行する場合は、使用率がX未満のチャンクのみをバランス調整することにも注意してください。