2014年3月16日日曜日

3つのOSでZFSの性能を比較

以前にも測定したことがありますが、最近 FreeBSD 10.0 がリリースされたので、日常的操作(コピー、シーケンシャルREAD)で性能比較を行ってみました。
2015-04-18追記、ふたたび比較実験しました。

比較は、
・CentOS 6.5 + ZFS on Linux 0.6.2
・OpenIndiana 151a9
(最近ひっそりとアップデートされた。ただし iso 提供は無し)
・FreeBSD 10.0
の3つの OS で行いました。マシン環境は次の通りです。3つの OS をマルチブートできるようにしてあります。

・lenovo ThinkPad T510
・CPU Intel Core i7 M620 2.67GHz
・MEM 8GB
・OS ディスク R2021D
(Plextor M5M 256GB SSD 2枚によるRAID1)
・ZFS pool (HGST HTS721010A9E630 7200rpm SATA 1TB +
 HITACHI HTS725050A9A634 7200rpm SATA 500GB による mirror構成)
 ※補足:HGST 1T を 2nd HDD ベイに搭載、HITACHI 500G は eSATA 接続で、約400G のパーティションでミラー

まずは、ファイルコピーです。実験データには、CentOS 6 の OS バックアップイメージを使っています。
root@hoge:~# uname -a
SunOS hoge 5.11 oi_151a9 i86pc i386 i86pc Solaris
root@hoge:~# zpool import tank4
root@hoge:~# zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ    CAP  DEDUP  HEALTH  ALTROOT
rpool  11.6G  9.57G  2.06G         -    82%  1.00x  ONLINE  -
tank4   368G   268G  99.7G         -    72%  1.00x  ONLINE  -
root@hoge:~# zpool status tank4
  pool: tank4
 state: ONLINE
status: Some supported features are not enabled on the pool. The pool can
 still be used, but some features are unavailable.
action: Enable all features using 'zpool upgrade'. Once this is done,
 the pool may no longer be accessible by software that does not support
 the features. See zpool-features(5) for details.
  scan: scrub repaired 0 in 1h18m with 0 errors on Sat Mar 15 20:39:47 2014
config:

 NAME          STATE     READ WRITE CKSUM
 tank4         ONLINE       0     0     0
   mirror-0    ONLINE       0     0     0
     c5t3d0p1  ONLINE       0     0     0
     c5t1d0p1  ONLINE       0     0     0

errors: No known data errors
root@hoge:~# cd /tank4/backup
root@hoge:/tank4/backup# ls -l m5m.sda6.dump 
-rw-r--r-- 1 root root 9207209203 2014-02-22 21:51 m5m.sda6.dump
root@hoge:/tank4/backup# cp m5m.sda6.dump m5m.sda6.dump-copied-on-oi151a9

real 3m44.857s
user 0m0.056s
sys 0m16.702s
root@hoge:/tank4/backup# ls -l m5m.sda6.dump*
-rw-r--r-- 1 root root 9207209203 2014-02-22 21:51 m5m.sda6.dump
-rw-r--r-- 1 root root 9207209203 2014-03-16 13:55 m5m.sda6.dump-copied-on-oi151a9
root@hoge:/tank4/backup# cd
root@hoge:~# zpool export tank4
root@hoge:~ # uname -a
FreeBSD hoge 10.0-RELEASE FreeBSD 10.0-RELEASE #0 r260789: Thu Jan 16 22:34:59 UTC 2014     root@snap.freebsd.org:/usr/obj/usr/src/sys/GENERIC  amd64
root@hoge:~ # zpool import tank4
root@hoge:~ # zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
tank4   368G   277G  91.1G    75%  1.00x  ONLINE  -
root@hoge:~ # zpool status
  pool: tank4
 state: ONLINE
status: Some supported features are not enabled on the pool. The pool can
 still be used, but some features are unavailable.
action: Enable all features using 'zpool upgrade'. Once this is done,
 the pool may no longer be accessible by software that does not support
 the features. See zpool-features(7) for details.
  scan: scrub repaired 0 in 1h18m with 0 errors on Sat Mar 15 20:39:47 2014
config:

 NAME                                    STATE     READ WRITE CKSUM
 tank4                                   ONLINE       0     0     0
   mirror-0                              ONLINE       0     0     0
     diskid/DISK-xxxxxxxxxxxxxxxxxxxxs1  ONLINE       0     0     0
     diskid/DISK-yyyyyyyyyyyyyys1        ONLINE       0     0     0

errors: No known data errors
root@hoge:~ # cd /tank4/backup
root@hoge:/tank4/backup # ls -l m5m*
-rw-r--r--  1 root  wheel  9207209203 Feb 22 21:51 m5m.sda6.dump
-rw-r--r--  1 root  wheel  9207209203 Mar 16 13:55 m5m.sda6.dump-copied-on-oi151a9
root@hoge:/tank4/backup # time cp m5m.sda6.dump m5m.sda6.dump-copied-on-freebsd10.0
0.007u 4.455s 4:14.75 1.7% 21+174k 70801+2io 0pf+0w
root@hoge:/tank4/backup # ls -l m5m*
-rw-r--r--  1 root  wheel  9207209203 Feb 22 21:51 m5m.sda6.dump
-rw-r--r--  1 root  wheel  9207209203 Mar 16 14:09 m5m.sda6.dump-copied-on-freebsd10.0
-rw-r--r--  1 root  wheel  9207209203 Mar 16 13:55 m5m.sda6.dump-copied-on-oi151a9
root@hoge:/tank4/backup # cd
root@hoge:~ # zpool export tank4
[root@hoge ~]# uname -a
Linux hoge 2.6.32-431.5.1.el6.x86_64 #1 SMP Wed Feb 12 00:41:43 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
[root@hoge ~]# zpool import tank4
[root@hoge ~]# zpool status
  pool: tank4
 state: ONLINE
  scan: scrub repaired 0 in 1h18m with 0 errors on Sat Mar 15 20:39:47 2014
config:

 NAME                                                        STATE     READ WRITE CKSUM
 tank4                                                       ONLINE       0     0     0
   mirror-0                                                  ONLINE       0     0     0
     ata-HITACHI_HTS725050A9A364_xxxxxxxxxxxxxxxxxxxx-part1  ONLINE       0     0     0
     ata-HGST_HTS721010A9E630_yyyyyyyyyyyyyy-part1           ONLINE       0     0     0

errors: No known data errors
[root@hoge ~]# zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
tank4   368G   285G  82.6G    77%  1.00x  ONLINE  -
[root@hoge ~]# cd /tank4/backup
[root@hoge backup]# ls -l m5m*
-rw-r--r-- 1 root root 9207209203 Feb 22 21:51 m5m.sda6.dump
-rw-r--r-- 1 root root 9207209203 Mar 16 14:09 m5m.sda6.dump-copied-on-freebsd10.0
-rw-r--r-- 1 root root 9207209203 Mar 16 13:55 m5m.sda6.dump-copied-on-oi151a9
[root@hoge backup]# time cp m5m.sda6.dump m5m.sda6.dump-copied-on-centos6

real 3m29.308s
user 0m0.038s
sys 0m6.764s
[root@hoge backup]# ls -l m5m*
-rw-r--r-- 1 root root 9207209203 Feb 22 21:51 m5m.sda6.dump
-rw-r--r-- 1 root root 9207209203 Mar 16 14:21 m5m.sda6.dump-copied-on-centos6
-rw-r--r-- 1 root root 9207209203 Mar 16 14:09 m5m.sda6.dump-copied-on-freebsd10.0
-rw-r--r-- 1 root root 9207209203 Mar 16 13:55 m5m.sda6.dump-copied-on-oi151a9
[root@hoge backup]# zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
tank4   368G   294G  74.0G    79%  1.00x  ONLINE  -

次に、シーケンシャルREAD (ddコマンド利用) です。
キャッシュの影響を避けるため、再起動&zpool import 直後に実行しています。
root@hoge:~# uname -a
SunOS hoge 5.11 oi_151a9 i86pc i386 i86pc Solaris
root@hoge:~# dd if=/tank4/backup/m5m.sda6.dump-copied-on-oi151a9 of=/dev/null bs=1M
8780+1 records in
8780+1 records out
9207209203 bytes (9.2 GB) copied, 106.582 s, 86.4 MB/s
root@hoge:~# dd if=/tank4/backup/m5m.sda6.dump-copied-on-freebsd10.0 of=/dev/null bs=1M
8780+1 records in
8780+1 records out
9207209203 bytes (9.2 GB) copied, 115.16 s, 80.0 MB/s
root@hoge:~# dd if=/tank4/backup/m5m.sda6.dump-copied-on-centos6 of=/dev/null bs=1M
8780+1 records in
8780+1 records out
9207209203 bytes (9.2 GB) copied, 114.334 s, 80.5 MB/s
root@hoge:~ # uname -a
FreeBSD hoge 10.0-RELEASE FreeBSD 10.0-RELEASE #0 r260789: Thu Jan 16 22:34:59 UTC 2014     root@snap.freebsd.org:/usr/obj/usr/src/sys/GENERIC  amd64
root@hoge:~ # dd if=/tank4/backup/m5m.sda6.dump-copied-on-oi151a9 of=/dev/null bs=1M
8780+1 records in
8780+1 records out
9207209203 bytes transferred in 105.113849 secs (87592732 bytes/sec)
root@hoge:~ # dd if=/tank4/backup/m5m.sda6.dump-copied-on-freebsd10.0 of=/dev/null bs=1M
8780+1 records in
8780+1 records out
9207209203 bytes transferred in 114.760721 secs (80229621 bytes/sec)
root@hoge:~ # dd if=/tank4/backup/m5m.sda6.dump-copied-on-centos6 of=/dev/null bs=1M
8780+1 records in
8780+1 records out
9207209203 bytes transferred in 113.732792 secs (80954745 bytes/sec)
[root@hoge ~]# uname -a
Linux hoge 2.6.32-431.5.1.el6.x86_64 #1 SMP Wed Feb 12 00:41:43 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
[root@hoge ~]# dd if=/tank4/backup/m5m.sda6.dump-copied-on-oi151a9 of=/dev/null bs=1M
8780+1 records in
8780+1 records out
9207209203 bytes (9.2 GB) copied, 64.9959 s, 142 MB/s
[root@hoge ~]# dd if=/tank4/backup/m5m.sda6.dump-copied-on-freebsd10.0 of=/dev/null bs=1M
8780+1 records in
8780+1 records out
9207209203 bytes (9.2 GB) copied, 71.2292 s, 129 MB/s
[root@hoge ~]# dd if=/tank4/backup/m5m.sda6.dump-copied-on-centos6 of=/dev/null bs=1M
8780+1 records in
8780+1 records out
9207209203 bytes (9.2 GB) copied, 72.7268 s, 127 MB/s

1ユーザのパーソナル利用環境での数値ですし、参考までですが、実験したワークロードにおいては、CentOS が良好な結果となりました。

あと2点補足ですが、ZFS のチューニング (ARCサイズ調整等) は行っていないデフォルトでの実験結果です。 また、当該 ZFS 領域には圧縮オプションは指定していません。
プールのプロパティを示します。
[root@hoge ~]# zpool get all tank4
NAME   PROPERTY               VALUE                  SOURCE
tank4  size                   368G                   -
tank4  capacity               79%                    -
tank4  altroot                -                      default
tank4  health                 ONLINE                 -
tank4  guid                   1893700132493715388    default
tank4  version                -                      default
tank4  bootfs                 -                      default
tank4  delegation             on                     default
tank4  autoreplace            off                    default
tank4  cachefile              -                      default
tank4  failmode               wait                   default
tank4  listsnapshots          off                    default
tank4  autoexpand             off                    default
tank4  dedupditto             0                      default
tank4  dedupratio             1.00x                  -
tank4  free                   74.0G                  -
tank4  allocated              294G                   -
tank4  readonly               off                    -
tank4  ashift                 12                     local
tank4  comment                -                      default
tank4  expandsize             0                      -
tank4  freeing                0                      default
tank4  feature@async_destroy  enabled                local
tank4  feature@empty_bpobj    active                 local
tank4  feature@lz4_compress   active                 local
[root@hoge ~]# zfs get all tank4/backup
NAME          PROPERTY              VALUE                  SOURCE
tank4/backup  type                  filesystem             -
tank4/backup  creation              Sat Feb  1  9:43 2014  -
tank4/backup  used                  66.4G                  -
tank4/backup  available             67.2G                  -
tank4/backup  referenced            66.4G                  -
tank4/backup  compressratio         1.00x                  -
tank4/backup  mounted               yes                    -
tank4/backup  quota                 none                   default
tank4/backup  reservation           none                   default
tank4/backup  recordsize            128K                   default
tank4/backup  mountpoint            /tank4/backup          default
tank4/backup  sharenfs              off                    default
tank4/backup  checksum              on                     default
tank4/backup  compression           off                    local
tank4/backup  atime                 off                    inherited from tank4
tank4/backup  devices               on                     default
tank4/backup  exec                  on                     default
tank4/backup  setuid                on                     default
tank4/backup  readonly              off                    default
tank4/backup  zoned                 off                    default
tank4/backup  snapdir               hidden                 default
tank4/backup  aclinherit            restricted             default
tank4/backup  canmount              on                     default
tank4/backup  xattr                 on                     default
tank4/backup  copies                1                      default
tank4/backup  version               4                      -
tank4/backup  utf8only              off                    -
tank4/backup  normalization         none                   -
tank4/backup  casesensitivity       sensitive              -
tank4/backup  vscan                 off                    default
tank4/backup  nbmand                off                    default
tank4/backup  sharesmb              off                    default
tank4/backup  refquota              none                   default
tank4/backup  refreservation        none                   default
tank4/backup  primarycache          all                    default
tank4/backup  secondarycache        all                    default
tank4/backup  usedbysnapshots       0                      -
tank4/backup  usedbydataset         66.4G                  -
tank4/backup  usedbychildren        0                      -
tank4/backup  usedbyrefreservation  0                      -
tank4/backup  logbias               latency                default
tank4/backup  dedup                 off                    default
tank4/backup  mlslabel              none                   default
tank4/backup  sync                  standard               default
tank4/backup  refcompressratio      1.00x                  -
tank4/backup  written               66.4G                  -
tank4/backup  snapdev               hidden                 default

なお、手持ちデータがありませんので、ここ2年ほど ZFS on Linux を使ってみた経験上の話しですが、多数のファイルを含む tar ファイルの展開のような、メタデータ処理が多いワークロードは、ext4 等と比べて苦手なようです。あと、NFS はかなり苦手(ZIL使わない/使えない場合)のようで、NFS export する場合は、ZVOL + ext4 として export すると良い結果が得られると思います。ZVOL でも圧縮機能や snapshot を使えるので有益ですし、オンラインで割り当てサイズ (volsize) 拡張することも可能です。

2014-03-23追記
tar の展開についても比較してみました。展開に使ったアーカイブは、btrfs の実験に使ったものと同じです。
root@hoge:~# uname -a
SunOS hoge 5.11 oi_151a9 i86pc i386 i86pc Solaris
root@hoge:~# zpool import tank4
root@hoge:~# cd /tank4/backup
root@hoge:/tank4/backup# ls -l sda6.tar
-rw-r--r-- 1 root root 10927441920 2013-10-20 22:44 sda6.tar
root@hoge:/tank4/backup# time tar xf sda6.tar

real    4m2.966s
user    0m4.219s
sys     1m8.711s
root@hoge:/tank4/backup# time rm -rf test.restore

real    0m27.575s
user    0m0.495s
sys     0m7.178s
root@hoge:/tank4/backup# cd
root@hoge:~# zpool export tank4
root@hoge:~ # uname -a
FreeBSD hoge 10.0-RELEASE FreeBSD 10.0-RELEASE #0 r260789: Thu Jan 16 22:34:59 UTC 2014     root@snap.freebsd.org:/usr/obj/usr/src/sys/GENERIC  amd64
root@hoge:~ # zpool import tank4
root@hoge:~ # cd /tank4/backup
backup/  backup2/ backup3/
root@hoge:~ # cd /tank4/backup
root@hoge:/tank4/backup # ls -l sda6.tar
-rw-r--r--+ 1 root  wheel  10927441920 Oct 20 22:44 sda6.tar
root@hoge:/tank4/backup # time tar xf sda6.tar
3.651u 29.506s 5:08.18 10.7%    66+173k 59704+418539io 12pf+0w
root@hoge:/tank4/backup # time rm -rf test.restore
0.336u 12.340s 1:09.05 18.3%    15+165k 26766+0io 0pf+0w
root@hoge:/tank4/backup # cd
root@hoge:~ # zpool export tank4
[root@hoge ~]# uname -a
Linux hoge 2.6.32-431.5.1.el6.x86_64 #1 SMP Wed Feb 12 00:41:43 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
[root@hoge ~]# zpool import tank4
[root@hoge ~]# cd /tank4/backup
[root@hoge backup]# ls -l sda6.tar
-rw-r--r-- 1 root root 10927441920 Oct 20 22:44 sda6.tar
[root@hoge backup]# time tar xf sda6.tar

real    3m51.565s
user    0m3.033s
sys     0m46.419s
[root@hoge backup]# time rm -rf test.restore

real    2m1.249s
user    0m0.471s
sys     0m16.205s
[root@hoge backup]# cd
[root@hoge ~]# zpool export tank4
この実験では、CentOS は、削除(rm)が苦手という結果になりました。現在の Linux 実装は、vmalloc に依存しており(meminfo を見ればわかります)、そこら辺に性能が出ない原因があるのではと思いますが、将来は他の Linux の fs と同様にページキャッシュを使う構造になるはず(既に試みが行われている)であり、まだ、性能向上の余地が残っているということでもあろうと思います。

2014-03-25追記
ものはついでに、LZ4 圧縮を有効にした場合についても、やってみました。
root@hoge:~# uname -a
SunOS hoge 5.11 oi_151a9 i86pc i386 i86pc Solaris
root@hoge:~# zpool import tank4
root@hoge:~# zpool list tank4
NAME    SIZE  ALLOC   FREE  EXPANDSZ    CAP  DEDUP  HEALTH  ALTROOT
tank4   368G   271G  96.7G         -    73%  1.00x  ONLINE  -
root@hoge:~# zfs list tank4/backup
NAME           USED  AVAIL  REFER  MOUNTPOINT
tank4/backup  72.8G  89.9G  72.8G  /tank4/backup
root@hoge:~# zfs get compression tank4/backup
NAME          PROPERTY     VALUE     SOURCE
tank4/backup  compression  off       local
root@hoge:~# zfs set compression=lz4 tank4/backup
root@hoge:~# zfs get compression tank4/backup
NAME          PROPERTY     VALUE     SOURCE
tank4/backup  compression  lz4       local
root@hoge:~# cd /tank4/backup
root@hoge:/tank4/backup# ls -l sda6.tar 
-rw-r--r-- 1 root root 10927441920 2013-10-20 22:44 sda6.tar
root@hoge:/tank4/backup# time tar xf sda6.tar 

real 2m40.653s
user 0m4.100s
sys 0m50.868s
root@hoge:/tank4/backup# time rm -rf test.restore

real 0m15.588s
user 0m0.425s
sys 0m6.385s
root@hoge:/tank4/backup# cd
root@hoge:~# zpool export tank4
root@hoge:~ # uname -a
FreeBSD hoge 10.0-RELEASE FreeBSD 10.0-RELEASE #0 r260789: Thu Jan 16 22:34:59 UTC 2014     root@snap.freebsd.org:/usr/obj/usr/src/sys/GENERIC  amd64
root@hoge:~ # zpool import tank4
root@hoge:~ # zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
tank4   368G   271G  96.7G    73%  1.00x  ONLINE  -
root@hoge:~ # zfs list tank4/backup
NAME           USED  AVAIL  REFER  MOUNTPOINT
tank4/backup  72.8G  89.9G  72.8G  /tank4/backup
root@hoge:~ # zfs get compression tank4/backup
NAME          PROPERTY     VALUE     SOURCE
tank4/backup  compression  lz4       local
root@hoge:~ # cd /tank4/backup
root@hoge:/tank4/backup # ls -l sda6.tar 
-rw-r--r--+ 1 root  wheel  10927441920 Oct 20 22:44 sda6.tar
root@hoge:/tank4/backup # time tar xf sda6.tar 
3.772u 29.051s 3:11.58 17.1% 66+173k 56955+418539io 12pf+0w
root@hoge:/tank4/backup # time rm -rf test.restore
0.446u 11.615s 0:42.61 28.2% 15+171k 17198+0io 0pf+0w
root@hoge:/tank4/backup # cd
root@hoge:~ # zpool export tank4
[root@hoge ~]# uname -a
Linux hoge 2.6.32-431.5.1.el6.x86_64 #1 SMP Wed Feb 12 00:41:43 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
[root@hoge ~]# zpool import tank4
[root@hoge ~]# zpool list tank4
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
tank4   368G   271G  96.7G    73%  1.00x  ONLINE  -
[root@hoge ~]# zfs list tank4/backup
NAME           USED  AVAIL  REFER  MOUNTPOINT
tank4/backup  72.8G  89.9G  72.8G  /tank4/backup
[root@hoge ~]# zfs get compression tank4/backup
NAME          PROPERTY     VALUE     SOURCE
tank4/backup  compression  lz4       local
[root@hoge ~]# cd /tank4/backup
[root@hoge backup]# ls -l sda6.tar 
-rw-r--r-- 1 root root 10927441920 Oct 20 22:44 sda6.tar
[root@hoge backup]# time tar xf sda6.tar 

real 2m15.379s
user 0m3.018s
sys 0m44.704s
[root@hoge backup]# time rm -rf test.restore

real 1m18.267s
user 0m0.318s
sys 0m13.814s
[root@hoge backup]# cd
[root@hoge ~]# zpool export tank4
すごい効果です。CentOS の tar 展開の処理時間は、Btrfs の compress-force=lzo の実験結果と同等です。それにしても、OpenIndiana の rm は抜群に速い(FreeBSDの2倍以上)ですね。

2014-04-29追記
RHEL7.0 RC と、最新の ZFS(未だに 0.6.3 が出ないので GitHub から落とした)を試してみました。こちら

0 件のコメント:

コメントを投稿

人気ブログランキングへ にほんブログ村 IT技術ブログへ