何でも屋エンジニアのブログ

Rails中級者向け勉強会Step-to-Rails-Expert.rbや出席した勉強会に関するメモが多い

AWS Summit 2017「全部教えます!サーバレスアプリのアンチパターンとチューニング」のメモ

AWS Summit 2017にて全部教えます!サーバレスアプリのアンチパターンとチューニングを聴講したのでそのメモです。 かなり詳しい話を聞けて大変参考になりました。 www.awssummit.tokyo

メモ

パフォーマンスをどう上げるか

プログラム側

各言語のベストプラクティス・最適化方法はそのまま当てはまるので、プログラムのパフォーマンスを上げておく

コンピューティングリソース不足

  • メモリ設定
    • 実際にはリソース全体のパフォーマンスの設定を意味する。
    • メモリに比例してcpuのリソースも上がる。
    • メモリ設定を上げることで実行時間が減り、パフォーマンスが向上し一方でコストが変わらないこともある。
    • 適切なスペックを洗濯することが大事。低スペックからだんだんあげていって、処理時間が変わらなくなるスペックがあるので、そのスペックに決めるのが良い。

コールドスタート

起こる条件
  • 利用可能なコンテナがない場合 
  • そもそも1つもコンテナがない
  • 利用可能な数以上に同時に処理すべきリクエストが来た。
  • コード・設定の変更をした
  • これらの条件にあてはまなければ発生しない。コールドスタートは全体の1%くらい

コールドスタートが許容できないのであればLambdaを使うべきではない

速くするためには
  • コンピューティングリソースを上げる
  • 言語を変える
    javaはコールドスタートが遅い。ウォームスタートの場合、コンパイル言語の方が速い傾向
  • VPC接続ははENIの発生を伴うので必要がなければ使わない(VPCアクセスが必要なければ使わない)
    これだけでコールドスタート時の10秒程度を削減する可能性
  • パッケージサイズを小さくする
    コード量の削減、不要な依存関係の削減、最適化ツールを使用するなど
アーキテクチャ
  • 同期でinvokeすると同時実行数の制限にひっかかる
  • 非同期でinvokeするのがスケーラビリティの観点ではおすすめ
  • api gatewayと組み合わせる場合、putの場合は直接呼び出すのではなくsqs kinesisに流し、それをイベントソースとして実行するべき。getはキャッシュする。

  • 並列実行できるようにする

    • 1回のinvokeでループさせるのでなく、回数分ファンクションを非同期invokeする
    • 長時間実行が減るので、同時実行数の制限にひっかからなくなる
    • ストリームベースの場合は少し考え方が違う。ストリームの中のシャードの数がイコール同時実行数

アンチパターン

  • RDBMSと併用する
    • lamdba + rdbmsは、lambdaの並列実行数分のコネクションが貼られるのできつい。
    • vpc接続が必須になってしまう

dynamoがおすすめ

ログ

cloudwatchメトリクス、cloudwatchカスタムメトリクス、cloudwatch logsへのログ出力を行う

その他

  • 障害を前提に設計する
    リトライ、DeadLetterQueueを活用する

その他

スピーカーの西谷さんの著書が発売されているので、こちらを読むとさらに理解が深まりそうです。