ZVOL에 대한 이상한 ZFS 디스크 공간 사용량 보고서


8

우리는 176G의 디스크 공간을 사용한다고 주장하는 FreeBSD 10.0-CURRENT 호스트에 100G ZVOL이 있습니다 :

root@storage01:~ # zfs get all zroot/DATA/vtest
NAME              PROPERTY              VALUE                  SOURCE
zroot/DATA/vtest  type                  volume                 -
zroot/DATA/vtest  creation              Fri May 24 20:44 2013  -
zroot/DATA/vtest  used                  176G                   -
zroot/DATA/vtest  available             10.4T                  -
zroot/DATA/vtest  referenced            176G                   -
zroot/DATA/vtest  compressratio         1.00x                  -
zroot/DATA/vtest  reservation           none                   default
zroot/DATA/vtest  volsize               100G                   local
zroot/DATA/vtest  volblocksize          8K                     -
zroot/DATA/vtest  checksum              fletcher4              inherited from zroot
zroot/DATA/vtest  compression           off                    default
zroot/DATA/vtest  readonly              off                    default
zroot/DATA/vtest  copies                1                      default
zroot/DATA/vtest  refreservation        none                   local
zroot/DATA/vtest  primarycache          all                    default
zroot/DATA/vtest  secondarycache        all                    default
zroot/DATA/vtest  usedbysnapshots       0                      -
zroot/DATA/vtest  usedbydataset         176G                   -
zroot/DATA/vtest  usedbychildren        0                      -
zroot/DATA/vtest  usedbyrefreservation  0                      -
zroot/DATA/vtest  logbias               latency                default
zroot/DATA/vtest  dedup                 off                    default
zroot/DATA/vtest  mlslabel                                     -
zroot/DATA/vtest  sync                  standard               default
zroot/DATA/vtest  refcompressratio      1.00x                  -
zroot/DATA/vtest  written               176G                   -
zroot/DATA/vtest  logicalused           87.2G                  -
zroot/DATA/vtest  logicalreferenced     87.2G                  -
root@storage01:~ # 

이것은 버그처럼 보입니다. volsize스냅 샷, 예약 및 자식이없는 경우 어떻게 더 많이 소비 할 수 있습니까? 아니면 뭔가 빠졌습니까?

Upd :

결과 zpool status -v:

root@storage01:~ # zpool status -v
  pool: zroot
 state: ONLINE
  scan: scrub repaired 0 in 0h6m with 0 errors on Thu May 30 05:45:11 2013
config:

        NAME           STATE     READ WRITE CKSUM
        zroot          ONLINE       0     0     0
          raidz2-0     ONLINE       0     0     0
            gpt/disk0  ONLINE       0     0     0
            gpt/disk1  ONLINE       0     0     0
            gpt/disk2  ONLINE       0     0     0
            gpt/disk3  ONLINE       0     0     0
            gpt/disk4  ONLINE       0     0     0
            gpt/disk5  ONLINE       0     0     0
        cache
          ada0s2       ONLINE       0     0     0

errors: No known data errors
root@storage01:~ # 

결과 zpool list:

root@storage01:~ # zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
zroot  16.2T   288G  16.0T     1%  1.05x  ONLINE  -
root@storage01:~ # 

결과 zfs list:

root@storage01:~ # zfs list
NAME                            USED  AVAIL  REFER  MOUNTPOINT
zroot                           237G  10.4T   288K  /
zroot/DATA                      227G  10.4T   352K  /DATA
zroot/DATA/NFS                  288K  10.4T   288K  /DATA/NFS
zroot/DATA/hv                  10.3G  10.4T   288K  /DATA/hv
zroot/DATA/hv/hv001            10.3G  10.4T   144K  -
zroot/DATA/test                 288K  10.4T   288K  /DATA/test
zroot/DATA/vimage              41.3G  10.4T   288K  /DATA/vimage
zroot/DATA/vimage/vimage_001   41.3G  10.5T  6.47G  -
zroot/DATA/vtest                176G  10.4T   176G  -
zroot/SYS                      9.78G  10.4T   288K  /SYS
zroot/SYS/ROOT                  854M  10.4T   854M  /
zroot/SYS/home                 3.67G  10.4T  3.67G  /home
zroot/SYS/tmp                   352K  10.4T   352K  /tmp
zroot/SYS/usr                  4.78G  10.4T   427M  /usr
zroot/SYS/usr/local             288K  10.4T   288K  /usr/local
zroot/SYS/usr/obj              3.50G  10.4T  3.50G  /usr/obj
zroot/SYS/usr/ports             895K  10.4T   320K  /usr/ports
zroot/SYS/usr/ports/distfiles   288K  10.4T   288K  /usr/ports/distfiles
zroot/SYS/usr/ports/packages    288K  10.4T   288K  /usr/ports/packages
zroot/SYS/usr/src               887M  10.4T   887M  /usr/src
zroot/SYS/var                   511M  10.4T  1.78M  /var
zroot/SYS/var/crash             505M  10.4T   505M  /var/crash
zroot/SYS/var/db               1.71M  10.4T  1.43M  /var/db
zroot/SYS/var/db/pkg            288K  10.4T   288K  /var/db/pkg
zroot/SYS/var/empty             288K  10.4T   288K  /var/empty
zroot/SYS/var/log               647K  10.4T   647K  /var/log
zroot/SYS/var/mail              296K  10.4T   296K  /var/mail
zroot/SYS/var/run               448K  10.4T   448K  /var/run
zroot/SYS/var/tmp               304K  10.4T   304K  /var/tmp
root@storage01:~ # 

Upd 2 :

매개 변수가 다른 여러 ZVOL을 작성 dd하고 컨텐츠를 이동하는 데 사용 했습니다. 우리는 또 다른 이상한 점을 발견했습니다 .16k 및 128k의 ZVOL에서는 디스크 사용이 정상적이며 이후에도 8k의 ZVOL에서는 volblocksize비정상적으로 유지 volblocksize되었습니다 dd(따라서 조각화 문제는 아닙니다).

root@storage01:~ # zfs get all zroot/DATA/vtest-3
NAME                PROPERTY              VALUE                  SOURCE
zroot/DATA/vtest-3  type                  volume                 -
zroot/DATA/vtest-3  creation              Fri May 31  7:35 2013  -
zroot/DATA/vtest-3  used                  201G                   -
zroot/DATA/vtest-3  available             10.2T                  -
zroot/DATA/vtest-3  referenced            201G                   -
zroot/DATA/vtest-3  compressratio         1.00x                  -
zroot/DATA/vtest-3  reservation           none                   default
zroot/DATA/vtest-3  volsize               100G                   local
zroot/DATA/vtest-3  volblocksize          8K                     -
zroot/DATA/vtest-3  checksum              fletcher4              inherited from zroot
zroot/DATA/vtest-3  compression           off                    default
zroot/DATA/vtest-3  readonly              off                    default
zroot/DATA/vtest-3  copies                1                      default
zroot/DATA/vtest-3  refreservation        103G                   local
zroot/DATA/vtest-3  primarycache          all                    default
zroot/DATA/vtest-3  secondarycache        all                    default
zroot/DATA/vtest-3  usedbysnapshots       0                      -
zroot/DATA/vtest-3  usedbydataset         201G                   -
zroot/DATA/vtest-3  usedbychildren        0                      -
zroot/DATA/vtest-3  usedbyrefreservation  0                      -
zroot/DATA/vtest-3  logbias               latency                default
zroot/DATA/vtest-3  dedup                 off                    default
zroot/DATA/vtest-3  mlslabel                                     -
zroot/DATA/vtest-3  sync                  standard               default
zroot/DATA/vtest-3  refcompressratio      1.00x                  -
zroot/DATA/vtest-3  written               201G                   -
zroot/DATA/vtest-3  logicalused           100G                   -
zroot/DATA/vtest-3  logicalreferenced     100G                   -
root@storage01:~ # 

root@storage01:~ # zfs get all zroot/DATA/vtest-16
NAME                 PROPERTY              VALUE                  SOURCE
zroot/DATA/vtest-16  type                  volume                 -
zroot/DATA/vtest-16  creation              Fri May 31  8:03 2013  -
zroot/DATA/vtest-16  used                  102G                   -
zroot/DATA/vtest-16  available             10.2T                  -
zroot/DATA/vtest-16  referenced            101G                   -
zroot/DATA/vtest-16  compressratio         1.00x                  -
zroot/DATA/vtest-16  reservation           none                   default
zroot/DATA/vtest-16  volsize               100G                   local
zroot/DATA/vtest-16  volblocksize          16K                    -
zroot/DATA/vtest-16  checksum              fletcher4              inherited from zroot
zroot/DATA/vtest-16  compression           off                    default
zroot/DATA/vtest-16  readonly              off                    default
zroot/DATA/vtest-16  copies                1                      default
zroot/DATA/vtest-16  refreservation        102G                   local
zroot/DATA/vtest-16  primarycache          all                    default
zroot/DATA/vtest-16  secondarycache        all                    default
zroot/DATA/vtest-16  usedbysnapshots       0                      -
zroot/DATA/vtest-16  usedbydataset         101G                   -
zroot/DATA/vtest-16  usedbychildren        0                      -
zroot/DATA/vtest-16  usedbyrefreservation  886M                   -
zroot/DATA/vtest-16  logbias               latency                default
zroot/DATA/vtest-16  dedup                 off                    default
zroot/DATA/vtest-16  mlslabel                                     -
zroot/DATA/vtest-16  sync                  standard               default
zroot/DATA/vtest-16  refcompressratio      1.00x                  -
zroot/DATA/vtest-16  written               101G                   -
zroot/DATA/vtest-16  logicalused           100G                   -
zroot/DATA/vtest-16  logicalreferenced     100G                   -
root@storage01:~ # 

우리는 이것이 조각 화일 수 있다고 생각하지만 그것을 증명하는 방법을 모른다
Alex

스냅 샷과 관련이있을 수 있습니까?
Steve Wills

아니요,이 볼륨에 대한 스냅 샷이 없습니다
Alex

ZFS 볼륨 / 파일 시스템에서 압축이 비활성화 된 것을 보면 슬프습니다. 어쨌든, 당신은 게시 할 수 있습니다 zpool status -vzpool listzfs list?
ewwhite

1
내가 볼 수있는 모든 것에서 그것은 버그처럼 보입니다. 100G의 볼륨을 가진 zvol의 '사용'은 자식이나 예약 등이없는 경우 100G를 초과하지 않아야합니다. 실제로 200GB 이상의 볼륨 크기였으며 volsize 매개 변수를 변경 했습니까? 그렇지 않은 경우 FreeBSD-10.0은 아직 프로덕션 릴리스가 아닙니다. 그들에게 버그를 제기하십시오.
Nex7

답변:


2

VOLSIZE는 풀에 저장된 볼륨의 크기가 아니라 클라이언트가 볼 수있는 볼륨의 크기를 나타냅니다.

이 차이는 여러 출처에서 나올 수 있습니다.

  • 메타 데이터에 필요한 공간
  • 여러 사본을 저장하는 데 필요한 공간 ( "사본"매개 변수)
  • "volblocksize"크기의 블록을 vdev 구조에 정렬하는 동안 패딩으로 인한 "공간 낭비"; vdev 구조는 두 가지 매개 변수, 즉 raidz-N의 디스크 수와 장치의 물리적 블록 크기를 의미합니다.

볼륨을 만들 때 zfs는 클라이언트에 "볼륨"볼륨을 제공하기 위해 필요한 공간의 양 을 추정 합니다. vtest-16과 vtest-3 볼륨의 차이를 확인할 수 있습니다 (refreservation은 102GB, volsize는 100GB). 계산은 libzfs_dataset.c에서 찾을 수 있습니다 (zvol_volsize_to_reservation (uint64_t volsize, nvlist_t * props))

이 계산에서 고려되지 않은 것은 세 번째 소스입니다. 세 번째 소스는 512 바이트 섹터를 가진 디스크로 생성 된 vdev에는 거의 영향을 미치지 않습니다. 내 실험에서 (전체 zvol을 채워서 확인하여 테스트 한 결과) vdev가 최신 4K 섹터 디스크에서 생성 될 때 큰 차이가 있습니다.

실험에서 찾은 또 다른 점은 거울을 갖는 것이 계산 된 재 보상과 사용되는 것의 차이를 나타내지 않는다는 것입니다.

기본 volblocksize (8K) 볼륨을 가진 4K 드라이브를 사용할 때의 결과입니다. 첫 번째 열은 vdev의 디스크 수를 나타냅니다.

    raidz1  raidz2
3   135%    101%
4   148%    148%
5   162%    181%
6   162%    203%
7   171%    203%
8   171%    217%
9   181%    232%
10  181%    232%
11  181%    232%
12  181%    232%

512 바이트 섹터 드라이브와 8K의 기본 volblocksize를 사용할 때의 결과입니다. 첫 번째 열은 vdev의 디스크 수를 나타냅니다.

    raidz1  raidz2
3   101%    101%
4   104%    104%
5   101%    113%
6   105%    101%
7   108%    108%
8   110%    114%
9   101%    118%
10  102%    106%
11  103%    108%
12  104%    110%

내 결론은 다음과 같습니다.

  • 4K 드라이브를 사용하지 마십시오
  • 실제로 사용해야하는 경우 volblocksize를 사용하여 32K 이상으로 볼륨을 만드십시오. 무시할만한 성능 영향과 무시할만한 공간 사용 오버 헤드가 있습니다 (블록 크기가 클수록 올바르게 정렬하기 위해 적은 패딩이 필요함).
  • 수영장에는 거울을 선호합니다. 이 레이아웃은 성능상의 이점과 이와 같은 공간 관련 놀라움이 적습니다.
  • 위에서 설명한 경우에 대한 추정은 분명히 잘못되었으며 zfs의 버그입니다.

2
풀에서 4k 드라이브를 사용 ashift=9하면 문제가 발생하는 것으로 알려져 있습니다. 이것은 새로운 것이 아닙니다. 블록 크기를 변경해도 드라이브가 정렬되지 않습니다. 올바른 해결책은을 사용하여 풀을 만드는 것입니다 ashift=12.
크리스 S

ashift=124K 드라이브에서는이 문제가 해결되지 않습니다. 실제로 ashift=125 개의 4K 드라이브와 raidz 를 갖춘 zpool 에서 소비 된 공간은 위에서 언급 한 것과 비슷합니다. 예를 들어 7T 볼륨은 11T를 소비합니다.
drookie

-1

이 권리를 읽고 있다면 실제로 logicalreferenced볼륨에 87.6GB의 데이터가있는 것입니다. 보고있는 170GB 숫자는 데이터가 사용하는 물리적 공간의 양입니다. 따라서 드라이브를 미러링하면 referenced약 2 배가 될 것으로 예상 됩니다 logicalreferenced.


흠, 동일한 풀의 다른 FS를 보유 referenced 3.50G하고 logicalreferenced 3.00G있으므로 배 비율은 풀 FS에간에 일치하지 않는다.
Alex

그리고 수영장은 raidz2일반 거울이 아닙니다
Alex

예, 방금 VM에서 몇 가지 빠른 테스트를 수행했지만 이론은 견디지 못했습니다.
longneck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.