2012年11月23日金曜日

ZVOL の性能

CentOS 6 + ZFS on Linux 0.6.0-rc12 において、ZVOL (ZFS プールの一部をブロックデバイスとして export する機能= LVM 的な機能) を使用したいと思い、利用方法調査と性能測定をやってみました。測定環境は、以前と同様に ThinkPad T510 です。

まず、設定方法は次の通りです。
# zfs list
NAME    USED  AVAIL  REFER  MOUNTPOINT
tank1  2.07M  58.6G   156K  /tank1
# zfs create -V 30G tank1/zvol
# zfs get all tank1/zvol
NAME        PROPERTY              VALUE                  SOURCE
tank1/zvol  type                  volume                 -
tank1/zvol  creation              Fri Nov 23 12:14 2012  -
tank1/zvol  used                  30.9G                  -
tank1/zvol  available             58.6G                  -
tank1/zvol  referenced            72K                    -
tank1/zvol  compressratio         1.00x                  -
tank1/zvol  reservation           none                   default
tank1/zvol  volsize               30G                    local
tank1/zvol  volblocksize          8K                     -
tank1/zvol  checksum              on                     default
tank1/zvol  compression           off                    default
tank1/zvol  readonly              off                    default
tank1/zvol  copies                1                      default
tank1/zvol  refreservation        30.9G                  local
tank1/zvol  primarycache          all                    default
tank1/zvol  secondarycache        all                    default
tank1/zvol  usedbysnapshots       0                      -
tank1/zvol  usedbydataset         72K                    -
tank1/zvol  usedbychildren        0                      -
tank1/zvol  usedbyrefreservation  30.9G                  -
tank1/zvol  logbias               latency                default
tank1/zvol  dedup                 off                    default
tank1/zvol  mlslabel              none                   default
tank1/zvol  sync                  standard               default
tank1/zvol  refcompressratio      1.00x                  -
tank1/zvol  written               72K                    -
# ls -l /dev/zvol/tank1/zvol 
lrwxrwxrwx 1 root root 9 Nov 23 12:15 /dev/zvol/tank1/zvol -> ../../zd0
# ls -l /dev/zd0
brw-rw---- 1 root disk 230, 0 Nov 23 12:15 /dev/zd0
このように、/dev/zd0 が生成されます。

今回は、作成されたブロックデバイスを ext4 にして、性能測定を行いました。
# mkfs -t ext4 /dev/zvol/tank1/zvol 
mke2fs 1.41.12 (17-May-2010)
Discarding device blocks: done                            
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=2 blocks, Stripe width=2 blocks
1966080 inodes, 7864320 blocks
393216 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
240 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
 4096000

Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 24 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
# mount /dev/zvol/tank1/zvol /mnt_tank1_zvol/
# df /mnt_tank1_zvol/
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/zd0              30963708    176064  29214780   1% /mnt_tank1_zvol
いちおう、io scheduler を3種類 (cfq, noop, deadline) 試しましたが、deadline が最も良好でしたので、その結果のみ掲載します。
# echo deadline > /sys/block/sdd/queue/scheduler 
# cat /sys/block/sdd/queue/scheduler 
noop anticipatory [deadline] cfq 
# bonnie++ -u root -d /mnt_tank1_zvol/
...
Version  1.96       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -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
xxxx         15464M   940  96 40404   4 19568   3  2630  60 68826   5  4712  63
Latency             14844us    4526ms    4292ms     400ms     417ms    6134us
Version  1.96       ------Sequential Create------ --------Random Create--------
xxxx                -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16 20098  18 +++++ +++ +++++ +++ +++++ +++ +++++ +++ +++++ +++
Latency               108us     927us     473us     169us      25us      54us
1.96,1.96,xxxx,1,1353630877,15464M,,940,96,40404,4,19568,3,2630,60,68826,5,4712,63,16,,,,,20098,18,+++++,+++,+++++,+++,+++++,+++,+++++,+++,+++++,+++,14844us,4526ms,4292ms,400ms,417ms,6134us,108us,927us,473us,169us,25us,54us
ベースの ZFS プール(tank1)の性能に対して、シーケンシャル WRITE で、約25% ほどの性能低下です。

2012年11月11日日曜日

ZFS と io scheduler

CentOS 6 で ZFS on Linux を利用する場合に、io scheduler が性能にどのように影響するのか、少しだけ実験してみました。ZFS は自身で I/O スケジューリングを行うはずなので、Linux の io scheduler は邪魔ではないかと思ったもので。。

順番に cfq(デフォルト), noop, deadline の場合の bonnie++ のデータです。
# cat /sys/block/sdd/queue/scheduler 
noop anticipatory deadline [cfq]
# bonnie++ -u root -d /tank1
...
Version  1.96       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -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
xxxx         15464M   144  99 60984  12 35507   9   345  90 95825  10 800.4  26
Latency               103ms     212ms    1351ms     751ms     547ms     556ms
Version  1.96       ------Sequential Create------ --------Random Create--------
xxxx                -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16  9603  93 +++++ +++ 25418  97  7615  94 +++++ +++ 20001  97
Latency             37143us     734us     584us   86610us     101us    1078us
1.96,1.96,xxxx,1,1352637907,15464M,,144,99,60984,12,35507,9,345,90,95825,10,800.4,26,16,,,,,9603,93,+++++,+++,25418,97,7615,94,+++++,+++,20001,97,103ms,212ms,1351ms,751ms,547ms,556ms,37143us,734us,584us,86610us,101us,1078us
# echo noop > /sys/block/sdd/queue/scheduler 
# cat /sys/block/sdd/queue/scheduler 
[noop] anticipatory deadline cfq
# bonnie++ -u root -d /tank1
...
Version  1.96       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -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
xxxx         15464M   149  99 53196  11 34046   9   360  92 105384  12 853.4  26
Latency             95853us     418ms    1455ms     596ms     374ms     561ms
Version  1.96       ------Sequential Create------ --------Random Create--------
xxxx                -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16  9562  92 +++++ +++ 25809  96 10773  96 +++++ +++ 10272  98
Latency             35613us     299us     819us   49027us      97us     387us
1.96,1.96,xxxx,1,1352612707,15464M,,149,99,53196,11,34046,9,360,92,105384,12,853.4,26,16,,,,,9562,92,+++++,+++,25809,96,10773,96,+++++,+++,10272,98,95853us,418ms,1455ms,596ms,374ms,561ms,35613us,299us,819us,49027us,97us,387us
# echo deadline > /sys/block/sdd/queue/scheduler 
# cat /sys/block/sdd/queue/scheduler 
noop anticipatory [deadline] cfq 
# bonnie++ -u root -d /tank1
...
Version  1.96       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -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
xxxx         15464M   148  99 54315  11 34406   9   355  91 105448  12 831.9  24
Latency               107ms     289ms    1232ms     689ms     318ms     621ms
Version  1.96       ------Sequential Create------ --------Random Create--------
xxxx                -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16  9649  93 +++++ +++ 23925  85 16976  95 +++++ +++ 27138  97
Latency             35409us     735us     339us   54244us      25us     128us
1.96,1.96,xxxx,1,1352612140,15464M,,148,99,54315,11,34406,9,355,91,105448,12,831.9,24,16,,,,,9649,93,+++++,+++,23925,85,16976,95,+++++,+++,27138,97,107ms,289ms,1232ms,689ms,318ms,621ms,35409us,735us,339us,54244us,25us,128us
あちらを立てればこちらが立たず という感じです。

また、io scheduler をいじっても、FreeBSD 9.0 の ZFS 性能にはかなわないようです。
としても、CentOS 6 で ZFS を普通に使える (わたしの利用レベルでは安定しています) ことは、ありがたいことです。

最後に、この記事の掲載データは、FreeBSD 9.0 のデータを測ったのと同じマシン (ThinkPad T510)、同じボリューム (eSATA 接続の古い SAMSUNG製 SSD) のものです。

2012年10月28日日曜日

CentOS 6 と CentOS 5 で ZFS を共用する

CentOS 5 では、ZFS on Linux が使えない (ビルドできない) ので、zfs-fuse を使うよりないのですが、マルチブート環境で、CentOS 6 と共用したいため、そのための設定方法メモです。

zfs-fuse のほうが zpool および zfs のバージョンが低いので、CentOS 6 に ZFS on Linux を導入した環境で、次のようにバージョンを指定してストレージプールを作成すれば、マルチブートで共用できるようになります。
# zpool create -o ashift=12 -o version=23 -O version=4 tank1 /dev/disk/by-id/scsi-SATA_External_Disk_0AL25744_6000092__0_S-part1
# fdisk -u -l /dev/sdd | grep sdd1
/dev/sdd1            2048   125045423    62521688   83  Linux
ここで、ashift=12 は AFT 対応 HDD (物理セクタサイズが 4K の HDD) の場合に指定すると効果があるパラメータですが、zfs-fuse 付属の zpool コマンドでは指定できません。また、上記のようにパーティションを切っている場合は、先頭セクタ番号が 8 の倍数になるように調整しておく必要があります。

ベンチマーク結果を参考に載せておきます。
まず、CentOS 6 + ZFS on Linux 0.6.0-rc11 の場合です。
# uname -a
Linux xxxx 2.6.32-279.11.1.el6.x86_64 #1 SMP Tue Oct 16 15:57:10 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
# zpool get guid tank1
NAME   PROPERTY  VALUE  SOURCE
tank1  guid      4585092805656841166  local
# zpool status
  pool: tank1
 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: none requested
config:

 NAME                                                   STATE     READ WRITE CKSUM
 tank1                                                  ONLINE       0     0     0
   scsi-SATA_External_Disk_0AL25744_6000092__0_S-part1  ONLINE       0     0     0

errors: No known data errors
# bonnie++ -u root -d /tank1
...
Version  1.96       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -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
xxxx         15464M   161  99 60368  12 35164   9   371  94 96024  10 807.8  26
Latency             99022us     443ms    1407ms     332ms     546ms    1067ms
Version  1.96       ------Sequential Create------ --------Random Create--------
xxxx                -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16  9314  91 +++++ +++ 24604  97  9976  95 +++++ +++  9474  98
Latency             48790us     741us     505us   53719us     128us    1094us
1.96,1.96,xxxx,1,1350830603,15464M,,161,99,60368,12,35164,9,371,94,96024,10,807.8,26,16,,,,,9314,91,+++++,+++,24604,97,9976,95,+++++,+++,9474,98,99022us,443ms,1407ms,332ms,546ms,1067ms,48790us,741us,505us,53719us,128us,1094us

次に、CentOS 5 + zfs-fuse-0.6.9_p1-6.20100709git.el5.1 のデータです。
# uname -a
Linux xxxx 2.6.18-308.11.1.el5 #1 SMP Tue Jul 10 08:48:43 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux
# zpool get guid tank1
NAME   PROPERTY  VALUE  SOURCE
tank1  guid      4585092805656841166  default
# zpool status
  pool: tank1
 state: ONLINE
 scrub: none requested
config:

        NAME                                                              STATE     READ WRITE CKSUM
        tank1                                                             ONLINE       0     0     0
          disk/by-id/scsi-SATA_External_Disk_0AL25744_6000092__0_S-part1  ONLINE       0     0     0

errors: No known data errors
# bonnie++ -u root -d /tank1
...
Version  1.96       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -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
xxxx         15424M    24  11 32019   5 24308   6  2379  98 103178   7 496.0   9
Latency               506ms    1381ms    1627ms   10573us     609ms     999ms
Version  1.96       ------Sequential Create------ --------Random Create--------
xxxx                -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16  5648  12 11300  10  5469   7  5038  12 12881  14  7092  12
Latency             28879us    1700us    3875us   54328us    1760us    2040us
1.96,1.96,xxxx,1,1351439162,15424M,,24,11,32019,5,24308,6,2379,98,103178,7,496.0,9,16,,,,,5648,12,11300,10,5469,7,5038,12,12881,14,7092,12,506ms,1381ms,1627ms,10573us,609ms,999ms,28879us,1700us,3875us,54328us,1760us,2040us
使用機材は、ThinkPad T510 Core i7 M620 2.67G + SAMSUNGの2008年製造の古い SSD 64G (eSATA 接続) です。

2012-11-10追記
わたしの利用範囲では、ZFS on Linux の性能は十分であると感じますが、FreeBSD のほうが上だと聞きますので、試しに同じマシン(ThinkPad T510)にマルチブート環境を作って、同じボリュームを import して、bonnie++ で計測してみました。
# uname -a
FreeBSD xxxx 9.0-RELEASE FreeBSD 9.0-RELEASE #0: Tue Jan  3 07:46:30 UTC 2012     root@farrell.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  amd64
# bonnie++ -u root -d /tank1
...
Version  1.96       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -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
xxxx            16G   173  99 53620   9 33313   5   425  90 138720   7 876.5   8
Latency             46882us    4175ms    3542ms     513ms     590ms     782ms
Version  1.96       ------Sequential Create------ --------Random Create--------
xxxx                -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16 29261  88 +++++ +++ 32398  97 23195  97 +++++ +++ 12962  98
Latency             13252us     132us     126us   26767us     102us    7513us
1.96,1.96,xxxx,1,1352526856,16G,,173,99,53620,9,33313,5,425,90,138720,7,876.5,8,16,,,,,29261,88,+++++,+++,32398,97,23195,97,+++++,+++,12962,98,46882us,4175ms,3542ms,513ms,590ms,782ms,13252us,132us,126us,26767us,102us,7513us
# zpool get all tank1
NAME   PROPERTY       VALUE       SOURCE
...
tank1  guid           4585092805656841166  local
...
# zpool status
  pool: tank1
 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: none requested
config:

 NAME        STATE     READ WRITE CKSUM
 tank1       ONLINE       0     0     0
   ada2s1    ONLINE       0     0     0

errors: No known data errors
確かに各数字を見比べてみると、全般的に FreeBSD 9.0 のほうが、少し性能が上に見えました。
もしも、NAS 専用サーバを作るのであれば、FreeBSD や FreeNAS というものは、良い選択肢なのかもなと思いました。

余談:FreeBSD は、過去何回かインストールした経験があったのですが、拡張パーティションにはインストールできないということを、すっかり忘れており(たぶん、以前同じようにハマったと思いました)、結構な手間・時間がかかってしまいました。たぶん、ほとんど起動しないだろうというのに。。
なお、FreeBSD 10 に向けて、ZFS の性能向上の取り組みがあるらしいので、リリースされたら、また測ってみたいなと思っています。
人気ブログランキングへ にほんブログ村 IT技術ブログへ