zpool 목록과 zfs 목록 - 사용 가능한 공간이 10배씩 다른 이유는 무엇입니까?

zpool 목록과 zfs 목록 - 사용 가능한 공간이 10배씩 다른 이유는 무엇입니까?

을 사용하여 zpool여유 공간을 나열하면 사용 가능한 공간이 270GB 이상이라고 표시되지만 실제 여유 공간( 및 로 표시 df) zfs list은 40GB에 불과해 거의 10배나 적습니다.

$ zpool list
NAME      SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
ssdtank  7.25T  6.98T   273G        -         -    21%    96%  1.00x    ONLINE  -

$ zpool iostat -v
                                      capacity     operations     bandwidth 
pool                                alloc   free   read  write   read  write
----------------------------------  -----  -----  -----  -----  -----  -----
ssdtank                             6.98T   273G      1     15   365K   861K
  ata-Samsung_SSD_860_QVO_4TB_S123  3.49T   136G      0      7   182K   428K
  ata-Samsung_SSD_860_QVO_4TB_S456  3.49T   137G      0      8   183K   434K

$ zfs list
NAME       USED  AVAIL     REFER  MOUNTPOINT
ssdtank   6.98T  40.6G       32K  /srv/tank

이 차이점은 무엇을 의미합니까? 이 두 유틸리티가 서로 다른 여유 공간을 표시하는 이유는 무엇입니까? 더 중요한 것은 "추가" 200GB가 존재하는 경우 어떻게 액세스할 수 있습니까?

풀은 RAID나 다른 설정 없이 두 개의 동일한 디스크로 구성되며, 맨 위에 파일 시스템이 생성된 일반 vdev로 풀에 추가됩니다. (표시된 루트에 여러 파일 시스템이 있지만 모두 동일한 루트를 공유하고 동일한 40.6G의 여유 공간을 갖기 때문에 서로 관련이 없다고 생각합니다.)

요청에 따라 출력은 다음과 같습니다 zfs get all. (오늘 여유 디스크 공간의 양이 변경되었으므로 모두 이해할 수 있도록 위의 숫자도 업데이트했습니다. 이전 숫자는 257GB/27GB였고 현재는 273GB/40GB입니다. 질문을 처음 게시한 이후 확보된 디스크 공간은 두 숫자 모두 같은 양만큼 증가했습니다. 즉, zpool은 다른 모든 것보다 약 270GB 더 많은 것으로 보고되는 것처럼 보이지만 당시 실제 사용 가능한 공간보다 항상 270GB 더 많습니다.

NAME     PROPERTY              VALUE                  SOURCE
ssdtank  aclinherit            restricted             default
ssdtank  acltype               off                    default
ssdtank  atime                 off                    received
ssdtank  available             40.6G                  -
ssdtank  canmount              on                     default
ssdtank  casesensitivity       sensitive              -
ssdtank  checksum              on                     default
ssdtank  compression           off                    default
ssdtank  compressratio         1.00x                  -
ssdtank  context               none                   default
ssdtank  copies                1                      default
ssdtank  createtxg             1                      -
ssdtank  creation              Sat Oct 26 21:53 2019  -
ssdtank  dedup                 off                    default
ssdtank  defcontext            none                   default
ssdtank  devices               on                     default
ssdtank  dnodesize             legacy                 default
ssdtank  encryption            off                    default
ssdtank  exec                  on                     default
ssdtank  filesystem_count      none                   default
ssdtank  filesystem_limit      none                   default
ssdtank  fscontext             none                   default
ssdtank  guid                  12757787786185470931   -
ssdtank  keyformat             none                   default
ssdtank  keylocation           none                   default
ssdtank  logbias               latency                default
ssdtank  logicalreferenced     16K                    -
ssdtank  logicalused           6.98T                  -
ssdtank  mlslabel              none                   default
ssdtank  mounted               yes                    -
ssdtank  mountpoint            /srv/tank              local
ssdtank  nbmand                off                    default
ssdtank  normalization         none                   -
ssdtank  objsetid              54                     -
ssdtank  overlay               off                    default
ssdtank  pbkdf2iters           0                      default
ssdtank  primarycache          all                    default
ssdtank  quota                 none                   default
ssdtank  readonly              off                    default
ssdtank  recordsize            128K                   default
ssdtank  redundant_metadata    all                    default
ssdtank  refcompressratio      1.00x                  -
ssdtank  referenced            32K                    -
ssdtank  refquota              none                   default
ssdtank  refreservation        none                   default
ssdtank  relatime              off                    default
ssdtank  reservation           none                   default
ssdtank  rootcontext           none                   default
ssdtank  secondarycache        all                    default
ssdtank  setuid                on                     default
ssdtank  sharenfs              [email protected]/24     received
ssdtank  sharesmb              off                    default
ssdtank  snapdev               hidden                 default
ssdtank  snapdir               hidden                 default
ssdtank  snapshot_count        none                   default
ssdtank  snapshot_limit        none                   default
ssdtank  special_small_blocks  0                      default
ssdtank  sync                  standard               default
ssdtank  type                  filesystem             -
ssdtank  used                  6.98T                  -
ssdtank  usedbychildren        6.98T                  -
ssdtank  usedbydataset         32K                    -
ssdtank  usedbyrefreservation  0B                     -
ssdtank  usedbysnapshots       0B                     -
ssdtank  utf8only              off                    -
ssdtank  version               5                      -
ssdtank  volmode               default                default
ssdtank  vscan                 off                    default
ssdtank  written               0                      -
ssdtank  xattr                 on                     default
ssdtank  zoned                 off                    default

답변1

ZFS는 사용 가능한 공간이 매우 적은 경우에도 일부 중요한 ZFS 작업을 완료할 수 있도록 내부적으로 작은 공간(비뚤어진 공간)을 예약합니다.

금액은3.2%총 풀 용량. zfs-0.6.5

7.25T의 3.2% = 235GB

실제로 파일 시스템에는 40.6GB의 여유 공간만 있습니다.

zpool은 원시 디스크 용량을 보고하며 사용 가능한 공간은 40 + 235 = 275G입니다.

답변2

Binarysta의 답변에 추가하려면 다음을 사용하여 예약된("slop") 공간의 양을 조정할 수 있습니다.spa_slop_shift 기준 치수옵션.

이것ZFS-on-Linux 모듈 설명서기본값 5는 대규모 배열에 대해 너무 보수적(너무 많은 공간 예약)일 수 있으므로 더 적은 공간이 예약되도록 늘려도 괜찮습니다. (ZFS를 실행하는 다른 운영 체제에도 비슷한 옵션이 있습니다.)

기본값 5는 2^5 = 32로 해석되며 이는 풀 용량의 1/32입니다. spa_slop_shift6(이전 ZFS 버전에서 사용되는 값)으로 설정하면 풀 용량의 1/64만 예약된다는 의미입니다.

더 적은 공간을 예약하면 조각화가 증가하고 많은 수의 서로 다른 블록을 관리하는 데 더 많은 메모리가 필요할 수 있습니다. 따라서 문서에서는 4TB RAM이 있는 시스템의 실제 상한으로 15(풀 공간의 1/32768)를 권장합니다. 파일 시스템이 가득 찼을 때 조각화되지 않을 것이라고 어떻게든 보장할 수 있다면 메모리 요구 사항은 더 낮아질 수 있습니다.

절대 최소 슬롭 공간은 128MiB이므로 200GB는 좀 무리인 것 같아서 spa_slop_shift일단은 6으로 변경하겠습니다. 각 증분은 예약된 공간의 양을 절반으로 줄이므로 제 경우에는 5에서 6으로 늘리면 예약된 공간이 200GB에서 100GB로 절반으로 줄어듭니다. 물론, 이는 즉시 100GiB의 여유 공간을 추가로 제공했습니다.

Linux에서 실행되는 동안 값을 일시적으로 변경하려면 다시 시작하지 않고 모듈 매개변수를 변경할 수 있습니다.

echo 6 > /sys/module/zfs/parameters/spa_slop_shift

이는 즉시 적용되며 df추가 공간이 즉시 나타납니다.

변경 사항을 영구적으로 적용하려면 다음을 생성하거나 편집 /etc/modprobe.d/zfs.conf하고 추가하세요.

options zfs spa_slop_shift=6

관련 정보