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

    タグ絞り込み検索

    dedup

    2011年06月15日00:55zfs 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
    %
    


    このエントリーをはてなブックマークに追加
    2011年05月12日15:08ZFS 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行だけみると全く効果なしのようだ。



    このエントリーをはてなブックマークに追加