Share
Embed
コピーオンライト型ファイルシステムと ランダム書き込み
以下動画のスライドです
https://youtu.be/2cRETcddWHA
Satoru Takeuchi PRO
November 14, 2026
Transcript
10 slides
-
はなすこと • 過去にコピーオンライト型書き込みのファイルシステムについて紹介した その112 システム強制終了時にファイルシステムの整合性を保つ ~ コピーオンライト編 ~ ◦ •
そこに書いた以下の文言について実機確認 • 細かい書き込みが続くとデータが断片化して性能が落ちがち ◦ • とくにランダム I/Oに弱いHDD 比較対象 ◦ ◦ ext4: ファイル更新時、元々データがあった場所に書き込む Btrfs: ファイル更新時、別の場所に書き込む (コピーオンライトする ) 2 -
実験環境 • • • • OS: Ubuntu 26.04.1 x86_64 kernel:
7.0.0-43-generic ディスク: HDD(SEAGATE ST3000DM001) ファイルシステム: $ mount | grep /mnt/ /dev/sda1 on /mnt/ext4 type ext4 … /dev/sda2 on /mnt/btrfs type btrfs … • ファイル: $ ls -lh /mnt/ext4/test -rw-rw-r-- 1 sat sat 1.0G Nov 14 20:04 /mnt/ext4/test $ ls -lh /mnt/btrfs/test -rw-rw-r-- 1 sat sat 1.0G Nov 14 20:06 /mnt/btrfs/test 3 -
ファイルの連続性とスループット性能 • /mnt/<ファイルシステムタイプ>/testはブロックデバイス内で連続 $ xfs_io -c fiemap /mnt/ext4/test /mnt/ext4/test: 0:
[0..507903]: 278528..786431 1: [507904..1015807]: 802816..1310719 2: [1015808..1523711]: 1327104..1835007 3: [1523712..2031615]: 1851392..2359295 4: [2031616..2097151]: 2375680..2441215 $ xfs_io -c fiemap /mnt/btrfs/test /mnt/btrfs/test: 0: [0..2097151]: 4253696..6350847 • シーケンシャル読み出しのスループットはほぼ同じ # echo 3 >/proc/sys/vm/drop_caches … $ dd if=/mnt/ext4/test of=/dev/null … 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 7.86796 s, 136 MB/s $ dd if=/mnt/btrfs/test of=/dev/null … 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 7.95307 s, 135 MB/s 4 -
2つのファイルに細かいランダム書き込み • 4KiBのランダム書き込みを合計64MiB実施 ◦ 1回書き込むごとにデータをディスクに同期させる $ fio --name=test --filename=/mnt/ext4/test --rw=randwrite
--bs=4k --size=64m --ioengine=sync --fsync=1 … $ fio --name=test --filename=/mnt/btrfs/test --rw=randwrite --bs=4k --size=64m --ioengine=sync --fsync=1 … 5 -
2つのファイルに細かいランダム書き込み • 4KiBのランダム書き込みを合計64MiB実施 ◦ 1回書き込むごとにデータをディスクに同期させる $ fio --name=test --filename=/mnt/ext4/test --rw=randwrite
--bs=4k --size=64m --ioengine=sync --fsync=1 … $ fio --name=test --filename=/mnt/btrfs/test --rw=randwrite --bs=4k --size=64m --ioengine=sync --fsync=1 … • この後それぞれのファイルをシーケンシャル読み出しするとどうなるか? 6 -
ext4の場合 • in-place書き込みなのでデータは依然連続 $ xfs_io -c fiemap /mnt/ext4/test /mnt/ext4/test: 0:
[0..507903]: 278528..786431 1: [507904..1015807]: 802816..1310719 2: [1015808..1523711]: 1327104..1835007 3: [1523712..2031615]: 1851392..2359295 4: [2031616..2097151]: 2375680..2441215 • シーケンシャル読み出しのスループットも変わらない $ sudo su root@coffee:/home/sat# echo 3 >/proc/sys/vm/drop_caches … sat@coffee:~$ dd if=/mnt/ext4/test of=/dev/null … 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 7.81697 s, 137 MB/s 7 -
Btrfsの場合 • 書き込むごとにデータが移動し、最終的には16000個以上に断片化 $ xfs_io -c fiemap /mnt/btrfs/test /mnt/btrfs/test: 0:
[0..7]: 6438152..6438159 1: [8..15]: 6439256..6439263 … 16335: [131064..131071]: 6358464..6358471 16336: [131072..2097151]: 4384768..6350847 • シーケンシャル読み出しのスループットも約88%劣化 # echo 3 >/proc/sys/vm/drop_caches … $ dd if=/mnt/btrfs/test of=/dev/null … 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 66.4659 s, 16 MB/s 8 -
注意 • ランダム書き込みの影響でどれだけ性能差が出るかはワークロードによる ◦ ◦ • 今回の実験はかなり極端なケース Btrfsはランダム書き込み時もなるべくデータが連続になるよう工夫されている Btrfsにはコピーオンライトを一部無効化する機能がある ◦
◦ 例: chattr +C /mnt/btrfs/test こうすると圧縮やデータチェックサム機能などが無効化されるなどの影響が出る 9