Ubuntu VMには、非常にvery圧縮可能なデータセットを含むボリュームがあります。
このため、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%の場合、ZFSがそのステータスをどのように表すかに応じて、0.01xまたは99.0xが表示されると予想されます。
いろいろと調べてみると、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は、圧縮が有効になっている場合、すべてヌルのページをスパースホールに変換します。
また、適切な圧縮を得るために、スパースファイル、/dev/zero
から作成されたファイル、およびa
文字のみで作成されたファイルを使用して、ZFSデータセット上にいくつかのファイルを作成しました。
ファイルの作成に使用されるコマンド。
truncate -s $((1024*1024*1024)) /tank1/sparsefile
dd if=/dev/zero of=/tank1/zerofile bs=1073741824 count=1
a
をafile
にエコーするためにいくつかのforループを使用しました最初に、空のファイルセットtank1
の圧縮率を確認します。
[root@localhost tank1]# zfs get all tank1 | grep compress
tank1 compressratio 1.00x -
tank1 compression lz4 local
tank1 refcompressratio 1.01x -
次に、スパースファイルとサイズが1GBの/dev/zero
からファイルを作成し、圧縮率を再度確認します。
[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 -
zerofileは非常に優れた圧縮可能ファイルと見なされるべきですが、何も変更されていません。スパースファイルを使用する場合、スペースは現在割り当てられることはなく、オンデマンドでのみ割り当てられます。これは、ファイルシステムに依存しないため、任意のファイルシステムでの動作です。
すべての処理はSizeパラメーターを設定することですが、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: -
sparsefileとzerofileはほとんど同じように見え、 1ブロックが割り当てられました。ext4
ファイルシステムで同じことを行うと、zerofileのブロックが割り当てられるときに違いがわかります。
[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: -
次に、ZFSで1GBのサイズの文字a
のみを含むファイルの例を見てみましょう。
[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
を含むファイルとは異なります。