RAID6上のLVM上のExt4のベンチマーク

以下のようなスペックのマシンをセットアップしたのでメモ。

Model CPU Memory HDD OS
HP ML110 G7 Celeron G530 ECC 2GB x 2 WD30EZRX x 6 Scientific Linux 6.3 x86_64

AFT

最近の大容量ディスクはみんなAFT。うまくパーティションを切らないとパフォーマンスが低下しちゃいます。さらに今回はRAID6上のLVM上のExt4(!)であることも考慮しなければなりません。といってもそれほど複雑なことを考える必要はなく、新しめのOSであればもうほぼデフォルトの設定で問題ないはずです。

パーティション

今回は/boot/と、ここで使うRAIDアレイ用のパーティションを分けることにしました。 このような場合は、パーティションが正しく切られているかが重要です。 1.00 MiB = 1,048,576 byteで、これは4096 byteで割り切れます。つまりMiB, GiB単位で分けておけばよいことになります。partedで以下のように簡単にパーティションを作成できます。

# parted /dev/sdX
(parted) mklabel gpt
(parted) mkpart boot 1mib 300mib
(parted) mkpart system 300mib 40gib
(parted) mkpart storage 40gib -0gib
(parted) quit

LiveCDなどで作業をしてもいいですが、OSのインストーラを立ち上げた後、Alt + F2で仮想コンソールに切り替え、Alt + F6でインストーラに戻るのが簡単です。

RAID6

ここで考える必要があるのは、metadata version、およびchunk sizeです。 metadataは --metadata 1.0 を指定して、Arrayの後方に配置します。chunk sizeはAFTのセクタサイズ、4KBの倍数になるようにします。

# mdadm --create /dev/md2 --metadata 1.0 --raid-devices=6 --level=6 --chunk=128 /dev/sd[abcdef]3
mdadm: array /dev/md2 started.

LVM

LVMではヘッダサイズが重要ですが、新しいOSではデフォルトで問題ない値になるようです。

# vgcreate VolGroup01 /dev/md2
  No physical volume label read from /dev/md2
  Writing physical volume data to disk "/dev/md2"
  Physical volume "/dev/md2" successfully created
  Volume group "VolGroup01" successfully created
# lvcreate -l 100%VG -n  LogVol00 VolGroup01

でPVとVGとLVを作成し、以下のコマンドでヘッダサイズが適切かどうか確かめます。

# pvs -o+pe_start
  PV         VG         Fmt  Attr PSize  PFree 1st PE 
  /dev/md1   VolGroup00 lvm2 a--  39.70g 2.59g   1.00m
  /dev/md2   VolGroup01 lvm2 a--  10.76t    0    1.00m

1st PEが1.00mになっています。これは適切な値です。

ヘッダサイズを手動で設定するならば --dataalignmentオプションをpvcreateに渡します。データの開始がこの値の倍数になるので、ここではRAIDアレイのchunk sizeにしておくのがいいでしょう。

# pvcreate -M2 --dataalignment 128K /dev/md2

Ext4

ここで考えるべきはblock size、stride、およびstripe-widthです。 block sizeは4096の倍数であれば適切です。 stride, stripe-widthは次の式で求められます:

stride = RAIDアレイのchunk size / Ext4のblock size
stripe-width = stride * (RAIDアレイを構成するディスク数 - 2)

block sizeは4096にすることとし、ディスク数は6、chunk sizeは128なので、stride=32, stripe-width=128となりました。

# mke2fs -t ext4 -v -m 1 -b 4096 -E stride=32,stripe-width=128 /dev/VolGroup01/LogVol00
mke2fs 1.41.12 (17-May-2010)
fs_types for mke2fs.conf resolution: 'ext4', 'default'
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=32 blocks, Stripe width=128 blocks
722083840 inodes, 2888322048 blocks
28883220 blocks (1.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
88145 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, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
        102400000, 214990848, 512000000, 550731776, 644972544, 1934917632, 
        2560000000

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

This filesystem will be automatically checked every 26 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

テスト

さて、ここまでで、恐らくRAID6上のLVM上のExt4が適切な設定で作成されたはずですが、確かめてみなければなんとも言えません。 バーンインも兼ねて、ちょっと時間のかかるベンチマークを取ってみます。

  • /dev/sdXのスケジューラ
    • cfq (default)
    • deadline
    • noop
  • RAID6のstripe_cache_size
    • 256 (default)
    • 768
    • 2048
    • 8192
    • 32768
  • Ext4のマウントオプション
    • "barrier=1,data=ordered" (default)
    • "barrier=0,data=ordered"
    • "barrier=1,data=writeback"
    • "barrier=0,data=writeback"
    • "barrier=1,data=writeback,nobh"
    • "barrier=0,data=writeback,nobh"
    • "barrier=1,data=journal"
    • "barrier=0,data=journal"

の全通りに対して、以下の2種類のテストを行いました。

  • テスト
    • bonnie++ -q -x 1 -s 32G
    • dbench 100

スクリプト

結果

シーケンシャルリード、シーケンシャルライトは最大それぞれ400MB/s、450MB/s程度。十分な性能が出ているようです。もちろんこの場合はパフォーマンス最優先なので、その点には注意が必要ですが。

bonnie++ put_block

bonnie++ rewrite

bonnie++ get_block

dbench