以下のようなスペックのマシンをセットアップしたのでメモ。
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
ここで考えるべきは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