Btrfs

使用 Btrfs 實現最大壓縮

  • January 12, 2021

我一直在玩 Btrfs。我能夠實現的最大壓縮率為 30:1,並且位於以下文件中:

yes foo | head -c 10G > file

命令行zstd會以 10000:1 的比例壓縮文件,所以我對 30:1 有點失望。

顯然,如果手動完成,文件會壓縮更多,但是 Btrfs 可以做到的最大壓縮比是多少?以及使用了哪種 Btrfs 壓縮算法以及壓縮得很好的文件是什麼樣的?

(速度不是問題)。

https://lore.kernel.org/linux-btrfs/7b4cded9-01fa-4dff-8aaf-fcedc3b27562@gmx.com/讓我們接近答案:

對於壓縮數據,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

第1層壓縮比: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) )、8 9 2 (726:1)、9 2 4 (726:1)、7 8 1 (726:1)、2 9 9 (728:1)、7 7 9 (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), 1 6 6 (742:1), 1 8 1 (742:1), 6 4 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), 7 4 7 (795:1),4 9 6 (800:1), 6 5 8 (802:1), 7 7 5 (806:1), 1 5 6 (811:1), 5 6 9 (821:1), 3 5 2 (853:1), 7 5 8 (854:1)

我看不到其中的模式,而且 1 1 1 既快速又容易記住,所以我可能會使用它。

引用自:https://unix.stackexchange.com/questions/625957