zfs-fuse: 압축 활성화는 효과가 없습니다

zfs-fuse: 압축 활성화는 효과가 없습니다

Debian Wheezy zfs-fuse 파일 시스템에 설치하고 하나의 데이터 세트("저장소/백업")에서 압축 gzip-9를 활성화했습니다. 이 데이터 세트에 압축이 활성화되어 있는지 확인하면 "예"라고 표시됩니다.

$: zfs get compression storage/backup
NAME         PROPERTY     VALUE     SOURCE
storage/backup  compression  gzip-9    local

du -ah그런데 압축이 있든 없든 압축률을 확인해 보면 sfx get compressratio알 수 있습니다.

잘 압축되는 파일(예: 텍스트 파일)을 포함한 모든 파일은 압축되지 않은 파일과 정확히 동일한 디스크 크기를 차지합니다.

$: zfs get compressratio storage/backup
NAME         PROPERTY       VALUE  SOURCE
stor/backup  compressratio  1.00x  -

왜 이런 일이 발생합니까?

zfs get all데이터 세트에 대한 몇 가지 정보는 다음과 같습니다.

compressratio         1.00x                  -
mounted               yes                    -
quota                 none                   default
reservation           none                   default
recordsize            128K                   default
mountpoint            /storage/backup        default
sharenfs              off                    default
checksum              on                     default
compression           gzip-9                 local
atime                 on                     default
devices               on                     default

답변1

zfs-fuse제한된 IO가 발생하면서 데이터가 30초마다 업데이트되는 것처럼 보이지만 compressratio, 백그라운드 IO 또는 매우 큰 파일로 인해 데이터 업데이트가 더 빠르게 발생할 수 있으므로 업데이트를 트리거하는 또 다른 요인이 있습니다.

좀 넣어봤어기능 테스트의 핵심 사항. 1.00x로 부팅된 깨끗한(파일 없음) 파일 시스템이 필요합니다.

첫 번째 테스트에서 스크립트가 영원히 일시 중지되면 압축 카운터가 업데이트되지 않으며 설치에 문제가 있는 것입니다.

Debian wheezy 머신에서 스크립트를 실행합니다.

$ uname -a
Linux zfs-fuse 3.2.0-4-686-pae #1 SMP Debian 3.2.54-2 i686 GNU/Linux

결과는 다음과 같습니다.

$ test_compression compress
Testing [compress]

Testing size [4096]
Waited 0 seconds for [compressratio_is_one]
4096 bytes made up of 1*4096 blocks
Waited 20 seconds for [compresstario_is_not_one]
1.12x

Testing size [16384]
Waited 30 seconds for [compressratio_is_one]
16384 bytes made up of 1*16384 blocks
Waited 30 seconds for [compresstario_is_not_one]
1.53x

Testing size [1048576]
Waited 30 seconds for [compressratio_is_one]
1048576 bytes made up of 1*131072 blocks
Waited 30 seconds for [compresstario_is_not_one]
31.44x

Testing size [33161216]
Waited 30 seconds for [compressratio_is_one]
33161216 bytes made up of 255*131072 blocks
Waited 0 seconds for [compresstario_is_not_one]
202.31x

카운터 업데이트를 트리거할 수 있는 집중적인 작업을 백그라운드에서 수행하여 일반적으로 이를 절반 정도 줄일 수 있습니다.

백그라운드에서

$ while true; do touch somefile; rm somefile; done

그런 다음 다시 테스트하십시오.

$ test_compression compress
Testing [compress]

Testing size [4096]
Waited 0 seconds for [compressratio_is_one]
4096 bytes made up of 1*4096 blocks
Waited 5 seconds for [compresstario_is_not_one]
1.11x

Testing size [16384]
Waited 17 seconds for [compressratio_is_one]
16384 bytes made up of 1*16384 blocks
Waited 17 seconds for [compresstario_is_not_one]
1.50x

Testing size [1048576]
Waited 16 seconds for [compressratio_is_one]
1048576 bytes made up of 1*131072 blocks
Waited 10 seconds for [compresstario_is_not_one]
29.73x

Testing size [33161216]
Waited 0 seconds for [compressratio_is_one]
33161216 bytes made up of 244*131072 blocks
Waited 0 seconds for [compresstario_is_not_one]
201.35x

FreeBSD에서는 대략 5초마다 업데이트된다는 점에 주목할 가치가 있습니다.

$ test_compression giggidy/compress
Testing [giggidy/compress]

Testing size [4096]
Waited 0 seconds for [compressratio_is_one]
4096 bytes made up of 1*4096 blocks
Waited 4 seconds for [compresstario_is_not_one]
1.21x

Testing size [16384]
Waited 5 seconds for [compressratio_is_one]
16384 bytes made up of 1*16384 blocks
Waited 5 seconds for [compresstario_is_not_one]
1.91x

Testing size [1048576]
Waited 5 seconds for [compressratio_is_one]
1048576 bytes made up of 1*131072 blocks
Waited 5 seconds for [compresstario_is_not_one]
39.33x

Testing size [33161216]
Waited 5 seconds for [compressratio_is_one]
33161216 bytes made up of 1*131072 blocks
Waited 4 seconds for [compresstario_is_not_one]
114.25x

상자를 얻을 수 있게 되면 Solaris 기반 예제를 추가하겠습니다.

관련 정보