​ ​

Amazon Elastic File System (Amazon EFS)の性能を調べる

こんにちは
さくらいです



最近は農家さんのシステム開発案件の比率が増え、地方に行くことが多くなってきました。
そして昨日からドラプロ(コロプラのスマホゲーム)に夢中になっています。
モン○ンのそっくりなのでゲームに馴染むのが早かったというのもあります。

そんなゲームがあれば、時間がかかる性能テストの待ち時間も退屈しない!?
ということで今回はAWS EFSの性能をチェックしました。
何かと便利そうなEFSですが、実際に使えるのかは未知数で・・・
AWSだから大丈夫かなー程度にしか考えていませんでしたが、 この機会にオレゴンリージョンで実際にテストします。

今回は比較対象としてローカル(EBS)とS3(goofysでマウント)でも計測しました。
(EFSやS3のマウントについては色々な記事が公開されていますので今回は割愛します)

ディレクトリ構成は以下のようにしました。

/home/ec2-user/efs・・・EFSをマウントした領域
/home/ec2-user/ebs・・・通常のディスク領域
/home/ec2-user/goofys・・・S3をマウントした領域

bonnie++でチェック


IOの性能チェックでbonnie++を利用することにしました。
Aws Linuxではyumで簡単にインストールできますね。

yum install bonnie++

早速テスト開始です
今回はシーケンシャルアクセスのファイルサイズを1GB、作成・削除などを行うファイル数を256*1024個に設定しました。

まずはEFS

$ sudo bonnie++ -d /home/ec2-user/efs -u root:root -s 1024 -r 512 -n 256
Using uid:0, gid:0.
Writing a byte at a time...done
Writing intelligently...done
Rewriting...done
Reading a byte at a time...done
Reading intelligently...done
start 'em...done...done...done...done...done...
Create files in sequential order...
(ドラプロのクエストを3回クリアした後に画面を確認しましたが、進捗がなく断念・・・)

S3だとどうなるか確認

$ sudo bonnie++ -d /home/ec2-user/goofys -u root:root -s 1024 -r 512 -n 256
Using uid:0, gid:0.
Writing a byte at a time...
(ドラプロに集中しすぎて何分待ったかわかりませんが、とにかく進んでいなかったため断念・・・)

体感的にEFSの方が、ずーーっと進んでいました

fioでチェック

ということでfioで仕切りなおしです。 まずは読み込みのテストをするための設定ファイルを作ります。
設定ファイルは以下のとおり

efs-read.job
rw=randread
size=512m
directory=/home/ec2-user/efs/dummy
ebs-read.job
rw=randread
size=512m
directory=/home/ec2-user/ebs/dummy
s3-read.job
rw=randread
size=512m
directory=/home/ec2-user/goofys/dummy

EFSでチェック

$ fio efs-read.job
sample: (g=0): rw=randread, bs=4K-4K/4K-4K/4K-4K, ioengine=sync, iodepth=1
fio-2.1.5
Starting 1 process
sample: Laying out IO file(s) (1 file(s) / 512MB)
Jobs: 1 (f=1): [r] [100.0% done] [1236KB/0KB/0KB /s] [309/0/0 iops] [eta 00m:00s]
sample: (groupid=0, jobs=1): err= 0: pid=7109: Wed Jun 22 17:45:01 2016
read : io=524288KB, bw=1238.2KB/s, iops=309, runt=423490msec
clat (msec): min=2, max=268, avg= 3.23, stdev= 1.61
lat (msec): min=2, max=268, avg= 3.23, stdev= 1.61
clat percentiles (usec):
| 1.00th=[ 2736], 5.00th=[ 2832], 10.00th=[ 2864], 20.00th=[ 2928],
| 30.00th=[ 2960], 40.00th=[ 3024], 50.00th=[ 3056], 60.00th=[ 3088],
| 70.00th=[ 3152], 80.00th=[ 3216], 90.00th=[ 3408], 95.00th=[ 3920],
| 99.00th=[ 7136], 99.50th=[ 8512], 99.90th=[11840], 99.95th=[15808],
| 99.99th=[48896]
bw (KB /s): min= 584, max= 1330, per=100.00%, avg=1238.85, stdev=56.28
lat (msec) : 4=95.20%, 10=4.55%, 20=0.21%, 50=0.03%, 100=0.01%
lat (msec) : 250=0.01%, 500=0.01%
cpu : usr=0.29%, sys=0.58%, ctx=131089, majf=0, minf=4
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued : total=r=131072/w=0/d=0, short=r=0/w=0/d=0
latency : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
READ: io=524288KB, aggrb=1238KB/s, minb=1238KB/s, maxb=1238KB/s, mint=423490msec, maxt=423490msec

EBSでチェック

$ fio ebs-read.job
sample: (g=0): rw=randread, bs=4K-4K/4K-4K/4K-4K, ioengine=sync, iodepth=1
fio-2.1.5
Starting 1 process
sample: Laying out IO file(s) (1 file(s) / 512MB)
Jobs: 1 (f=1): [r] [100.0% done] [12004KB/0KB/0KB /s] [3001/0/0 iops] [eta 00m:00s]
sample: (groupid=0, jobs=1): err= 0: pid=7121: Wed Jun 22 17:46:17 2016
read : io=524288KB, bw=12054KB/s, iops=3013, runt= 43496msec
clat (usec): min=168, max=6398, avg=329.82, stdev=62.78
lat (usec): min=168, max=6398, avg=330.01, stdev=62.77
clat percentiles (usec):
| 1.00th=[ 209], 5.00th=[ 286], 10.00th=[ 302], 20.00th=[ 314],
| 30.00th=[ 322], 40.00th=[ 326], 50.00th=[ 330], 60.00th=[ 334],
| 70.00th=[ 342], 80.00th=[ 346], 90.00th=[ 358], 95.00th=[ 366],
| 99.00th=[ 398], 99.50th=[ 422], 99.90th=[ 668], 99.95th=[ 940],
| 99.99th=[ 3408]
bw (KB /s): min=11904, max=17096, per=100.00%, avg=12058.98, stdev=550.04
lat (usec) : 250=2.97%, 500=96.82%, 750=0.13%, 1000=0.03%
lat (msec) : 2=0.02%, 4=0.01%, 10=0.01%
cpu : usr=0.00%, sys=6.23%, ctx=131074, majf=0, minf=5
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued : total=r=131072/w=0/d=0, short=r=0/w=0/d=0
latency : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
READ: io=524288KB, aggrb=12053KB/s, minb=12053KB/s, maxb=12053KB/s, mint=43496msec, maxt=43496msec

Disk stats (read/write):
xvda: ios=130960/14, merge=0/3, ticks=41740/0, in_queue=41740, util=95.89%

S3でチェック

$ fio s3-read.job
sample: (g=0): rw=randread, bs=4K-4K/4K-4K/4K-4K, ioengine=sync, iodepth=1
fio-2.1.5
Starting 1 process
sample: Laying out IO file(s) (1 file(s) / 512MB)
fio: posix_fallocate fails: Invalid argument
fio: pid=0, err=22/file:filesetup.c:157, func=write, error=Invalid argument


Run status group 0 (all jobs):
EFSに比べて、EBSの方が10倍くらいの性能がでてます。
そしてS3だけ、「error=Invalid argument」というエラーが発生しています。
本来は解決したいのですが、こちらは次回に持越しということで次はddで書き込みのテストをすることにします。

1G程度のファイルを書き込む時間を計測

EFSで確認

$ dd if=/dev/zero of=/home/ec2-user/efs/test bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 17.0267 s, 63.1 MB/s

EBSで確認

$ dd if=/dev/zero of=/home/ec2-user/ebs/test bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 0.6321 s, 1.7 GB/s

S3で確認

$ dd if=/dev/zero of=/home/ec2-user/goofys/test bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 19.1584 s, 56.0 MB/s

まとめ

書き込みについてはefsは思ったよりもスピードが出ていないように感じました
goofysでマウントしたS3よりは早いですが、EBSに比べるとかなり遅いようです
とはいっても、通常のWEBサイトでは使えそうかなという感想です
今回は限られた時間の中で確認していたので、今後はもう少し時間をかけて特徴を見極めていきたいと思います
一番の問題は費用になるかもしれないですね

モン○ン好きのエンジニア募集

スカイアーク/ファームノートでは一緒に働いてくれる仲間を募集しています
特にエンジニアの方は大歓迎です
詳細はこちらから
このエントリーをはてなブックマークに追加