Автор Тема: ZFS - имам "free" пространство, което не е "available"?  (Прочетена 3030 пъти)

vstoykov

  • Напреднали
  • *****
  • Публикации: 1286
  • Distribution: Ubuntu
  • Window Manager: Fluxbox
    • Профил
    • WWW
Код:
valentin@computer:~/zfs-lab$ sudo zfs list flashbox1/data
NAME             USED  AVAIL  REFER  MOUNTPOINT
flashbox1/data  31.4M   518K  31.4M  /mnt/flashbox1/data
valentin@computer:~/zfs-lab$ sudo zpool list flashbox1
NAME        SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
flashbox1    64M  31.5M  32.5M         -    27%    49%  1.00x  ONLINE  -
valentin@computer:~/zfs-lab$

Как така имам "достъпни" 518K, а имам "свободни" 32,5M?

Създадох ZFS контейнера така:

Код:
$ dd if=/dev/zero of=zbox1.1.img bs=80M count=1
$ dd if=/dev/zero of=zbox1.2.img bs=80M count=1
$ dd if=/dev/zero of=zbox1.3.img bs=80M count=1
$ sudo zpool create -m /mnt/flashbox1 flashbox1 mirror /home/valentin/zfs-lab/zbox1.1.img /home/valentin/zfs-lab/zbox1.2.img /home/valentin/zfs-lab/zbox1.3.img
sudo zfs create -o relatime=on -o compression=lz4 -o mountpoint=/mnt/flashbox1/data flashbox1/data

Проверих файловете - има много нули (не съм ги броил, вероятно са повече от половината байтове). И се компресират добре (при положение, че контейнерът е пълен с компресирани файлове!):

Код:
$ 7z a test.7z zbox1.1.img
$ ls test.7z zbox1.1.img -lah
-rw-rw-r-- 1 valentin valentin 33M Jul 19 01:15 test.7z
-rw-rw-r-- 1 valentin valentin 80M Jul 19 00:40 zbox1.1.img

Настройките са:

Код:
$ sudo zfs get all flashbox1
NAME       PROPERTY              VALUE                  SOURCE
flashbox1  type                  filesystem             -
flashbox1  creation              Wed Jul 19  0:22 2017  -
flashbox1  used                  31.5M                  -
flashbox1  available             518K                   -
flashbox1  referenced            19K                    -
flashbox1  compressratio         1.00x                  -
flashbox1  mounted               yes                    -
flashbox1  quota                 none                   default
flashbox1  reservation           none                   default
flashbox1  recordsize            128K                   default
flashbox1  mountpoint            /mnt/flashbox1         local
flashbox1  sharenfs              off                    default
flashbox1  checksum              on                     default
flashbox1  compression           off                    default
flashbox1  atime                 on                     default
flashbox1  devices               on                     default
flashbox1  exec                  on                     default
flashbox1  setuid                on                     default
flashbox1  readonly              off                    default
flashbox1  zoned                 off                    default
flashbox1  snapdir               hidden                 default
flashbox1  aclinherit            restricted             default
flashbox1  canmount              on                     default
flashbox1  xattr                 on                     default
flashbox1  copies                1                      default
flashbox1  version               5                      -
flashbox1  utf8only              off                    -
flashbox1  normalization         none                   -
flashbox1  casesensitivity       sensitive              -
flashbox1  vscan                 off                    default
flashbox1  nbmand                off                    default
flashbox1  sharesmb              off                    default
flashbox1  refquota              none                   default
flashbox1  refreservation        none                   default
flashbox1  primarycache          all                    default
flashbox1  secondarycache        all                    default
flashbox1  usedbysnapshots       0                      -
flashbox1  usedbydataset         19K                    -
flashbox1  usedbychildren        31.5M                  -
flashbox1  usedbyrefreservation  0                      -
flashbox1  logbias               latency                default
flashbox1  dedup                 off                    default
flashbox1  mlslabel              none                   default
flashbox1  sync                  standard               default
flashbox1  refcompressratio      1.00x                  -
flashbox1  written               19K                    -
flashbox1  logicalused           31.7M                  -
flashbox1  logicalreferenced     9.50K                  -
flashbox1  filesystem_limit      none                   default
flashbox1  snapshot_limit        none                   default
flashbox1  filesystem_count      none                   default
flashbox1  snapshot_count        none                   default
flashbox1  snapdev               hidden                 default
flashbox1  acltype               off                    default
flashbox1  context               none                   default
flashbox1  fscontext             none                   default
flashbox1  defcontext            none                   default
flashbox1  rootcontext           none                   default
flashbox1  relatime              off                    default
flashbox1  redundant_metadata    all                    default
flashbox1  overlay               off                    default

Идеята ми е да ползвам флашки и компактдискове за архиви. Флашките са извести с това, че понякога губят информация (data rot), ако са оставени седмици или повече без захранване (имал съм такъв случай).

До сега си записвах архивните файлове по няколко пъти (това ми е навик от времето когато ползвах дискети) и им слагам контролни суми, които проверявам. Обаче сега искам по-модерно решение - ZFS е такова.

Само че не мога да разбера как да накарам ZFS контейнера да ми разреши да ползвам цялото свободно място.


Това с трите файла 80M е практично в случай, че се ползва флашка, форматирана под FAT32 и се ползва и за други неща (между другото слагам и тези архиви).

Идеята ми е да направя файлове с размера на оптичен диск и директно да ги записвам на диска - без ISO 9660 (файловата система, която се ползва за оптични дискове). Това с 80-те мегабайтовите файлове е за proof of concept и за архивиране на дребни неща на флашки. Би било обаче доста неефективно ако не успея да направя така, че да не се губи половината пространство.

Нямам snapshots:

Код:
$ sudo zfs list -o space -r flashbox1
NAME            AVAIL   USED  USEDSNAP  USEDDS  USEDREFRESERV  USEDCHILD
flashbox1        502K  31.5M         0     19K              0      31.5M
flashbox1/data   502K  31.4M         0   31.4M              0          0

Това нещо "USEDDS" не съм сигурен какво е.
« Последна редакция: Jul 19, 2017, 02:21 от vstoykov »
Активен

growchie

  • Напреднали
  • *****
  • Публикации: 623
    • Профил
Я дай аутпута на zpool status.
Активен

vstoykov

  • Напреднали
  • *****
  • Публикации: 1286
  • Distribution: Ubuntu
  • Window Manager: Fluxbox
    • Профил
    • WWW
Код:
valentin@computer:~/zfs-lab$ sudo zpool status flashbox1
  pool: flashbox1
 state: ONLINE
  scan: scrub repaired 0 in 0h0m with 0 errors on Wed Jul 19 02:16:18 2017
config:

NAME                                    STATE     READ WRITE CKSUM
flashbox1                               ONLINE       0     0     0
  mirror-0                              ONLINE       0     0     0
    /home/valentin/zfs-lab/zbox1.1.img  ONLINE       0     0     0
    /home/valentin/zfs-lab/zbox1.2.img  ONLINE       0     0     0
    /home/valentin/zfs-lab/zbox1.3.img  ONLINE       0     0     0

errors: No known data errors
valentin@computer:~/zfs-lab$ sudo zpool list flashbox1
NAME        SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
flashbox1    64M  31.5M  32.5M         -    28%    49%  1.00x  ONLINE  -
valentin@computer:~/zfs-lab$ sudo zfs list flashbox1
NAME        USED  AVAIL  REFER  MOUNTPOINT
flashbox1  31.5M   500K    19K  /mnt/flashbox1
valentin@computer:~/zfs-lab$ sudo zfs list flashbox1/data
NAME             USED  AVAIL  REFER  MOUNTPOINT
flashbox1/data  31.4M   500K  31.4M  /mnt/flashbox1/data
valentin@computer:~/zfs-lab$

Гледах файловете през ghex и видях големи полета от нули. Може би пази някакъв резерв за нещо си (може би за snapshots?).

Изключих snapshots и няма ефект:

Код:
$ sudo zfs set snapshot_limit=0 flashbox1
Активен

pgmgm

  • Гост
Принципно нали всяка файлова система си резервира част от "диска", за нейни си нужди?
Като гледам - ext4 си дърпа 2%, при ZFS предполагам е повече?

http://docs.oracle.com/cd/E19253-01/819-5461/gbdbb/index.html
http://www.tech-recipes.com/rx/1414/zfs-reserve-space-for-filesystem/

Цитат
cloud ~ # dd if=/dev/zero of=test1 bs=1024 count=100000
100000+0 records in
100000+0 records out
102400000 bytes (102 MB) copied, 0.778352 s, 132 MB/s
cloud ~ # mkfs -t ext4 test1
mke2fs 1.42.9 (28-Dec-2013)
test1 is not a block special device.
Proceed anyway? (y,n) y
Discarding device blocks: done
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
25064 inodes, 100000 blocks
5000 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=33685504
13 block groups
8192 blocks per group, 8192 fragments per group
1928 inodes per group
Superblock backups stored on blocks:
   8193, 24577, 40961, 57345, 73729

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

cloud ~ # mkdir /mnt/test
cloud ~ # mount -t ext4 -o loop test1 /mnt/test
cloud ~ # df -h
Filesystem                     Size  Used Avail Use% Mounted on
/dev/mapper/centos_cloud-root   38G  5.8G   32G  16% /
devtmpfs                       1.9G     0  1.9G   0% /dev
tmpfs                          1.9G     0  1.9G   0% /dev/shm
tmpfs                          1.9G  193M  1.7G  11% /run
tmpfs                          1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/mapper/ubg-data           788G   48G  700G   7% /data
/dev/mapper/centos_cloud-home   19G  1.2G   18G   7% /home
/dev/sda1                      497M  236M  262M  48% /boot
tmpfs                          380M     0  380M   0% /run/user/0
/dev/loop0                      91M  1.6M   83M   2% /mnt/test
tmpfs                          380M     0  380M   0% /run/user/1004
Активен

d0ni

  • Напреднали
  • *****
  • Публикации: 183
    • Профил
Явно ZFS си яде 32MB, независимо от големинта на pool-а. Пробвай да направиш дял от 512MB и пак ще имаш липсващи 30тина мегабайта. Тук има инфо за физическия layout на ZFS vdevs - http://www.osdevcon.org/2009/slides/zfs_internals_uli_graef.pdf. Пише че има 4 label-а по 256KB и някаква дупка от 3.5MB, но останалите 20+MB не е ясно къде отиват. Ако много те интересува може да си поиграеш със zdb.
Активен

vstoykov

  • Напреднали
  • *****
  • Публикации: 1286
  • Distribution: Ubuntu
  • Window Manager: Fluxbox
    • Профил
    • WWW
При размер на pool-а 3 DVD-та (DVD+R) се получава това:

Код:
valentin@computer:/mnt/dvdbox1$ df -h .
Filesystem      Size  Used Avail Use% Mounted on
dvdbox1          13G   13G  768K 100% /mnt/dvdbox1
valentin@computer:/mnt/dvdbox1$ sudo zfs list dvdbox1
NAME      USED  AVAIL  REFER  MOUNTPOINT
dvdbox1  12.6G   881K  12.6G  /mnt/dvdbox1
valentin@computer:/mnt/dvdbox1$ sudo zpool list dvdbox1
NAME      SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
dvdbox1  13.0G  12.6G   417M         -    61%    96%  1.00x  ONLINE  -
valentin@computer:/mnt/dvdbox1$ sudo zpool status dvdbox1
  pool: dvdbox1
 state: ONLINE
  scan: none requested
config:

NAME                                      STATE     READ WRITE CKSUM
dvdbox1                                   ONLINE       0     0     0
  /home/valentin2/zfs-lab-dvd/dvd1.1.bin  ONLINE       0     0     0
  /home/valentin2/zfs-lab-dvd/dvd2.1.bin  ONLINE       0     0     0
  /home/valentin2/zfs-lab-dvd/dvd3.1.bin  ONLINE       0     0     0

errors: No known data errors
valentin@computer:/mnt/dvdbox1$ ls /home/valentin2/zfs-lab-dvd/* -la
-rw-rw-r-- 1 valentin valentin 4700372992 Jul 21 03:21 /home/valentin2/zfs-lab-dvd/dvd1.1.bin
-rw-rw-r-- 1 valentin valentin 4700372992 Jul 21 03:21 /home/valentin2/zfs-lab-dvd/dvd2.1.bin
-rw-rw-r-- 1 valentin valentin 4700372992 Jul 21 03:21 /home/valentin2/zfs-lab-dvd/dvd3.1.bin
valentin@computer:/mnt/dvdbox1$ ls /home/valentin2/zfs-lab-dvd/* -lah
-rw-rw-r-- 1 valentin valentin 4.4G Jul 21 03:21 /home/valentin2/zfs-lab-dvd/dvd1.1.bin
-rw-rw-r-- 1 valentin valentin 4.4G Jul 21 03:21 /home/valentin2/zfs-lab-dvd/dvd2.1.bin
-rw-rw-r-- 1 valentin valentin 4.4G Jul 21 03:21 /home/valentin2/zfs-lab-dvd/dvd3.1.bin
valentin@computer:/mnt/dvdbox1$ du -s .
13232832 .
valentin@computer:/mnt/dvdbox1$ du -hs .
13G .
valentin@computer:/mnt/dvdbox1$

Този път има един близо половин гигабайт разлика.

Ако правилно съм го сметнал (du дава килобайти) има 525 мегабайта разлика:

Код:
valentin@computer:~$ calc "(4700372992 * 3 ) - (13232832 * 1024 )"
550699008
valentin@computer:~$ calc "550699008 / 1024 / 1024"
525.1875
valentin@computer:~$

Или това са 3,9%.

Но защо ми дава "FREE"  417M, а "AVAIL" е близо нула?
Активен

growchie

  • Напреднали
  • *****
  • Публикации: 623
    • Профил
Предполагам, че това са резервирани за метаданни. Дяловете са запълнени с данни, нали така?
« Последна редакция: Jul 21, 2017, 13:54 от growchie »
Активен

vstoykov

  • Напреднали
  • *****
  • Публикации: 1286
  • Distribution: Ubuntu
  • Window Manager: Fluxbox
    • Профил
    • WWW
Pool-ът е пълен.

Обаче отворих файла с ghex и пак забелязах огромни полета с последователни нули.

Размерът на нулевите полета вероятно е по-малък от 163 MiB (на файл), защото толкова е разликата между размера на файла и мястото, което заема (записан е на компресирана файлова система, която компресира ефективно нулите, но не чак толкова ефективно компресира няколко дублиращи се файла във вложената ZFS - не е включена функцията за дедупликация).

Тоест нулите са около 3,65% или по-малко.

(Като се умножи 163 MiB по три се получава приблизително резултата от горните изчисления.)
« Последна редакция: Jul 21, 2017, 16:09 от vstoykov »
Активен

growchie

  • Напреднали
  • *****
  • Публикации: 623
    • Профил
Мда. На този феномен се вика slop space allocation. Примерно за да може да се трият файлове дори когато фс-а е пълен му трябва празно пространство. Било 1/32 от размера на пула.

https://utcc.utoronto.ca/~cks/space/blog/solaris/ZFSSpaceReportDifference

Виж и този инструмент http://wintelguy.com/zfs-calc.pl
Може да ти е интересно.
Активен