Btrfs는 최대 압축을 가능하게 합니다.

Btrfs는 최대 압축을 가능하게 합니다.

나는 Btrfs를 가지고 놀았습니다. 내가 달성할 수 있었던 최대 압축 비율은 다음 파일에서 30:1이었습니다.

yes foo | head -c 10G > file

명령줄에서는 zstd파일을 10000:1의 비율로 압축하므로 30:1이 조금 실망스럽습니다.

물론 수동으로 하면 파일이 많이 압축되겠지만 Btrfs가 할 수 있는 최대 압축률은 얼마나 될까요? 어떤 Btrfs 압축 알고리즘이 사용되며 압축이 잘 되는 파일의 모양은 무엇입니까?

(속도는 문제가 되지 않습니다.)

답변1

https://lore.kernel.org/linux-btrfs/[이메일 보호됨]/답변에 더 가까이 다가가 보겠습니다.

압축된 데이터의 경우 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, 두 번째 레이어: 9-17, 세 번째 레이어: 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)

여기에는 운율이나 이유가 없다고 생각하며 1 1 1은 빠르고 기억하기 쉽기 때문에 아마도 그것을 사용할 것입니다.

관련 정보