dedup

zfs send -D と dedup

zfs send -DというのがあるのでFreeBSDであそんでみた。

まずはファイルシステムをつくってdedupが効きそうなファイルを5つ作る。

# zfs create tank/test
# cd /tank/test
# dd if=/dev/urandom of=file1 bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes transferred in 2.452660 secs (42752602 bytes/sec)
# ls -l file1
-rw-r--r--  1 root  wheel  104857600  6月 14 23:51 file1
# cp file1 file2
# cp file1 file3
# cp file1 file4
# cp file1 file5
# df -h /tank/test
Filesystem    Size    Used   Avail Capacity  Mounted on
tank/test     640G    499M    639G     0%    /tank/test

※tank/testはdedup=off

スナップショットをつくってファイルシステムイメージ(full stream)をとる。

# zfs snapshot tank/test@freeze
# zfs send tank/test@freeze >/tmp/tank-test-freeze.zfs
# zfs send -D tank/test@freeze >/tmp/tank-test-freeze.ddzfs
# ls -l /tmp/tank-test-freeze*zfs
-rw-r--r--  1 root  wheel  106120104  6月 14 23:55 /tmp/tank-test-freeze.ddzfs
-rw-r--r--  1 root  wheel  525550504  6月 14 23:55 /tmp/tank-test-freeze.zfs

zfs send -Dで作成するとdedupが効いて1/5になっているのがわかる。

受け側のファイルシステムをつくってファイルシステムを複製する。

# zpool create pool /dev/ada1s4 /dev/ada2s4 /dev/ada3s4
# zpool list pool
NAME   SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
pool  29.2G  81.5K  29.2G     0%  1.00x  ONLINE  -
# zfs receive pool/test </tmp/tank-test-freeze.ddzfs
# zpool list pool
NAME   SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
pool  29.2G   501M  28.8G     1%  1.00x  ONLINE  -

dedupが効いたストリームをreceiveしただけではdedupが効かないようだ。

明示的にdedup=onにしてファイルシステムをつくって複製するとOKだった。

# zfs destroy -r pool/test
# zfs create -o dedup=on pool/test
# zfs receive -F pool/test </tmp/tank-test-freeze.ddzfs
# zpool list pool
NAME   SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
pool  29.2G   101M  29.2G     0%  5.00x  ONLINE  -
# zfs send pool/test@freeze >/tmp/pool-test-freeze.zfs
# ls -l /tmp/pool-test-freeze.zfs
-rw-r--r--  1 root  wheel  525550504  6月 15 00:51 /tmp/pool-test-freeze.zfs

dedupが効いているファイルシステムのイメージをとってもdedupが効いたストリームにはならないようだ。

というわけでファイルシステムのdedupとストリームのdedupはまったく別物のようだ。

zfs send -Dでdedupしなくても圧縮プログラムがうまいことやってくれるかもとおもって試してみたが、まったく圧縮されなかった(ファイルの繰り返しの周期が1MiBなのが原因かな)。

% gzip <tank-test-freeze.zfs >tank-test-freeze.zfs.gz
% xz <tank-test-freeze.zfs >tank-test-freeze.zfs.xz
% ls -l tank-test*
-rw-r--r--  1 root  wheel  525550504  6月 15 00:50 tank-test-freeze.zfs
-rw-r--r--  1 koie  wheel  524886344  6月 15 23:52 tank-test-freeze.zfs.gz
-rw-r--r--  1 koie  wheel  525564756  6月 16 00:01 tank-test-freeze.zfs.xz
%

ZFS dedupは効果があるか?

zdb -S でわかるらしいのでやってみた。


% zpool status -v
  pool: tank
 state: ONLINE
status: The pool is formatted using an older on-disk format.  The pool can
        still be used, but some features are unavailable.
action: Upgrade the pool using 'zpool upgrade'.  Once this is done, the
        pool will no longer be accessible on older software versions.
 scan: scrub repaired 0 in 6h35m with 0 errors on Thu May  5 10:04:39 2011
config:

        NAME         STATE     READ WRITE CKSUM
        tank         ONLINE       0     0     0
          raidz1-0   ONLINE       0     0     0
            ada1s2   ONLINE       0     0     0
            ada2s2   ONLINE       0     0     0
            ada3s2   ONLINE       0     0     0
        logs
          label/zil  ONLINE       0     0     0

errors: No known data errors
% zpool iostat
               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
tank        1.06T   898G     15     24   120K   299K
% zpool iostat -v
                capacity     operations    bandwidth
pool         alloc   free   read  write   read  write
-----------  -----  -----  -----  -----  -----  -----
tank         1.06T   898G     15     24   120K   299K
  raidz1     1.06T   898G     15     24   120K   251K
    ada1s2       -      -      4     11   163K   127K
    ada2s2       -      -      4     11   161K   127K
    ada3s2       -      -      4     11   161K   127K
  label/zil   204K  1.95G      0      0     14  48.5K
-----------  -----  -----  -----  -----  -----  -----

% zdb -S tank
Simulated DDT histogram:

bucket              allocated                       referenced
______   ______________________________   ______________________________
refcnt   blocks   LSIZE   PSIZE   DSIZE   blocks   LSIZE   PSIZE   DSIZE
------   ------   -----   -----   -----   ------   -----   -----   -----
     1     336K   9.61G   9.61G   9.67G     336K   9.61G   9.61G   9.67G
     2    6.02K    215M    215M    216M    12.7K    442M    442M    444M
     4      592   9.52M   9.52M   9.64M    2.78K   43.3M   43.3M   43.9M
     8      223   1.77M   1.77M   1.83M    2.13K   18.2M   18.2M   18.7M
    16       19     39K     39K   42.6K      408    854K    854K    931K
    32        7     35K     35K   36.6K      315   1.96M   1.96M   2.03M
    64        5    130K    130K    131K      503   14.9M   14.9M   15.0M
   128        1     512     512     682      178     89K     89K    119K
   256        3   1.50K   1.50K   2.00K    1.17K    598K    598K    797K
   512        3   1.50K   1.50K   2.00K    2.16K   1.08M   1.08M   1.44M
    1K        1     512     512     682    1.20K    612K    612K    816K
 Total     343K   9.83G   9.83G   9.89G     359K   10.1G   10.1G   10.2G

dedup = 1.03, compress = 1.00, copies = 1.01, dedup * compress / copies = 1.02

%

表の意味はよくわからんが、最後の1行だけみると全く効果なしのようだ。

記事検索
月別アーカイブ
アクセスカウンター

    タグ絞り込み検索
    ギャラリー
    • 今日の練習 2018-11-13
    • 今日の練習 2018-11-11
    • 今日の練習 2018-11-11
    • 今日の練習 2018-11-10
    • 今日の練習 2018-11-10
    • 今日の練習 2018-11-10
    Amazon
    楽天市場
    adby google
    LINE読者登録QRコード
    LINE読者登録QRコード
    • ライブドアブログ