[PR] あなたが Kindle で読みたいその本、Kindle に対応したら Twitter でお知らせします。

EC2 の Instance Store を RAID で束ねてディスク I/O 性能を上げる

Posted on

EC2 の現行世代のインスタンスには Instance Store に SSD が搭載されています。「DigitalOcean と Amazon EC2 のディスク I/O を比較してみた」にも書きましたが、SSD と比べて EBS はかなり遅いので、一時的なファイルは Instance Store に書き込んだほうがパフォーマンスが出ます。

c3.large には 16 GB の SSD が 2 つ載っています。個別にマウントしてもいいのですが、せっかくなので RAID 0 でストライピングしてどれくらい I/O 性能が上がるか検証してみました。

検証条件

  • インスタンスタイプは c3.large (2 x 16 GB)
  • OS は Amazon Linux AMI 2014.03.1 (64 bit)
  • hdparm コマンドを 3 回実行して平均値を採用
  • ファイルシステムは ext3

RAID なしの単体で計測

まず単体でテストしてみます。 Amazon Linux を使っていると CloudInit が自動的に Instance Store をマウントしてくれます。

# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  1.1G  6.7G  14% /
devtmpfs        1.9G   20K  1.9G   1% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
/dev/xvdb        16G  167M   15G   2% /media/ephemeral0

# mount | grep /dev/xvdb
/dev/xvdb on /media/ephemeral0 type ext3 (rw,relatime,errors=continue,user_xattr,acl,barrier=1,data=ordered)

/dev/xvdb が SSD の 1 本目です。マウントしていないので df コマンドには出てきませんが、/dev/xvdc に 2 本目の SSD があります。ファイルシステムは ext3 でした。

/dev/xvdb に対して計測。

# for n in `seq 1 3`; do hdparm -t /dev/xvdb; sleep 10; done
/dev/xvdb:
 Timing buffered disk reads: 2976 MB in  3.00 seconds = 991.59 MB/sec
/dev/xvdb:
 Timing buffered disk reads: 3190 MB in  3.00 seconds = 1063.27 MB/sec
/dev/xvdb:
 Timing buffered disk reads: 3118 MB in  3.00 seconds = 1039.09 MB/sec

EBS と比べるとかなり速いことが確認できます。平均すると 1031.31 MB/sec です。

RAID を組む

次に SSD 2 本で RAID 0 を組みます。 /dev/xvdb をアンマウントして、mdadm でソフトウェア RAID を組みます。

# umount /media/ephemeral0

# mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/xvd[bc]
mdadm: /dev/xvdb appears to contain an ext2fs file system
    size=15996416K  mtime=Sat May 10 12:53:16 2014
mdadm: /dev/xvdc appears to contain an ext2fs file system
    size=15996416K  mtime=Thu Jan  1 00:00:00 1970
Continue creating array? yes
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

条件を合わせるために ext3 でフォーマットし、マウントオプションも揃えます。

# mkfs.ext3 /dev/md0
# mount -o rw,relatime,errors=continue,user_xattr,acl,barrier=1,data=ordered /dev/md0 /media/ephemeral0

確認してみます。 RAID 0 なので容量がほぼ倍になっています。

# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  1.1G  6.6G  14% /
devtmpfs        1.9G   28K  1.9G   1% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
/dev/md0         31G  177M   29G   1% /media/ephemeral0

# mount | grep /dev/md0
/dev/md0 on /media/ephemeral0 type ext3 (rw,relatime,errors=continue,user_xattr,acl,barrier=1,data=ordered)

RAID 0 で計測

/dev/md0 に対して計測してみます。

# for n in `seq 1 3`; do hdparm -t /dev/md0; sleep 10; done
/dev/md0:
 Timing buffered disk reads: 4956 MB in  3.00 seconds = 1651.41 MB/sec
/dev/md0:
 Timing buffered disk reads: 4948 MB in  3.00 seconds = 1649.29 MB/sec
/dev/md0:
 Timing buffered disk reads: 5108 MB in  3.00 seconds = 1702.59 MB/sec

ストライピングしたおかげで単体よりも性能が上がりました。平均すると 1667.76 MB/sec で 162 % の性能アップです。 EBS が 37.49 MB/sec だったので約 45 倍の違いがあります。

ちなみに ext4 でも試してみましたが、ほぼ同じ結果になりました。

まとめ

Instance Store と RAID を組み合わせることで EBS とは比べ物にならない I/O 性能を得られます。しかも、EBS と違い無料で使えます(EC2 のインスタンス料金に含まれている)。

自分もまだ活用しきれていないので、活用方法を考えてみようと思います。