• 作成:
  • 更新:

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 を参照。

Btrfs - ArchWiki

を読んでサイズが違うディスクだとディスク容量全体が使えないと思い込んだからです. しかしこれはRAID 1に限った話でRAID 0には関係ないという指摘を受けました.

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から引用すると(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

スワップファイルを使いたいという人は気をつけましょう.