У меня есть Ubuntu VM, у которой есть тома, содержащая некоторые очень и очень сжимаемые наборы данных.
По этой причине я преобразовал рассматриваемый том в том ZFS, потому что тогда я могу использовать сжатие ZFS.
Все это работает очень хорошо, но я путают некоторые из выходных данных ZFS.
durr@graphical:/tank$ du . -h --max-depth=1; echo -----; du . -h --apparent-size --max-depth=1
1.9G ./carbon
1.9G .
-----
193G ./carbon
193G .
Примечание: /tank/ является точкой монтирования тома ZFS.
Итак, дайте вышеизложенное, я в настоящее время получаю ~ 1% (это ожидается, объем почти полностью файлов данных Carbon, которые в основном пусты, поэтому они должны быть чрезвычайно сжимаемыми).
Однако, если я задаю ZFS об объеме:
durr@graphical:/tank$ sudo zfs get all tank
NAME PROPERTY VALUE SOURCE
tank type filesystem -
tank creation Mon Dec 25 7:27 2017 -
tank used 1.87G -
tank available 239G -
tank referenced 1.85G -
tank compressratio 4.39x -
tank mounted yes -
tank quota none default
tank reservation none default
tank recordsize 128K default
tank mountpoint /tank default
tank sharenfs off default
tank checksum on default
tank compression on local
tank atime on default
tank devices on default
tank exec on default
tank setuid on default
tank readonly off default
tank zoned off default
tank snapdir hidden default
tank aclinherit restricted default
tank canmount on default
tank xattr on default
tank copies 1 default
tank version 5 -
tank utf8only off -
tank normalization none -
tank casesensitivity sensitive -
tank vscan off default
tank nbmand off default
tank sharesmb off default
tank refquota none default
tank refreservation none default
tank primarycache all default
tank secondarycache all default
tank usedbysnapshots 0 -
tank usedbydataset 1.85G -
tank usedbychildren 18.7M -
tank usedbyrefreservation 0 -
tank logbias latency default
tank dedup on local
tank mlslabel none default
tank sync standard default
tank refcompressratio 4.40x -
tank written 1.85G -
tank logicalused 8.13G -
tank logicalreferenced 8.13G -
tank filesystem_limit none default
tank snapshot_limit none default
tank filesystem_count none default
tank snapshot_count none default
tank snapdev hidden default
tank acltype off default
tank context none default
tank fscontext none default
tank defcontext none default
tank rootcontext none default
tank relatime on temporary
tank redundant_metadata all default
tank overlay off default
ZFS сообщает коэффициент сжатия либо 4.39x, либо 4.40x, в зависимости от того, где вы смотрите. Однако, с коэффициентом сжатия ~ 1% от ранее, я ожидал бы увидеть 0.01x или 99.0x, в зависимости от того, как ZFS представляет его статус.
Googling вокруг, я не могу найти документация на члене compressratio.
Подумав об этом, у меня также включена дедупликация ZFS, но я понял, что она меняет, для этого тома, поэтому я думал, что это может дедуплицировать пустые блоки. Однако это не кажется правильным:
durr@graphical:/tank$ sudo zpool get all tank
NAME PROPERTY VALUE SOURCE
tank size 248G -
tank capacity 0% -
tank altroot - default
tank health ONLINE -
tank guid 11995166271724776732 default
tank version - default
tank bootfs - default
tank delegation on default
tank autoreplace off default
tank cachefile - default
tank failmode wait default
tank listsnapshots off default
tank autoexpand off default
tank dedupditto 0 default
tank dedupratio 1.12x -
tank free 246G -
tank allocated 1.69G -
tank readonly off -
tank ashift 0 default
tank comment - default
tank expandsize - -
tank freeing 0 default
tank fragmentation 1% -
tank leaked 0 default
tank feature@async_destroy enabled local
tank feature@empty_bpobj enabled local
tank feature@lz4_compress active local
tank feature@spacemap_histogram active local
tank feature@enabled_txg active local
tank feature@hole_birth active local
tank feature@extensible_dataset enabled local
tank feature@embedded_data active local
tank feature@bookmarks enabled local
tank feature@filesystem_limits enabled local
tank feature@large_blocks enabled local
Я понятия не имею, где дополнительные данные, с точки зрения ZFS. Я думаю, что файлы разрежены. ZFS не выделяет дисковое пространство для разреженных файлов сразу?
Похоже, ZFS превращает нулевой файл в разреженный файл, когда сжатие включено. Взято из комментария DeHackEd отсюда.
Наиболее вероятный ответ на ваш вопрос: разреженные отверстия не считаются «сжатыми». Это дыры. Вы получаете то же самое на ext4, и оно вообще не поддерживает сжатие. При сжатии ZFS превратит все нулевые страницы в разреженные отверстия.Я также создал некоторые файлы в наборе данных ZFS, используя sparsefile, файл, созданный с /dev/zero, и файл, созданный только с символом a, чтобы получить хорошее сжатие.
] Команды, используемые для создания файлов.
truncate -s $((1024*1024*1024)) /tank1/sparsefile dd if=/dev/zero of=/tank1/zerofile bs=1073741824 count=1 использовали некоторые для циклов, чтобы эхо a в afileСначала проверьте сжатие на пустом наборе файлов tank1.
[root@localhost tank1]# zfs get all tank1 | grep compress
tank1 compressratio 1.00x -
tank1 compression lz4 local
tank1 refcompressratio 1.01x -
Затем создайте разреженный файл и файл из /dev/zero размером 1 ГБ и снова проверьте компрессию.
[root@localhost tank1]# truncate -s $((1024*1024*1024)) sparsefile
[root@localhost tank1]# dd if=/dev/zero of=/tank1/zerofile bs=1073741824 count=1
[root@localhost tank1]# zfs get all tank1 | grep compress
tank1 compressratio 1.00x -
tank1 compression lz4 local
tank1 refcompressratio 1.01x -
Ничего не изменилось, хотя нулевой файл следует считать довольно хорошим сжимаемым. При использовании sparsefiles пространство никогда не выделяется прямо сейчас, а только по требованию. Это поведение в любой файловой системе, так как это независимая от файловой системы. Все, что делается, это установить параметр «Размер», но не выделяет никаких блоков, как вы можете видеть из stat.
[root@localhost tank1]# stat sparsefile
File: ‘sparsefile’
Size: 1073741824 Blocks: 1 IO Block: 131072 regular file
Device: 2ah/42d Inode: 2 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-12-30 15:31:37.512845721 +0100
Modify: 2017-12-30 15:31:37.513845720 +0100
Change: 2017-12-30 15:31:37.513845720 +0100
Birth: -
[root@localhost tank1]# stat zerofile
File: ‘zerofile’
Size: 1073741824 Blocks: 1 IO Block: 131072 regular file
Device: 2ah/42d Inode: 3 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-12-30 15:31:41.742838662 +0100
Modify: 2017-12-30 15:31:42.616837203 +0100
Change: 2017-12-30 15:31:42.616837203 +0100
Birth: -
Итак, нулевой файл и нулевой файл выглядят почти одинаково и имеют только один выделенный блок. Если мы сделаем то же самое на [ f15], мы можем видеть разницу, поскольку выделены блоки для Size .
[root@localhost test]$ stat sparsefile
File: sparsefile
Size: 1073741824 Blocks: 0 IO Block: 4096 regular file
Device: fd02h/64770d Inode: 2883724 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ root) Gid: ( 1000/ root)
Access: 2017-12-30 15:53:46.477442716 +0100
Modify: 2017-12-30 15:53:46.477442716 +0100
Change: 2017-12-30 15:53:46.477442716 +0100
Birth: -
[root@localhost test]$ stat zerofile
File: zerofile
Size: 1073741824 Blocks: 2097160 IO Block: 4096 regular file
Device: fd02h/64770d Inode: 2884453 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ root) Gid: ( 1000/ root)
Access: 2017-12-30 15:54:11.014403727 +0100
Modify: 2017-12-30 15:54:11.311403254 +0100
Change: 2017-12-30 15:54:11.311403254 +0100
Birth: -
Теперь давайте рассмотрим пример с файлом, содержащий только символ [ f16] с размером 1 ГБ на ZFS.
[root@localhost tank1]# du -h afile
33M afile
[root@localhost tank1]# du -h afile --apparent-size
1.0G afile
[root@localhost tank1]# zfs get all tank1 | grep compress
tank1 compressratio 31.16x -
tank1 compression lz4 local
tank1 refcompressratio 31.89x -
Довольно хорошая степень сжатия и отличается от файла, содержащего zeros.
Похоже, ZFS превращает нулевой файл в разреженный файл, когда сжатие включено. Взято из комментария DeHackEd отсюда.
Наиболее вероятный ответ на ваш вопрос: разреженные отверстия не считаются «сжатыми». Это дыры. Вы получаете то же самое на ext4, и оно вообще не поддерживает сжатие. При сжатии ZFS превратит все нулевые страницы в разреженные отверстия.Я также создал некоторые файлы в наборе данных ZFS, используя sparsefile, файл, созданный с /dev/zero, и файл, созданный только с символом a, чтобы получить хорошее сжатие.
] Команды, используемые для создания файлов.
truncate -s $((1024*1024*1024)) /tank1/sparsefile dd if=/dev/zero of=/tank1/zerofile bs=1073741824 count=1 использовали некоторые для циклов, чтобы эхо a в afileСначала проверьте сжатие на пустом наборе файлов tank1.
[root@localhost tank1]# zfs get all tank1 | grep compress
tank1 compressratio 1.00x -
tank1 compression lz4 local
tank1 refcompressratio 1.01x -
Затем создайте разреженный файл и файл из /dev/zero размером 1 ГБ и снова проверьте компрессию.
[root@localhost tank1]# truncate -s $((1024*1024*1024)) sparsefile
[root@localhost tank1]# dd if=/dev/zero of=/tank1/zerofile bs=1073741824 count=1
[root@localhost tank1]# zfs get all tank1 | grep compress
tank1 compressratio 1.00x -
tank1 compression lz4 local
tank1 refcompressratio 1.01x -
Ничего не изменилось, хотя нулевой файл следует считать довольно хорошим сжимаемым. При использовании sparsefiles пространство никогда не выделяется прямо сейчас, а только по требованию. Это поведение в любой файловой системе, так как это независимая от файловой системы. Все, что делается, это установить параметр «Размер», но не выделяет никаких блоков, как вы можете видеть из stat.
[root@localhost tank1]# stat sparsefile
File: ‘sparsefile’
Size: 1073741824 Blocks: 1 IO Block: 131072 regular file
Device: 2ah/42d Inode: 2 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-12-30 15:31:37.512845721 +0100
Modify: 2017-12-30 15:31:37.513845720 +0100
Change: 2017-12-30 15:31:37.513845720 +0100
Birth: -
[root@localhost tank1]# stat zerofile
File: ‘zerofile’
Size: 1073741824 Blocks: 1 IO Block: 131072 regular file
Device: 2ah/42d Inode: 3 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-12-30 15:31:41.742838662 +0100
Modify: 2017-12-30 15:31:42.616837203 +0100
Change: 2017-12-30 15:31:42.616837203 +0100
Birth: -
Итак, нулевой файл и нулевой файл выглядят почти одинаково и имеют только один выделенный блок. Если мы сделаем то же самое на ext4, мы можем видеть разницу, поскольку выделены блоки для Size .
[root@localhost test]$ stat sparsefile
File: sparsefile
Size: 1073741824 Blocks: 0 IO Block: 4096 regular file
Device: fd02h/64770d Inode: 2883724 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ root) Gid: ( 1000/ root)
Access: 2017-12-30 15:53:46.477442716 +0100
Modify: 2017-12-30 15:53:46.477442716 +0100
Change: 2017-12-30 15:53:46.477442716 +0100
Birth: -
[root@localhost test]$ stat zerofile
File: zerofile
Size: 1073741824 Blocks: 2097160 IO Block: 4096 regular file
Device: fd02h/64770d Inode: 2884453 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ root) Gid: ( 1000/ root)
Access: 2017-12-30 15:54:11.014403727 +0100
Modify: 2017-12-30 15:54:11.311403254 +0100
Change: 2017-12-30 15:54:11.311403254 +0100
Birth: -
Теперь давайте рассмотрим пример с файлом, содержащий только символ a с размером 1 ГБ на ZFS.
[root@localhost tank1]# du -h afile
33M afile
[root@localhost tank1]# du -h afile --apparent-size
1.0G afile
[root@localhost tank1]# zfs get all tank1 | grep compress
tank1 compressratio 31.16x -
tank1 compression lz4 local
tank1 refcompressratio 31.89x -
Довольно хорошая степень сжатия и отличается от файла, содержащего zeros.
Похоже, ZFS превращает нулевой файл в разреженный файл, когда сжатие включено. Взято из комментария DeHackEd отсюда.
Наиболее вероятный ответ на ваш вопрос: разреженные отверстия не считаются «сжатыми». Это дыры. Вы получаете то же самое на ext4, и оно вообще не поддерживает сжатие. При сжатии ZFS превратит все нулевые страницы в разреженные отверстия.Я также создал некоторые файлы в наборе данных ZFS, используя sparsefile, файл, созданный с /dev/zero, и файл, созданный только с символом a, чтобы получить хорошее сжатие.
] Команды, используемые для создания файлов.
truncate -s $((1024*1024*1024)) /tank1/sparsefile dd if=/dev/zero of=/tank1/zerofile bs=1073741824 count=1 использовали некоторые для циклов, чтобы эхо a в afileСначала проверьте сжатие на пустом наборе файлов tank1.
[root@localhost tank1]# zfs get all tank1 | grep compress
tank1 compressratio 1.00x -
tank1 compression lz4 local
tank1 refcompressratio 1.01x -
Затем создайте разреженный файл и файл из /dev/zero размером 1 ГБ и снова проверьте компрессию.
[root@localhost tank1]# truncate -s $((1024*1024*1024)) sparsefile
[root@localhost tank1]# dd if=/dev/zero of=/tank1/zerofile bs=1073741824 count=1
[root@localhost tank1]# zfs get all tank1 | grep compress
tank1 compressratio 1.00x -
tank1 compression lz4 local
tank1 refcompressratio 1.01x -
Ничего не изменилось, хотя нулевой файл следует считать довольно хорошим сжимаемым. При использовании sparsefiles пространство никогда не выделяется прямо сейчас, а только по требованию. Это поведение в любой файловой системе, так как это независимая от файловой системы. Все, что делается, это установить параметр «Размер», но не выделяет никаких блоков, как вы можете видеть из stat.
[root@localhost tank1]# stat sparsefile
File: ‘sparsefile’
Size: 1073741824 Blocks: 1 IO Block: 131072 regular file
Device: 2ah/42d Inode: 2 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-12-30 15:31:37.512845721 +0100
Modify: 2017-12-30 15:31:37.513845720 +0100
Change: 2017-12-30 15:31:37.513845720 +0100
Birth: -
[root@localhost tank1]# stat zerofile
File: ‘zerofile’
Size: 1073741824 Blocks: 1 IO Block: 131072 regular file
Device: 2ah/42d Inode: 3 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-12-30 15:31:41.742838662 +0100
Modify: 2017-12-30 15:31:42.616837203 +0100
Change: 2017-12-30 15:31:42.616837203 +0100
Birth: -
Итак, нулевой файл и нулевой файл выглядят почти одинаково и имеют только один выделенный блок. Если мы сделаем то же самое на ext4, мы можем видеть разницу, поскольку выделены блоки для Size .
[root@localhost test]$ stat sparsefile
File: sparsefile
Size: 1073741824 Blocks: 0 IO Block: 4096 regular file
Device: fd02h/64770d Inode: 2883724 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ root) Gid: ( 1000/ root)
Access: 2017-12-30 15:53:46.477442716 +0100
Modify: 2017-12-30 15:53:46.477442716 +0100
Change: 2017-12-30 15:53:46.477442716 +0100
Birth: -
[root@localhost test]$ stat zerofile
File: zerofile
Size: 1073741824 Blocks: 2097160 IO Block: 4096 regular file
Device: fd02h/64770d Inode: 2884453 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ root) Gid: ( 1000/ root)
Access: 2017-12-30 15:54:11.014403727 +0100
Modify: 2017-12-30 15:54:11.311403254 +0100
Change: 2017-12-30 15:54:11.311403254 +0100
Birth: -
Теперь давайте рассмотрим пример с файлом, содержащий только символ a с размером 1 ГБ на ZFS.
[root@localhost tank1]# du -h afile
33M afile
[root@localhost tank1]# du -h afile --apparent-size
1.0G afile
[root@localhost tank1]# zfs get all tank1 | grep compress
tank1 compressratio 31.16x -
tank1 compression lz4 local
tank1 refcompressratio 31.89x -
Довольно хорошая степень сжатия и отличается от файла, содержащего zeros.