ZFS에서 파일 블록에 동일한 데이터를 쓰면 스냅샷에서 공간을 차지합니까?

ZFS에서 파일 블록에 동일한 데이터를 쓰면 스냅샷에서 공간을 차지합니까?

16M 파일이 있습니다.

이를 포함하는 ZFS 파일 시스템의 스냅샷을 찍었습니다.

동일한 데이터로 파일을 덮어쓰는 경우 ZFS는 파일에 있는 모든 블록의 복사본 두 개를 저장해야 합니까?

답변1

예, 파일 세트에서 스냅샷을 생성하면 ZFS는 동일한 파일에 추가 공간을 할당합니다.

먼저 빈 파일 세트를 만들고 복사할 파일을 준비하겠습니다. 간단한 이유로,압축종료되고 풀은 아무 것도 없이 단일 디스크에 생성됩니다.레즈또는거울.

[root@localhost ~]# dd if=/dev/urandom of=/tmp/testfile bs=16M count=1
1+0 records in
1+0 records out
16777216 bytes (17 MB) copied, 0.113345 s, 148 MB/s    


[root@localhost ~]# zpool create tank sdd
[root@localhost ~]# zfs create tank/test

디스크에서 사용된 공간은 를 통해 확인할 수 있습니다 zpool list.

[root@localhost]# zpool list tank
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank    9.94G   182K  9.94G         -     0%     0%  1.00x  ONLINE  -

이제 파일을 ZFS 파일 세트에 복사하고, 스냅샷을 만들고, 사용된 공간을 확인하세요.

[root@localhost ~]# /bin/cp /tmp/testfile /tank/test/

[root@localhost ~]# zfs list -t all -r tank/test
NAME        USED  AVAIL  REFER  MOUNTPOINT
tank/test  16.0M  9.61G  16.0M  /tank/test

[root@localhost ~]# zfs snapshot tank/test@1
[root@localhost ~]# zfs list -t all -r tank/test
NAME          USED  AVAIL  REFER  MOUNTPOINT
tank/test    16.0M  9.61G  16.0M  /tank/test
tank/test@1     0B      -  16.0M  -

좋습니다. 동일한 파일을 ZFS 파일 세트의 동일한 위치에 다시 복사하고 사용된 공간을 다시 살펴보세요.

[root@localhost ~]# /bin/cp -f /tmp/testfile /tank/test/
[root@localhost ~]# zfs list -t all -r tank/test
NAME          USED  AVAIL  REFER  MOUNTPOINT
tank/test    32.0M  9.60G  16.0M  /tank/test
tank/test@1  16.0M      -  16.0M  -

또한 풀에 사용되는 디스크 공간은 32MB로 늘어납니다.

[root@localhost tank]# zpool list tank
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank    9.94G  32.2M  9.91G         -     0%     0%  1.00x  ONLINE  -

보시다시피, tank/test파일 세트는 이제 총 32MB를 차지하며, 16MB는 파일 세트로 tank/test, 16MB는 스냅샷으로 분할됩니다 tank/test@1. 또한 출력에는 zpool list디스크에 32MB가 할당된 것으로 표시됩니다.
반복하면복사 및 스냅샷 찍기USED의 총량은 tank/test더욱 늘어날 것입니다.

고쳐 쓰다

질문해주신 @Andrew Henle에게 감사드립니다. 위의 답변을 업데이트해야 하며 계속 진행됩니다.중복 제거아래에 뭔가가 있습니다.

파일 세트를 사용하여 이 작업을 다시 수행해 보겠습니다.중복 제거활성화되었습니다.

[root@localhost]# zfs destroy -r tank/test
[root@localhost]# zfs create tank/test-dedup
[root@localhost]# zfs set dedup=on tank/test-dedup

여기에서는 개별 단계를 건너뛰고 사용된 공간 개요의 출력만 추가하겠습니다.

[root@localhost ~]# zfs list -t all -r tank/test-dedup
NAME                  USED  AVAIL  REFER  MOUNTPOINT
tank                 32.3M  9.61G    24K  /tank
tank/test-dedup      32.1M  9.61G  16.0M  /tank/test-dedup
tank/test-dedup@1    16.0M      -  16.0M  -
[root@localhost ~]# zpool list tank
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank    9.94G  16.3M  9.92G         -     0%     0%  2.00x  ONLINE  -

그리고중복 제거활성화되면 스냅샷은 여전히 ​​사용량을 보고합니다.추가의크기는 알 수 zpool list있듯이중복 제거중복 제거율 2로 디스크 공간을 절약하세요.

IIRC 중복 제거는 메모리 사용량이 많고 성능에 영향을 미치기 때문에 일반적으로 권장되지 않습니다. ZFS의 중복 제거 기능이 개선되고 있다고 생각합니다.

답변2

나는 이것이 오래되었다는 것을 알고 있지만 (적어도 일부 OpenZFS 버전에서는) 다음을 사용하여 동일한 블록의 추가 할당을 피할 수 있습니다.빈 글

ZFS는 각 데이터 블록에 대해 종단 간 체크섬을 지원합니다. 암호화된 보안 체크섬을 사용하고 압축이 활성화되면 OpenZFS는 들어오는 쓰기의 체크섬을 기존 디스크 데이터의 체크섬과 비교하고 변경되지 않은 데이터 O에 대한 쓰기 I/O 실행을 방지합니다. 이는 동일한 파일을 거의 동일한 데이터로 정기적으로 덮어쓰는 상황(예: 무작위로 액세스되는 대규모 파일의 정기적인 전체 백업)에서 성능 및 스냅샷 공간 사용량을 향상시키는 데 도움이 될 수 있습니다.

관련 정보