2&>1

AWSとかGCPとかGolangとかとか

EFSとS3(s3fs)とS3(goofy)の比較を試す

かなり改めてのなのですがS3マウントさせて利用しているフォルダをEFSへ変更する事情があったので性能比較してみるかとやってみました。

なんだかんだで「s3fs」と「goofy」の比較もついでにしました。

今回は環境構築手順については割愛。

検証条件

リージョン:東京

インスタンスタイプ:M5a.large

EC2からEFS/S3(s3fs)/s3(goofys)をマウント。S3は同一バケットをマウントしている。

EFS/S3ともに暗号化あり

s3fs version : 1.85

goofys version :

検証方法

マウントポジションに対して「fio」「dd」コマンドでの計測と複数個のファイル作成とファイル表示の時間を計測

結果

「fio」コマンド

  1. EFSの場合
# fio --directory=/mnt/efs --name fio_test_file --direct=1 --rw=randread --bs=4k --size=1G --numjobs=4 --time_based --runtime=180 --group_reporting --norandommap
fio_test_file: (g=0): rw=randread, bs=4K-4K/4K-4K/4K-4K, ioengine=psync, iodepth=1
...
fio-2.14
Starting 4 processes
fio_test_file: Laying out IO file(s) (1 file(s) / 1024MB)
fio_test_file: Laying out IO file(s) (1 file(s) / 1024MB)
fio_test_file: Laying out IO file(s) (1 file(s) / 1024MB)
fio_test_file: Laying out IO file(s) (1 file(s) / 1024MB)
Jobs: 4 (f=4): [r(4)] [100.0% done] [4376KB/0KB/0KB /s] [1094/0/0 iops] [eta 00m:00s]
fio_test_file: (groupid=0, jobs=4): err= 0: pid=2891: Mon Mar 18 05:58:47 2019
  read : io=778452KB, bw=4324.7KB/s, iops=1081, runt=180005msec
    clat (msec): min=1, max=154, avg= 3.70, stdev= 1.59
     lat (msec): min=1, max=154, avg= 3.70, stdev= 1.59
    clat percentiles (usec):
     |  1.00th=[ 2192],  5.00th=[ 2352], 10.00th=[ 2480], 20.00th=[ 2672],
     | 30.00th=[ 2896], 40.00th=[ 3088], 50.00th=[ 3280], 60.00th=[ 3536],
     | 70.00th=[ 4640], 80.00th=[ 4832], 90.00th=[ 5024], 95.00th=[ 5216],
     | 99.00th=[ 6496], 99.50th=[ 8256], 99.90th=[17280], 99.95th=[27776],
     | 99.99th=[52480]
    lat (msec) : 2=0.02%, 4=63.97%, 10=35.69%, 20=0.24%, 50=0.07%
    lat (msec) : 100=0.01%, 250=0.01%
  cpu          : usr=0.23%, sys=0.39%, ctx=194650, majf=0, minf=39
  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=194613/w=0/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
   READ: io=778452KB, aggrb=4324KB/s, minb=4324KB/s, maxb=4324KB/s, mint=180005msec, maxt=180005msec

2 . S3(s3fs)の場合

エラーで計測できず(S3に対してはできない様子)

3 . S3(goofys)の場合

エラーで計測できず(S3に対してはできない様子)

「dd」コマンド

# dd if=/dev/zero of=ddtest bs=1M count=1000

マウントポジションへ移動して実行

1 . EFSの場合

1048576000 bytes (1.0 GB) copied, 9.32339 s, 112 MB/s

2 . S3(s3fs)の場合

1048576000 bytes (1.0 GB) copied, 15.1685 s, 69.1 MB/s

3 . S3(goofys)の場合

1048576000 bytes (1.0 GB) copied, 7.03157 s, 149 MB/s

ファイル作成

# i=1; time while [ $i -le 500 ]
> do
> touch goofy_test_$i > /dev/null 2>&1
> i=$((i+1))
> done

マウントポジションへ移動して実行

1 . EFSの場合

real    0m7.806s
user    0m0.303s
sys     0m0.082s

2 . S3(s3fs)の場合

real    1m47.808s
user    0m0.338s
sys     0m0.082s

3 . S3(goofys)の場合

real    0m34.765s
user    0m0.348s
sys     0m0.078s

ファイル一覧表示

time ls -laR /path/to/mount > /dev/null

1 . EFSの場合

real    0m0.071s
user    0m0.003s
sys     0m0.003s

2 . S3(s3fs)の場合

real    0m0.707s
user    0m0.019s

3 . S3(goofys)の場合

real    0m1.073s
user    0m0.028s
sys     0m0.061s

まとめ

アバウトな検証ですけどざっくりと知るぶんには十分でしょうか。

goofysはやはりはやいですがs3fsも読み取り速度あがったんですかね?こんなに早かったイメージないんですが。。

でもEFSが東京リージョンで利用できる今、S3をマウントさせてまで使う必要性はないかな。

マネージドサービスですし、なにより導入が簡単です。なんだかんだでS3使うにはインストールに必要なモジュールが多いです。 EFSならユーティリティーツールで一発です。

もうちょっと踏み込んでやるならログをEFSに吐き出して書き込めきれるかとかスクリプト置いて読み込めるかとか画像とかとかやるべきでしょう。I/O的にはそこそこ大丈夫なきもしますが。

とりあえずはこのくらいで。