目次

目次

EFS使ってみた ~ ユースケースを用いて使うには ~

鈴木
鈴木
最終更新日2019/06/18 投稿日2019/06/18

本記事は EFS使ってみた ~ EBSとEFSの読み込み速度を比較編 ~ の続きです。

つづき

上記の記事で一旦終了でいいかなと思いましたが、ユースケースを用いてまともに使うにはどうすればよいかを考察します。

AZを分ける

AZを同じでやってみましたが今度は分けてみましょう。

ebs-az.png
efs-az.png

前回と同じようなグラフになりました。 AZが遠いと死期が早まるようです。 EBSかEFSかという観点ではやはりどちらも同じ感じです。

変更タイムラグ

追記されまくっているファイルにアクセスしたときなにが返るのか見てみます。

  1. unixtimeをいっぱいファイルに書く
  2. そのファイルを取得した時間とファイル内の時間を比較
ebs-rag1000.png
efs-rag1000.png

マイナスになっている箇所があります。 読みとりに待ち時間が発生するのでしょう。 EBSでは数ミリ秒の差分ですがEFSは10ミリ秒前後誤差がある様子。

ebs-time-l.png
efs-time-l.png

とにかくいっぱいやってみました。 これはなかなかおもしろい結果が得られました。 EBSは45301回でEFSは235721回と、同期間でサンプリングに差が出ました。 試行回数分線形に負荷が高くなっていく(14B)のですがある一定のラインを境にパフォーマンスが変化し、EBSとEFSで違いが見られるということです。 どちらもバーストクレジットが枯渇したというわけではないでようです。 グラフでは見にくいのでそれぞれ境界部分を見てみます。

まずEBSは2段階山があります。

18173,1289
18174,0
18175,0
18176,3272
18177,5355
18178,3248

18176回目を境に5~8秒のズレが生じ始めています。 サンプルが256KBを超え始めたからからかもしれません。

32148,5164
32149,6949
32150,10375
32151,9903

途中で持ち直すこともあり平均値が見えにくいのですが二段階目の山はこのあたりです。 32000前後で10秒超えるズレが見え始めます。

次にEFSはかなり長い時間パフォーマンスを維持し、ある一点で急激に劣化しています。 グラフでは試行回数が多すぎて見えないんですがこちらも実は段階が二つあります。

216010,5757
216011,8047
216012,8
216013,5513
216014,12192

だいたいこのへんです。このあたりでは3MB超をさばいています。 EBSが2万回弱だったところをみると驚異的なパフォーマンスなのではないでしょうか。 分散ストレージの強みといったところです。 劣化度は近似に見えます。

続いて、二段階目の山なのですが

234424,9199
234425,5808
234426,13172
234427,18762
~~~
234443,100344
234444,104858
234445,110148
234446,114670
~~~
235718,6438648
235719,6443140
235720,6447800
235721,6452540

なんと234424回目を境に線形に劣化していきます。 通常使っている分には気にならない誤差かもしれませんが、じわじわと遅くなっていく、みたいなことが発生するかもしれません。

衝突

同時に書き込みまくってみます。

上書きの場合

  1. 3つのサーバー(A,B,C)がEFSをマウントします
  2. AとBが同じファイルを上書きまくります
  3. Cからはなにが見えるのか
# cat col
abcdefg
# cat col
# cat col
# cat col
# cat col
# cat col
# cat col
# cat col
qwertyu
# cat col
# cat col
# cat col
# cat col
# cat col
# cat col
# cat col
# cat col
# cat col
qwertyu
# cat col
# cat col
abcdefg

1秒間隔だとどちらかのファイルが見れますが、1ミリ秒間隔だと、0バイトファイルが見えるようです。 つまり、更新頻度の高いファイルにアクセスする際に空でないことは保証されないということでありなにか入っていることを前提にするとアプリが死んでしまう可能性があります。 参照一貫性オプションみたいなものはあるんでしょうか・・・

追記の場合

こんどは上書きではなく追記をしてみます。

qwertyu
qwertyu
qwertyu
qwertyu
qwertyu
abcdefg
abcdefg
abcdefg
qwertyu
qwertyu
qwertyu
qwertyu
qwertyu

こんなようなファイルができました。 順番にある程度まとまって書き込みがされるようです。 が、若干気になる挙動を示しました。

bin.png

63バイトの00ビットが挿入されています。これはあぶない。 これは前半のほうなのでコネクションの際の歪みなのでしょうか。 あんまり同時に追記するとファイルが壊れてしまう可能性がありそうです。

衝撃

読み込んでいる最中に破壊

大きめのファイルを読み込んでいる最中に削除してみます。

-rw-r--r-- 1 root root 67108864 Sep 10 06:40 34
-rw-r--r-- 1 root root 67108864 Sep 10 06:40 35
-rw-r--r-- 1 root root 67108864 Sep 10 06:41 36
-rw-r--r-- 1 root root 67108864 Sep 10 06:41 37
-rw-r--r-- 1 root root        0 Sep 10 06:41 38

こんな感じで削除される直前まではちゃんとファイルが取れるようです。 (0バイトファイルはwriteストリームを作成したあとにファイルが存在しなかったため)

EFSでデプロイしてみる

EFSにアプリを置いて、そのまま他のサーバーでマウントして使えるのかやってみます。 ※注意! 常にディスクI/Oが発生する実装系では利用してはいけません。ログなど置いたりもしてはダメです。

1.EFSにアプリを配置します

servershare]# mkdir efs
servershare]# sudo mount -t efs fs-b1a55290:/ efs
servershare]# cd efs/
efs]# mkdir servershare
efs]# cd servershare
servershare]# cp ../../*.coffee .
servershare]# cp ../../*.json .
servershare]# ls
app.coffee  efs  helper.coffee  helper_snipet.coffee  package.json  package-lock.json

2.動かします

servershare]# npm i
npm WARN resp@1.0.0 No description
npm WARN resp@1.0.0 No repository field.

added 103 packages from 130 contributors and audited 138 packages in 35.41s
found 0 vulnerabilities

servershare]# coffee app.coffee
listen
^Z
[1]+  Stopped                 coffee app.coffee
servershare]# bg 1
[1]+ coffee app.coffee &
servershare]# jobs 1
[1]+  Running                 coffee app.coffee &
servershare]# disown %1
servershare]# 

servershare]# curl localhost
done
servershare]# 

うごきました。EFS上でnode_moduleを展開するのはリスキーな気がします。

3.別のサーバーで同じEFSをマウントします

servershare]# sudo mount -t efs fs-b1a55290:/ efs 
servershare]# cd efs/servershare/
servershare]# ls
app.coffee  helper.coffee  helper_snipet.coffee  node_modules  package.json  package-lock.json

node_modulesの存在を確認します。

4.同様に動かします

servershare]# coffee app.coffee
listen
^Z
[1]+  Stopped                 coffee app.coffee
servershare]# bg 1
[1]+ coffee app.coffee &
servershare]# jobs 1
[1]+  Running                 coffee app.coffee &
servershare]# disown %1
servershare]# curl localhost
done
servershare]# 

問題なくできました。 が、やはり現実的ではありません。(サービスに登録できない、次のデプロイの際に制御できない) ゆるーいCDNとして使うか、アプリ内から参照する静的コンテンツだけを置くのであれば使えると思います。

おまけ

二重にマウント

# mkdir efs2
# sudo mount -t efs fs-b1a55290:/ efs2                                                  
# ls
efs  efs2  efscheck  onegibi
# ls efs
efs  fileb  filek  filem
# ls efs2
efs  fileb  filek  filem

できるようです。

ひらがなディレクトリ

# mkdir ひらがな
# ls
ひらがな  efs  fileb  filek  file

できるようです。

EFS内のディレクトリを指定して指定したディレクトリにマウント

# ls efs2
ひらがな  efs  fileb  filek  filem  folder
# mkdir sele
# sudo mount -t efs fs-b1a55290:/folder sele
# ls sele
testest

できました。セグメンター制度も安心。

EFSの中でEFSをマウントする

# sudo mount -t efs fs-b1a55290:/ efs
# cd efs
# sudo mount -t efs fs-b1a55290:/ efs
# cd efs
# sudo mount -t efs fs-b1a55290:/ efs
# cd efs
# sudo mount -t efs fs-b1a55290:/ efs
# cd efs
# sudo mount -t efs fs-b1a55290:/ efs
# cd efs
# pwd
/root/efs/efs/efs/efs/efs/efs/efs/efs

けっこう掘れるようです。

・バーストクレジットを使い切ってはいけない ・ベースライン内で納めるように(S3やDynamoDBのようにスロットル調整が重要) ・Webサーバーから返却させるのは危険(かも。アンチパターンの薫りがする)

ストレージとしてのパフォーマンスはかなり高いと思われます。 ストレージとしてのお値段はかなり高いと思われます。

鈴木

和服とvapeとСистемаと醗酵とたまごふわふわとカッティングシェイプスとジャージークラブとjuke/fwkに傾倒する人です

目次