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

AWS, EFS

本記事は 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段階山があります。

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

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

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

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

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

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

衝突

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

上書きの場合

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

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

追記の場合

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

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

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

衝撃

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

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

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

EFSでデプロイしてみる

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

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

2.動かします

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

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

node_modulesの存在を確認します。

4.同様に動かします

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

おまけ

二重にマウント

できるようです。

ひらがなディレクトリ

できるようです。

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

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

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

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

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

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

この記事を書いた人

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

AWS, EFS