BtrfsのマルチプルデバイスがsingleだとJBODになってデータが分散されないのでRAID 0に切り替えました
追記(2021-01-21): singleに戻しました
singleに戻しました.
データが増えた後,
実際にはデバイス空き容量があるにも関わらず,
no space left on device
と表示が出てエラーになってしまいました.
Btrfsのサイトなどを見たり, Stack Overflowを見たりすると, RAID 0だと全ての領域を使い切れるとは限らないと書かれているようです.
使える場合もあるようですが…
もしかしたら定期的にbalance
を実行すれば問題ないのかもしれませんが,
あんまり悩まされたくないのでsingleに戻しました.
sudo btrfs -v balance start -dconvert=single,soft /
元々NVMe SSDはそんなに遅くないので気にしないことにします. 本当にIOのパフォーマンスを気にするなら同じ容量でちゃんと組んでいくことにします.
JBODだとデータが分散されない
Alienware m17に買い換えてGentoo LinuxをBtrfs on dm-cryptでインストールしてNVIDIAのGPUを有効にして起動しました - ncaq では
mkfs.btrfs -L gentoo -d single /dev/mapper/gentoo-0 /dev/mapper/gentoo-1
でJBODでディスクを作りましたが, これには問題があると感じるようになりました.
問題はbtrfs filesystem usage
を見ればわかって,
% sudo btrfs filesystem usage /
Overall:
Device size: 742.31GiB
Device allocated: 138.02GiB
Device unallocated: 604.29GiB
Device missing: 0.00B
Used: 124.13GiB
Free (estimated): 615.02GiB (min: 312.87GiB)
Data ratio: 1.00
Metadata ratio: 2.00
Global reserve: 184.22MiB (used: 0.00B)
Data,single: Size:132.01GiB, Used:121.28GiB
/dev/mapper/nvme0n1p2 132.01GiB
Metadata,RAID1: Size:3.00GiB, Used:1.42GiB
/dev/mapper/nvme0n1p2 3.00GiB
/dev/mapper/nvme1n1p7 3.00GiB
System,RAID1: Size:8.00MiB, Used:48.00KiB
/dev/mapper/nvme0n1p2 8.00MiB
/dev/mapper/nvme1n1p7 8.00MiB
Unallocated:
/dev/mapper/nvme0n1p2 340.92GiB
/dev/mapper/nvme1n1p7 263.37GiB
この様にデータが1つのディスクにしか作られてません. 線形に繋いでいったので当然と言えば当然なのですが.
これでは読み込み時に2つのディスクが使われないからRAID 0に比べて低速ですね.
どうしてdataにsingleを選んだのかと言うと,
Btrfs はディスクに分散してブロックペアを配置するのにラウンドロビン方式を使っています。Linux 3.0 から, ブロックペアを分散する際に大きなディスクを優先するように quasi-round-robin 方式が使われています。これによって複数のディスクからディスクセットが出来ているときに raid0 や raid1 でほとんど (もしくは全て) の領域を効率的に利用することが可能になっています。例えば、1台の 1TB のディスクと2台の 500GB のディスクからなるセットで data=raid1 を使用すると 1TB のディスクには全てのブロックのコピーが、500GB のそれぞれのディスクにはブロックが交互に (ラウンドロビンで) 配置されます。完全な利用効率が実現されます。1TB のディスクと 750GB のディスク、500GB のディスクからなるセットでも同じことが行われますが、ファイルシステムは 750GB のディスクの 250GB が利用できないことを報告します。いつでも全ての領域を活用できるようにするには (最後に上げた例でも)、data=single を使って下さい (data=single は raid コントローラによって定義される JBOD と同じです)。詳しくは BTRFS FAQ を参照。
を読んでサイズが違うディスクだとディスク容量全体が使えないと思い込んだからです. しかしこれはRAID 1に限った話でRAID 0には関係ないという指摘を受けました.
結構興味あったので全部読みましたー(以下補足)
— リッキー (@rikki_312) 2019年3月21日
・CBCには攻撃手法があり、その後出た新モードのうちの1つがXTS、改ざんに弱めだけどbtrfsは検知してくれる(英語版ウィキペより)
・Btrfsなら異なるサイズでもdata=raid0できると思います
・カーネルでCONFIG_FONTS=Y, FONT_TER16x32=Yするのは如何
Btrfsはquasi-round-robinを採用したことと、raid0はstripe数が1〜Nで構築可となったため、パフォーマンスは置いておいて、使えるはずです……現にうちのファイルサーバーは、2.5TBx2+2TBx2でRAID10組んでますが全領域使えてます……ぜひトライしてみてほしいところです……
— リッキー (@rikki_312) 2019年3月27日
RAID 0に切り替えました
というわけでとりあえず挑戦してみることにしました.
Btrfsは素晴らしく, なんとフォーマットした後でもRAIDレベルを変更することが出来ます.
Using Btrfs with Multiple Devices - btrfs Wiki のConversionを見て変更してみましょう.
Minimal Installation CDで起動してmountして,
# time btrfs balance start -dconvert=raid0 -mconvert=raid1 /mnt/gentoo
Done, had to relocate 137 out of 137 chunks
real 6m30.603s
user 0m0.000s
sys 2m43.887s
でdataをraid0にしました.
メタデータは大事なのでraid1のままです, データ量も多くないですし多分問題ないでしょう.
データのほぼ半分を移し替えるので半日ぐらいからるかなと覚悟して夜実行したのですが, たったの6分で終わったので肩透かしでしたね…
それで実際データを使用できる量がどう変化したのか.
single状態の時は
% 2019-03-27T21:31:28 ncaq@indigo/pts/1(0) ~/GoogleDrive
% sudo btrfs filesystem show
Label: 'gentoo' uuid: a0bb3fae-c511-454b-92d9-5ea5c3c4558d
Total devices 2 FS bytes used 122.71GiB
devid 1 size 475.94GiB used 135.02GiB path /dev/mapper/nvme0n1p2
devid 2 size 266.37GiB used 3.01GiB path /dev/mapper/nvme1n1p7
% 2019-03-27T21:31:35 ncaq@indigo/pts/1(0) ~/GoogleDrive
% sudo btrfs filesystem df /
Data, single: total=132.01GiB, used=121.28GiB
System, RAID1: total=8.00MiB, used=48.00KiB
Metadata, RAID1: total=3.00GiB, used=1.42GiB
GlobalReserve, single: total=184.22MiB, used=0.00B
% 2019-03-27T21:31:45 ncaq@indigo/pts/1(0) ~/GoogleDrive
% sudo btrfs filesystem usage /
Overall:
Device size: 742.31GiB
Device allocated: 138.02GiB
Device unallocated: 604.29GiB
Device missing: 0.00B
Used: 124.13GiB
Free (estimated): 615.02GiB (min: 312.87GiB)
Data ratio: 1.00
Metadata ratio: 2.00
Global reserve: 184.22MiB (used: 0.00B)
Data,single: Size:132.01GiB, Used:121.28GiB
/dev/mapper/nvme0n1p2 132.01GiB
Metadata,RAID1: Size:3.00GiB, Used:1.42GiB
/dev/mapper/nvme0n1p2 3.00GiB
/dev/mapper/nvme1n1p7 3.00GiB
System,RAID1: Size:8.00MiB, Used:48.00KiB
/dev/mapper/nvme0n1p2 8.00MiB
/dev/mapper/nvme1n1p7 8.00MiB
Unallocated:
/dev/mapper/nvme0n1p2 340.92GiB
/dev/mapper/nvme1n1p7 263.37GiB
でraid1に変えたら
% 2019-03-27T21:52:54 ncaq@indigo/pts/2(0) ~/GoogleDrive
% sudo btrfs filesystem show
Label: 'gentoo' uuid: a0bb3fae-c511-454b-92d9-5ea5c3c4558d
Total devices 2 FS bytes used 122.75GiB
devid 1 size 475.94GiB used 63.03GiB path /dev/mapper/nvme1n1p2
devid 2 size 266.37GiB used 63.03GiB path /dev/mapper/nvme0n1p7
% 2019-03-27T21:53:09 ncaq@indigo/pts/2(0) ~/GoogleDrive
% sudo btrfs filesystem df /
Data, RAID0: total=122.00GiB, used=121.30GiB
System, RAID1: total=32.00MiB, used=16.00KiB
Metadata, RAID1: total=2.00GiB, used=1.45GiB
GlobalReserve, single: total=206.72MiB, used=0.00B
% 2019-03-27T21:53:23 ncaq@indigo/pts/2(0) ~/GoogleDrive
% sudo btrfs filesystem usage /
Overall:
Device size: 742.31GiB
Device allocated: 126.06GiB
Device unallocated: 616.25GiB
Device missing: 0.00B
Used: 124.22GiB
Free (estimated): 616.92GiB (min: 308.80GiB)
Data ratio: 1.00
Metadata ratio: 2.00
Global reserve: 206.73MiB (used: 0.00B)
Data,RAID0: Size:122.00GiB, Used:121.32GiB
/dev/mapper/nvme0n1p7 61.00GiB
/dev/mapper/nvme1n1p2 61.00GiB
Metadata,RAID1: Size:2.00GiB, Used:1.45GiB
/dev/mapper/nvme0n1p7 2.00GiB
/dev/mapper/nvme1n1p2 2.00GiB
System,RAID1: Size:32.00MiB, Used:16.00KiB
/dev/mapper/nvme0n1p7 32.00MiB
/dev/mapper/nvme1n1p2 32.00MiB
Unallocated:
/dev/mapper/nvme0n1p7 203.34GiB
/dev/mapper/nvme1n1p2 412.91GiB
になったのでraid1にしてもデバイスのサイズは全く変わりません. 良かったですね.
本当に早くなったのかはベンチマーク取ってないから知りません. そこまでやる気がない.
というか
btrfs-thin-book/usage.md at master · satoru-takeuchi/btrfs-thin-book
によるとmkfs.btrfs
時にオプションを指定しなければデータはデフォルトでraid0が選択されるようですね.
余計なことをしなければ良かった.
RAID 1にするとswapfileは動きません
再起動して気がついたのですがswapfileが動きません.
man 5 btrfs によれば、
— らりお・ザ・何らかの🈗然㊌㋞㋰㋷㋓ (Mastodon に引っ越しました) (@lo48576) 2019年3月27日
* filesystem - must be only single device
* swapfile - the containing subvolume cannot be snapshotted
* swapfile - must be preallocated
* swapfile - must be nodatacow (ie. also nodatasum)
* swapfile - must not be compressed
とのことで
もうご存知かもしれませんが……
— リッキー (@rikki_312) 2019年3月27日
・btrfs balance status /mountpointhttps://t.co/KjlQzHNz4l
・Swapfile support (Limitation)https://t.co/sMOGFlLxRY
manから引用すると(wikiが更新されてないからリンク貼る先が見つからない)
SWAPFILE SUPPORT
The swapfile is supported since kernel 5.0. Use swapon(8) to activate the swapfile. There are some limitations of the implementation in btrfs and linux swap subystem:
- filesystem - must be only single device
- swapfile - the containing subvolume cannot be snapshotted
- swapfile - must be preallocated
- swapfile - must be nodatacow (ie. also nodatasum)
- swapfile - must not be compressed
The limitations come namely from the COW-based design and mapping layer of blocks that allows the advanced features like relocation and multi-device filesystems. However, the swap subsystem expects simpler mapping and no background changes of the file blocks once they’ve been attached to swap.
With active swapfiles, the following whole-filesystem operations will skip swapfile extents or may fail:
- balance - block groups with swapfile extents are skipped and reported, the rest will be processed normally
- resize grow - unaffected
- resize shrink
works as long as the extents are outside of the shrunk range
- device add - a new device does not interfere with existing swapfile and this operation will work, though no new swapfile can be activated afterwards
- device delete - if the device has been added as above, it can be also deleted
device replace - dtto
When there are no active swapfiles and a whole-filesystem exclusive operation is running (ie. balance, device delete, shrink), the swapfiles cannot be temporarily activated. The operation must finish first.
# truncate -s 0 swapfile # chattr +C swapfile # fallocate -l 2G swapfile # chmod 0600 swapfile # mkswap swapfile # swapon swapfile
(というかこのコード例だと圧縮しないというオプションをchattr
で付けてないけど良いんだろうか)
というわけで少なくともLinux 5.0ではBtrfsのswapfileはシングルデバイスに置かないと使えないようです. chattrでこのファイルはシングルに置いてとか指示することも調べましたが出来ないようです. 残念.
将来的にサポートされる可能性はあるかもしれませんが今の所その動きはキャッチしてないですね.
まあこのRAID 0するAlienware m17は論理スレッド数12でメモリ32GB積んでいるので, スワップが一切無くても問題が起きること無いと思います. なのでスワップは諦めることにします.
一応zramぐらいは有効にしておくことにしますが. zram - Gentoo Wiki
スワップファイルを使いたいという人は気をつけましょう.