前編ではAnazon EFSがどのような特徴があるのかについて解説しました。
後編となる今回は実際にEFSファイルシステムを作成し、ベンチマークを使って他のファイルシステムと比較をしてみたいと思います。
目次
EFSファイルシステムの作成
それでは早速、EFSファイルシステムを1つ作成したいと思います。
手順は非常に簡単で3ステップで完了します。
ステップ1:ネットワーク設定
EFSの設定画面に進むと、EFSファイルシステムが使用するネットワーク周りの設定画面になります。
ここでは以下の設定ができますので、自分の環境に合った設定を実施します。
- セキュリティグループの設定
- 所属するアベイラビリティゾーンとIPアドレスの設定
ステップ2:タグとパフォーマンス設定
次に進むと、タグとパフォーマンス設定画面が出てきます。
タグ設定自体は任意です。
ページ下部ではパフォーマンスモードが2種類から選択可能です。
- General Purpose(default)
- Max I/O
つまり一般用途と、I/Oパフォーマンスを最大値にしたモードの2種類です。
ステップ3:最終確認
ステップ1と2で指定した内容で作成しますよという最終確認画面です。
たったこれだけでEFSファイルシステムが出来上がりました。ものすごく簡単です。
EFSファイルシステムのマウント
作成したEFSをEC2インスタンスから利用する方法は、作成したEFSファイルシステムの管理画面内に書かれていました。
このヘルプに倣ってマウントを実施します。
なお今回使用するEC2インスタンスはAmazon Linuxでt2.microでさくっと作成したものです。
1 2 3 |
# yum install nfs-utils # mkdir /efs # mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 fs-xxxxxxxx.efs.us-east-1.amazonaws.com:/ /efs |
上記コマンドがうまく通らない場合は、EFSが使用するセキュリティグループの設定を見直すと良いと思います。
きちんとマウントされたか確認してみると・・・。
1 2 3 4 5 6 7 8 |
# df -h --------------------------------------------------------------------------- Filesystem Size Used Avail Use% Mounted on devtmpfs 488M 60K 488M 1% /dev tmpfs 498M 0 498M 0% /dev/shm /dev/xvda1 7.8G 1.1G 6.6G 14% / fs-xxxxxxxx.efs.us-east-1.amazonaws.com:/ 8.0E 0 8.0E 0% /efs --------------------------------------------------------------------------- |
認識されたのはなんと8エクサバイト!ペタバイトの更に1024倍です。
これだけの容量はなかなか使い切らないですよね。
fioコマンドの準備
ディスクベンチマークツールはhdparmが有名ですが、NFSを計測することができなそうなので今回はfioを使用したいと思います。
1 |
# yum install fio |
Amazon LinuxがインストールされたEC2インスタンスでは、上記コマンドですんなりインストールすることができました。
EC2インスタンスが普段マウントしているEBSのベンチマーク
まずはEC2インスタンスが普段マウントしているEBSをベンチマークしてみたいと思います。
テスト用のディレクトリを作成し、ベンチマーク用のコンフィグファイルを作成します。
1 2 |
# mkdir /home/test/fio # cd /home/test |
fioではシーケンシャルリードも計測できるようですが、やはりNFS運用することを考えるとランダムリード性能が重要なので、ランダムリードを計測したいと思います。
100Mbyteのランダムリード性能を計測します。
1 2 3 4 5 6 7 |
# vi fio.txt ------------------------- [random-read] rw=randread size=100m directory=/home/test/fio/ ------------------------- |
fioコマンドで上記コンフィグファイルを指定し実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# fio fio.txt random-read: (g=0): rw=randread, bs=4K-4K/4K-4K/4K-4K, ioengine=sync, iodepth=1 fio-2.1.5 Starting 1 process random-read: Laying out IO file(s) (1 file(s) / 100MB) Jobs: 1 (f=1): [r] [100.0% done] [12248KB/0KB/0KB /s] [3062/0/0 iops] [eta 00m:00s] random-read: (groupid=0, jobs=1): err= 0: pid=2778: Mon Feb 13 07:36:10 2017 read : io=102400KB, bw=13900KB/s, iops=3474, runt= 7367msec clat (usec): min=173, max=136201, avg=286.09, stdev=858.17 lat (usec): min=173, max=136201, avg=286.28, stdev=858.16 clat percentiles (usec): | 1.00th=[ 189], 5.00th=[ 197], 10.00th=[ 203], 20.00th=[ 213], | 30.00th=[ 221], 40.00th=[ 237], 50.00th=[ 286], 60.00th=[ 310], | 70.00th=[ 322], 80.00th=[ 330], 90.00th=[ 346], 95.00th=[ 358], | 99.00th=[ 406], 99.50th=[ 604], 99.90th=[ 2192], 99.95th=[ 2480], | 99.99th=[ 4576] bw (KB /s): min=11008, max=17240, per=100.00%, avg=13991.43, stdev=2381.09 lat (usec) : 250=44.70%, 500=54.64%, 750=0.22%, 1000=0.07% lat (msec) : 2=0.23%, 4=0.12%, 10=0.01%, 250=0.01% cpu : usr=0.54%, sys=3.75%, ctx=25616, majf=0, minf=6 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=25600/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=102400KB, aggrb=13899KB/s, minb=13899KB/s, maxb=13899KB/s, mint=7367msec, maxt=7367msec Disk stats (read/write): xvda: ios=25103/0, merge=0/0, ticks=7100/0, in_queue=7100, util=97.26% |
このベンチマーク計測はすぐに終わりました。
ベンチマーク上大切なところは以下の部分です。
1 |
READ: io=102400KB, aggrb=13899KB/s, minb=13899KB/s, maxb=13899KB/s, mint=7367msec, maxt=7367msec |
NFSマウントしているEFSのベンチマーク
先ほどと同様でベンチマーク対象ディレクトリをEFSのマウントポイントに指定します。
1 2 3 4 5 6 7 |
# vi fio2.txt --------------- [random-read] rw=randread size=100m directory=/efs/ --------------- |
実施結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# fio fio2.txt random-read: (g=0): rw=randread, bs=4K-4K/4K-4K/4K-4K, ioengine=sync, iodepth=1 fio-2.1.5 Starting 1 process random-read: Laying out IO file(s) (1 file(s) / 100MB) Jobs: 1 (f=1): [r] [100.0% done] [1452KB/0KB/0KB /s] [363/0/0 iops] [eta 00m:00s] random-read: (groupid=0, jobs=1): err= 0: pid=2783: Mon Feb 13 07:38:16 2017 read : io=102400KB, bw=1479.4KB/s, iops=369, runt= 69222msec clat (msec): min=1, max=205, avg= 2.70, stdev= 1.67 lat (msec): min=1, max=205, avg= 2.70, stdev= 1.67 clat percentiles (usec): | 1.00th=[ 2040], 5.00th=[ 2128], 10.00th=[ 2160], 20.00th=[ 2256], | 30.00th=[ 2320], 40.00th=[ 2384], 50.00th=[ 2576], 60.00th=[ 2800], | 70.00th=[ 2928], 80.00th=[ 2992], 90.00th=[ 3120], 95.00th=[ 3216], | 99.00th=[ 5216], 99.50th=[ 6624], 99.90th=[10816], 99.95th=[20096], | 99.99th=[67072] bw (KB /s): min= 975, max= 1572, per=100.00%, avg=1480.40, stdev=64.35 lat (msec) : 2=0.28%, 4=97.80%, 10=1.80%, 20=0.07%, 50=0.04% lat (msec) : 100=0.01%, 250=0.01% cpu : usr=0.16%, sys=0.25%, ctx=25629, 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=25600/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=102400KB, aggrb=1479KB/s, minb=1479KB/s, maxb=1479KB/s, mint=69222msec, maxt=69222msec |
EC2上に構築したNFSサーバをマウントしてベンチマーク
EFSを利用する一つの理由として、現状NFSで構築しているEC2インスタンスをEFSに変更して運用したいというケースが考えられますので、EC2上にNFSサーバを作成してベンチマークを取得してみました。
NFSサーバとなるEC2インスタンスはやはりAmazon Linuxでt2.microです。
コンフィグファイルを作成。
1 2 3 4 5 6 7 |
# vi fio3.txt ------------------- [random-read] rw=randread size=100m directory=/nfsdata/ ------------------- |
ベンチマーク実施
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# fio fio3.txt random-read: (g=0): rw=randread, bs=4K-4K/4K-4K/4K-4K, ioengine=sync, iodepth=1 fio-2.1.5 Starting 1 process random-read: Laying out IO file(s) (1 file(s) / 100MB) Jobs: 1 (f=1): [r] [100.0% done] [3560KB/0KB/0KB /s] [890/0/0 iops] [eta 00m:00s] random-read: (groupid=0, jobs=1): err= 0: pid=22950: Mon Feb 13 09:08:53 2017 read : io=102400KB, bw=3423.3KB/s, iops=855, runt= 29913msec clat (usec): min=955, max=14770, avg=1165.30, stdev=365.68 lat (usec): min=956, max=14770, avg=1165.57, stdev=365.68 clat percentiles (usec): | 1.00th=[ 1004], 5.00th=[ 1020], 10.00th=[ 1032], 20.00th=[ 1064], | 30.00th=[ 1080], 40.00th=[ 1096], 50.00th=[ 1112], 60.00th=[ 1128], | 70.00th=[ 1144], 80.00th=[ 1160], 90.00th=[ 1224], 95.00th=[ 1400], | 99.00th=[ 2800], 99.50th=[ 3504], 99.90th=[ 5280], 99.95th=[ 7200], | 99.99th=[11584] bw (KB /s): min= 3104, max= 3816, per=100.00%, avg=3427.51, stdev=153.94 lat (usec) : 1000=0.73% lat (msec) : 2=97.21%, 4=1.79%, 10=0.25%, 20=0.03% cpu : usr=0.00%, sys=0.78%, ctx=25622, 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=25600/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=102400KB, aggrb=3423KB/s, minb=3423KB/s, maxb=3423KB/s, mint=29913msec, maxt=29913msec |
結果を比較して分かったこと
上記ベンチマーク結果を表にしたものが以下です。
ボリューム | EBS | EFS | NFS(EC2) |
---|---|---|---|
スループット | 13899KB/s | 1479KB/s | 3423KB/s |
実行時間 | 7367msec | 69222msec | 29913msec |
あれ?EFS遅い?
EBSが最も速いのは当然の結果なのですが、EC2上にNFSサーバを立てた方が速いという結果になりました。
ランダムライト性能はどうか
では、書き込み性能はどうなのかも気になったので計測してみました。
結果のみ記載です。
ボリューム | EBS | EFS | NFS(EC2) |
---|---|---|---|
スループット | 1449.3MB/s | 1250.0MB/s | 1282.6MB/s |
実行時間 | 69msec | 80msec | 78msec |
書き込み性能は読込ほど大きな差は出ませんでしたが、EBSがやはり最も早く、NFS、EFSがほぼ同じという結果になりました。
まとめ
検証の結果、EFSは速度的にはNFSに劣るということが分かりました。
私が本検証を行う前は、EFSってやっぱり速いんだろうなと思っていたので、個人的には意外な結果となりました。
とはいえ3ステップで使用出来たり、複数アベイラビリティゾーンの設定ができたり等、便利な点もありますので、用途に合わせてEFSを選択すると良いのではないでしょうか。
また、EFSはまだ東京リージョンでは展開されていませんので、今後東京リージョンで使えるようになった際には再度検証を取ってみたいと思います。