을 사용하여 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_shift
6(이전 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