私はBtrfsで遊んだ。私が達成できる最大圧縮率は、次のファイルで30:1でした。
yes foo | head -c 10G > file
コマンドラインではzstd
ファイルを10000:1の割合で圧縮するので、30:1は少し残念です。
もちろん、手動で行うとファイルがたくさん圧縮されますが、Btrfsができる最大圧縮率はどのくらいでしょうか?どのBtrfs圧縮アルゴリズムが使用され、圧縮されたファイルの外観は何ですか?
(速度は問題になりません。)
答え1
https://lore.kernel.org/linux-btrfs/[Eメール保護]/答えに近づいてみましょう。
圧縮データの場合、btrfsにはデータ範囲のサイズ制限(128K)があります。この数字は、追加の解凍とCoWed範囲の圧縮率のバランスをとるためのものです。
一方、btrfs(すべてのfs)の最小ブロックサイズはx86_64の場合は4Kです。
したがって、得られる上限は128K / 4K = 32です。
回避策は、複数の圧縮されたbtrfsesを一緒にスタックすることです。
#!/bin/bash
lvl1=$1
lvl2=$2
lvl3=$3
# Die on first error
set -e
rm -f btrfs-lvl1.img
# make level 1
truncate -s 1T btrfs-lvl1.img
mkfs.btrfs btrfs-lvl1.img
mkdir -p btrfs-lvl1
sudo mount -o compress=zstd:$lvl1 btrfs-lvl1.img btrfs-lvl1
sudo chown $(whoami) btrfs-lvl1
# make level 2
truncate -s 1T btrfs-lvl1/btrfs-lvl2.img
mkfs.btrfs btrfs-lvl1/btrfs-lvl2.img
mkdir -p btrfs-lvl2
sudo mount -o compress=zstd:$lvl2 btrfs-lvl1/btrfs-lvl2.img btrfs-lvl2
sudo chown $(whoami) btrfs-lvl2
# make level 3
truncate -s 1T btrfs-lvl2/btrfs-lvl3.img
mkfs.btrfs btrfs-lvl2/btrfs-lvl3.img
mkdir -p btrfs-lvl3
sudo mount -o compress=zstd:$lvl3 btrfs-lvl2/btrfs-lvl3.img btrfs-lvl3
sudo chown $(whoami) btrfs-lvl3
# Now use btrfs-lvl3/ for highly compressible data
head -c 10G /dev/zero > btrfs-lvl3/zero
du btrfs-lvl2/btrfs-lvl3.img btrfs-lvl1/btrfs-lvl2.img btrfs-lvl1.img
# Unmount (order is important)
sudo umount btrfs-lvl3 btrfs-lvl2 btrfs-lvl1
最初の層の圧縮率:24-33、2番目の層:9-17、3番目の層:0.7-1.8。最大総圧縮比は854:1です。
これはレイヤーごとに比率が悪くなり、レイヤー3では一部の値のサイズも増加します(比率< 1)。
lvl1-3の圧縮レベル1-9に対して上記のスクリプトを実行すると、次の値がlvl1-3に適した値であることがわかります(この値は実行ごとにわずかに異なります):1 1 1(713:1)、9 8 5(713:1)、7 3 6(715:1)、4 4 8(716:1)、1 1 2(720:1)、2 1 4(720:1)、5 6 7(720:1) ))、4 4 1(722:1)、1 8 3(722:1)、2 7 5(723:1)、7 8 9(723:1)、1 5 1(724:1)、1 6 8(724:1))、892(726:1)、924(726:1)、781(726:1)、299(728:1)、7779(728:1))、9 9 4(731: 1)、2 6 6(732:1)、1 6 3(733:1)、7 5 5(734:1)、3 4 5(735:1)、2 5 1(736:1)、3・6・2(738:1)、7・8・6(738:1)、16・6(742:1)、181(742:1)、64・7(742:1)、9 8 9(743 :1)、9 5 2(744:1)、1 3 5(746:1)、8 3 5(747:1)、4 1 5(751:1)、8 6 2(755:1)、5 9 6(755:1)、9 8 6(763:1)、8 1 5(765:1)、2 9 2(765:1)、1 8 5(772:1)、7 6 3(775) :1)、1 9 6(781:1)、7 7 6(787:1)、8 9 8(788:1)、3 9 2(790:1)、4 2 8(792:1)、747 (795:1)、496(800:1)、658(802:1)、7775(806:1)、156(811:1)、5 6 9(821:1)、3 5 2(853:1) )、7 5 8(854:1)
ここでは韻や理由がないと思います。