性能はVMWareサーバの仮想マシン内で試してみた。新規の仮想ディスクを作成して、ディスク内の8Gバイトの領域をあらかじめ割り当てた。仮想化を使用することがベンチマーク全体に対して影響を与えると考えられるが、FUSE経由でZFSを実行した場合に期待できる性能は、仮想マシン内でのZFSと仮想マシン内でのカーネル内ファイルシステムとの性能比からある程度の予測ができるはずだ。カーネル内のLinuxファイルシステムとしては、今回使用したBonnie++ベンチマークのような大規模ファイルについての性能が高いXFSを使用した。
ZFSの設計は、ほとんどのLinuxファイルシステムとやや異なっている。ZFSでは、1つ以上のパーティーションがある状態でまずはZFSの「プール」を作成し、その後プールの中に必要な数のファイルシステムを作成する。今回はベンチマーク用として、8Gバイトの仮想ディスク上の単一のパーティーション内に単一のプールを作成し、そのプールの中に2つのZFSファイルシステムを作成した。一方XFSのベンチマークのためには、ZFSが使用していたパーティーションのZFSのデータをすべて消去した後、そのパーティーション上に直接XFSファイルシステムを作成した。
以下にZFSファイルシステムの作成とベンチマークの様子を示す。まず始めにfdiskを使ってディスク全体を占めるパーティーション1つを新規に作成した。その後「zpool create」コマンドを使って新規のプールを作成し、前記で作成したパーティーションにそのプールを割り当てた。「-n」オプションをつければ、実際にはプールを作成せずにコマンドの結果をシミュレーションする。分かりやすくするためにその結果も以下に示した。その後zfsコマンドを使ってtank/testfsというZFSファイルシステムを作成すると、以下のように普通のdfコマンドを使って/tank/testfsとしてLinuxカーネルからアクセス可能な新しいファイルシステムができる。それからBonnieベンチマークを実行した。なおベンチマークは、初回の実行ゆえの何らかの悪影響を受けていない数値を得るために何度か実行した。
# fdisk /dev/sdd
...
Disk /dev/sdd: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
...
/dev/sdd1 1 1044 8385898+ 83 Linux
...
# zfs-fuse
# zpool create -n tank /dev/sdd1
would create 'tank' with the following layout:
tank
sdd1
# zpool create tank /dev/sdd1
# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 7.94G 92.5K 7.94G 0% ONLINE -
# zfs create tank/testfs
# df -h /tank/testfs/
Filesystem Size Used Avail Use% Mounted on
tank/testfs 7.9G 18K 7.9G 1% /tank/testfs
$ cd /tank/testfs
$ /usr/sbin/bonnie++ -d `pwd`
...
$ /usr/sbin/bonnie++ -d `pwd`
Version 1.03 ------Sequential Output------ --Sequential Input- --Random-
-Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP
linuxcomf8 4G 12373 24 14707 11 10604 8 33935 50 36985 3 109.0 0
------Sequential Create------ --------Random Create--------
-Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
16 2272 17 3657 20 2754 18 2534 15 3736 20 3061 20
linuxcomf8,4G,12373,24,14707,11,10604,8,33935,50,36985,3,109.0,0,16,2272,17,3657,20,2754,18,2534,15,3736,20,3061,20
以下に、XFSファイルシステム上でBonnieベンチマークを実行した様子を示す。やはりベンチマークは複数回実行した。
# mkfs.xfs /dev/sdd1
meta-data=/dev/sdd1 isize=256 agcount=8, agsize=262059 blks
= sectsz=512 attr=0
data = bsize=4096 blocks=2096472, imaxpct=25
= sunit=0 swidth=0 blks, unwritten=1
naming =version 2 bsize=4096
log =internal log bsize=4096 blocks=2560, version=1
= sectsz=512 sunit=0 blks, lazy-count=0
realtime =none extsz=4096 blocks=0, rtextents=0
# mkdir /raw
# mount /dev/sdd1 /raw
$ cd /raw
$ /usr/sbin/bonnie++ -d `pwd`
...
$ /usr/sbin/bonnie++ -d `pwd`
Version 1.03 ------Sequential Output------ --Sequential Input- --Random-
-Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP
linuxcomf8 4G 38681 65 34840 6 16528 6 18312 40 18585 5 365.8 2
------Sequential Create------ --------Random Create--------
-Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
16 1250 26 +++++ +++ 3032 39 2883 69 +++++ +++ 3143 59
linuxcomf8,4G,38681,65,34840,6,16528,6,18312,40,18585,5,365.8,2,16,1250,26,+++++,+++,3032,39,2883,69,+++++,+++,3143,59
ベンチマーク結果から分かるように、FUSE経由でZFSを使った場合、出力操作についてはXFSの30〜60%の性能しか得られないようだ。一方、キャラクタ入力とブロック入力についてのテストでは、FUSEが行うキャッシュの効果によってzfs-fuseの性能の方がXFSよりも顕著に優れていた。つまり実用上の観点から言えば、書き込みよりも読み取りを多く行うファイルシステムの場合には、FUSE経由でZFSを使用することによる速度的なマイナスはないということだ。またzfs-fuseでの書き込み操作の性能がカーネル内ファイルシステムと比べたときに劣るとは言っても、システムが使用に耐えないというほどではない。ただし例のごとく、期待通りの性能を得られるかどうかについては、各自の使用目的についてのベンチマークを行って確かめるべきだろう。
Copyright © 2010 OSDN Corporation, All Rights Reserved.