以下のようなスペックのマシンをセットアップしたのでメモ。
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程度。十分な性能が出ているようです。もちろんこの場合はパフォーマンス最優先なので、その点には注意が必要ですが。