AmazonEBSでraid0を組んだ時のパフォーマンス検証

AmazonEBSでraid0を組んだ時のパフォーマンス検証

EBSを組むと早いはなしを検証したい

testでマルチ、ラージなら結構こうかある説がある模様。
既存移行の方法も検討(バイナリログ等のディレクトリ分けるところからかと。)

公式のユーザガイド(EBSPerformance)

EBS自体が冗長構成組まれているのでraid0でいいと思われる。

インスタンスディスク(ローカルディスク、エフェメラルディスク)を使ってRAID0
EBSでRAID0を組むことは、RAID10(ミラーのストライプ)と同等である

Largeインスタンス以上であれば、1台よりも2台の方がディスクI/O性能が目に見えて上がりました

エフェメラルディスク(stopすると消えるほうのディスク)でraid0したい場合の起動コマンド例
[shell]
ec2-run-instances ami-e965ba80 –region us-east-1 –key id_rsa –group sg-a4866fcc –placement-group test –instance-type cc2.8xlarge -b "/dev/sdb=ephemeral0" – b "/dev/sdc=ephemeral1" -b "/dev/sdd=ephemeral2" "/dev/sdf=ephemeral3"
[/shell]
・ラージでEBSディスクを2つ追加して起動してログインする
[shell]
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvde1 9.9G 867M 8.5G 10% /
none 3.7G 0 3.7G 0% /dev/shm
# ls -l /dev/xv*
brw-rw—- 1 root disk 202, 65 Mar 21 02:15 /dev/xvde1
brw-rw—- 1 root disk 202, 80 Mar 21 02:15 /dev/xvdf
brw-rw—- 1 root disk 202, 96 Mar 21 02:15 /dev/xvdg
find /dev -type b -print
[/shell]
してみたがそれらしい名前のは上記のみ。

・mdadmでraidを組む
mdadmのつかいかた
[shell]
# yum install mdadm
Installed:
mdadm.x86_64 0:3.2.5-4.el6
# /sbin/mdadm –create /dev/md0 –level=0 -c256 –raid-devices=2 /dev/xvdf /dev/xvdg
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
# echo ‘DEVICE /dev/xvdf /dev/xvdg’ > /etc/mdadm.conf
# mdadm –detail –scan >> /etc/mdadm.conf
# cat /etc/mdadm.conf
DEVICE /dev/xvdf /dev/xvdg
ARRAY /dev/md0 metadata=1.2 name=aws-cent63-template:0 UUID=f1d24aee:f788f00e:66d66f4d:ac63fa92
# ls -l /dev/md0
brw-rw—- 1 root disk 9, 0 Mar 21 02:39 /dev/md0
[/shell]
・ファイルフォーマット
xfsが早いらしいと見かけたが、こちらのベンチの結果をみると実際そんなに変わらないかも。

xfsはacl使うと実は遅いらしいという情報もありました。
(SSDやiodriveとかではxfsで4kbでフォーマットが早いらしいと聞きます)

普通に/とおなじファイルシステムで試すことにする。
[shell]
# mount
/dev/xvde1 on / type ext4 (rw)
none on /proc type proc (rw)
none on /sys type sysfs (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
none on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
# mkfs.ext4 /dev/md0
# mkdir /data
# mount /dev/md0 /data
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvde1 9.9G 859M 8.6G 9% /
none 3.7G 0 3.7G 0% /dev/shm
/dev/md0 20G 172M 19G 1% /data
# mount
/dev/xvde1 on / type ext4 (rw)
none on /proc type proc (rw)
none on /sys type sysfs (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
none on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/md0 on /data type ext4 (rw)
[/shell]
・ベンチマークする
fioベンチ参考
fioダウンロード
[shell]
# wget http://pkgs.repoforge.org/fio/fio-2.0.9-1.el6.rf.x86_64.rpm
# yum install libaio
# rpm -ivh fio-2.0.9-1.el6.rf.x86_64.rpm
[/shell]
4kランダムリードを16多重で5回計測する場合。
[shell]
# vi randread4k16.fio
# cat randread4k16.fio
[randread4k]
readwrite=randread
blocksize=4k
size=100m
directory=/data
direct=1
loops=5
numjobs=16
# fio -group_reporting randread4k16.fio
~略~
read : io=512000KB, bw=3200.6KB/s, iops=800 , runt=159974msec
~略~<br />Run status group 0 (all jobs):
READ: io=8000.0MB, aggrb=51001KB/s, minb=3187KB/s, maxb=3209KB/s, mint=159540msec, maxt=160623msec
Disk stats (read/write):
md0: ios=2047724/11, merge=0/0, ticks=0/0, in_queue=0, util=0.00%, aggrios=1024000/4, aggrmerge=0/1, aggrticks=1203285/363, aggrin_queue=1202916, aggrutil=87.91%
xvdf: ios=1024000/9, merge=0/2, ticks=1177359/726, in_queue=1177346, util=82.95%
xvdg: ios=1024000/0, merge=0/0, ticks=1229211/0, in_queue=1228486, util=87.91%
[/shell]
4kランダムライトを16多重で5回計測する場合。
[shell]
# vi randwrite4k16.fio
[randwrite4k]
readwrite=randwrite
blocksize=4k
size=100m
directory=/data
direct=1
loops=5
numjobs=16
# fio -group_reporting randwrite4k16.fio
~略~
write: io=512000KB, bw=1997.4KB/s, iops=499 , runt=256336msec
~略~<br />Run status group 0 (all jobs):
WRITE: io=8000.0MB, aggrb=31902KB/s, minb=1993KB/s, maxb=1998KB/s, mint=256247msec, maxt=256786msec
Disk stats (read/write):
md0: ios=0/2061004, merge=0/0, ticks=0/0, in_queue=0, util=0.00%, aggrios=0/1024965, aggrmerge=0/5568, aggrticks=0/2042634, aggrin_queue=2042035, aggrutil=99.58%
xvdf: ios=0/1025035, merge=0/5770, ticks=0/1733675, in_queue=1733059, util=97.23%
xvdg: ios=0/1024895, merge=0/5366, ticks=0/2351593, in_queue=2351011, util=99.58%
[/shell]
シーケンシャルも一応計ってみる
[shell]
# vi seqread4k16.fio
[seqread4k]
readwrite=read
blocksize=4k
size=100m
directory=/data
direct=1
loops=5
numjobs=16
# fio -group_reporting seqread4k16.fio
~略~
read : io=512000KB, bw=3215.9KB/s, iops=803 , runt=159213msec
~略~<br />Run status group 0 (all jobs):
READ: io=8000.0MB, aggrb=51306KB/s, minb=3206KB/s, maxb=3216KB/s, mint=159165msec, maxt=159669msec
Disk stats (read/write):
md0: ios=2046486/24, merge=0/0, ticks=0/0, in_queue=0, util=0.00%, aggrios=1024000/5, aggrmerge=0/6, aggrticks=1202445/327, aggrin_queue=1202016, aggrutil=87.41%
xvdf: ios=1024000/11, merge=0/13, ticks=1183413/655, in_queue=1183332, util=84.11%
xvdg: ios=1024000/0, merge=0/0, ticks=1221478/0, in_queue=1220701, util=87.41%

# vi seqwrite4k16.fio
[seqwrite4k]
readwrite=write
blocksize=4k
size=100m
directory=/data
direct=1
loops=5
numjobs=16
# fio -group_reporting seqwrite4k16.fio
~略~
write: io=512000KB, bw=1795.7KB/s, iops=448 , runt=285131msec
~略~
Run status group 0 (all jobs):
WRITE: io=8000.0MB, aggrb=28708KB/s, minb=1794KB/s, maxb=1797KB/s, mint=284902msec, maxt=285354msec
Disk stats (read/write):
md0: ios=0/2048172, merge=0/0, ticks=0/0, in_queue=0, util=0.00%, aggrios=0/1024126, aggrmerge=0/5, aggrticks=0/2263010, aggrin_queue=2262748, aggrutil=96.45%
xvdf: ios=0/1024125, merge=0/11, ticks=0/2035946, in_queue=2035696, util=91.73%
xvdg: ios=0/1024128, merge=0/0, ticks=0/2490074, in_queue=2489800, util=96.45%
[/shell]
raid0じゃないところも計って差を確かめる
[shell]
# vi randread4k16_noraid.fio
[randread4k]
readwrite=randread
blocksize=4k
size=100m
directory=/
direct=1
loops=5
numjobs=16
# fio -group_reporting randread4k16_noraid.fio
~略~
read : io=512000KB, bw=3194.4KB/s, iops=798 , runt=160281msec
~略~
Run status group 0 (all jobs):
READ: io=8000.0MB, aggrb=50913KB/s, minb=3182KB/s, maxb=3200KB/s, mint=159959msec, maxt=160899msec
Disk stats (read/write):
xvde1: ios=2047511/20, merge=0/5, ticks=2427396/202, in_queue=2426053, util=100.00%
# vi randwrite4k16_noraid.fio
[randwrite4k]
readwrite=randwrite
blocksize=4k
size=100m
directory=/
direct=1
loops=5
numjobs=16
# fio -group_reporting randwrite4k16_noraid.fio
~略~
write: io=512000KB, bw=1374.4KB/s, iops=343 , runt=372625msec
~略~
Run status group 0 (all jobs):
WRITE: io=8000.0MB, aggrb=21969KB/s, minb=1373KB/s, maxb=1375KB/s, mint=372306msec, maxt=372874msec
Disk stats (read/write):
xvde1: ios=1/2049664, merge=0/14975, ticks=7/5995555, in_queue=5995341, util=100.00%
# vi seqread4k16_noraid.fio
[seqread4k]
readwrite=read
blocksize=4k
size=100m
directory=/
direct=1
loops=5
numjobs=16
# fio -group_reporting seqread4k16_noraid.fio
~略~
read : io=512000KB, bw=3124.3KB/s, iops=781 , runt=163882msec
~略~
Run status group 0 (all jobs):
READ: io=8000.0MB, aggrb=49945KB/s, minb=3121KB/s, maxb=3129KB/s, mint=163601msec, maxt=164020msec
Disk stats (read/write):
xvde1: ios=2046743/23, merge=0/3, ticks=2503841/252, in_queue=2502405, util=100.00%
# vi seqwrite4k16_noraid.fio
[seqwrite4k]
readwrite=write
blocksize=4k
size=100m
directory=/
direct=1
loops=5
numjobs=16
# fio -group_reporting seqwrite4k16_noraid.fio
~略~
write: io=512000KB, bw=1438.6KB/s, iops=359 , runt=355910msec
~略~
Run status group 0 (all jobs):
WRITE: io=8000.0MB, aggrb=23015KB/s, minb=1438KB/s, maxb=1439KB/s, mint=355585msec, maxt=355936msec
Disk stats (read/write):
xvde1: ios=15/2047985, merge=0/21, ticks=65/5674427, in_queue=5674447, util=100.00%
[/shell]
★比較結果

read/write種別, singledisk(iops), raid0disk(iops), singledisk(帯域幅), raid0disk(帯域幅)
ランダムリード 798 800 3194.4KB/s 3200.6KB/s
ランダムライト 343 499 1374.4KB/s 1997.4KB/s
シーケンシャルリード 781 803 3124.3KB/s 3215.9KB/s
シーケンシャルライト 359 448 1438.6KB/s 1795.7KB/s

結果:raid0組んだほうが早い。(※)
※こちらは本環境での結果となりますので、実際お使いの環境でお試しいただくことをお勧めいたします。

・移行方法案

本番DBではなくバックアップ用に同期しているサーバ上の3307ポートのDBがとりあえず移行ターゲット。
試験環境も混在しているため、ioが分散されれば結構遅延に対して効果があると思われる。

0.対象サーバにディスク追加し、raid0を組んでフォーマットしておく
1.slaveを止める(必要ならmy.cnfにskip_slaveいれる)
2.mysql2(3307のほう)を止める
3.データディレクトリコピー
4.シンボリックリンク
5.mysql2を起動
6.slaveを開始する(必要があれば)
7.同期するのを待つ
8.遅延の度合いを確かめる

画像入りでdumpとレストアの仕方が特殊だったと思うので、コールドが手間がなくてよいと考えられる。

おすすめ記事