COM306のサンプルアプリのコールドスタート時のパフォーマンスを測定してみた

re:Invent 2023のセッション“Rustifying” serverless: Boost AWS Lambda performance with Rust (COM306) で紹介されていたサンプルアプリケーションをコールドスタート時のパフォーマンス測定をするOSSツールSAR-measure-cold-startで測定してみました。
2023.12.23

はじめに

前回構築したアプリケーションをSAR-measure-cold-startでベンチマークしてみます。 SAR-measure-cold-startはLambda関数のコールドスタート時のパフォーマンスを測定するOSSのツールです。

ツール

COM306では以下の2つのベンチマークツールが紹介されていました。

今回はSAR-measure-cold-startを試してみます。

デプロイ

こちらのページの「Deploy」ボタンからデプロイできます。

実行例

作成されるStep Functionsのステートマシンにパラメータを指定して実行します。 ドキュメントに従って以下のようなパラメータで実行します。 PayloadはAPI Gatewayから送信されるイベントから必要な部分だけを抜粋しています。

/buckets-pythonの実行例

{
  "functionName": "s3-admin-ListBucketsPython-FBl1ffItnuYj",
  "count": 100,
  "payload": "{\"type\": \"REQUEST\", \"resource\": \"/buckets-python\", \"path\": \"/buckets-python\", \"httpMethod\": \"GET\", \"headers\": {}, \"queryStringParameters\": {}, \"pathParameters\": {}}"
}

実行結果はステートマシンの出力として以下のようなJSONで得られます。

{
  "functionName": "s3-admin-ListBucketsPython-FBl1ffItnuYj",
  "note": "The values include both DURATION as well as INIT DURATION",
  "result": [
    {
      "functionName": "s3-admin-ListBucketsPython-FBl1ffItnuYj",
      "memorySize": 128,
      "coldStarts": 36,
      "min": 3904.21,
      "p25": 4126.27,
      "median": 4215.19,
      "p75": 4307.35,
      "p95": 4462.94,
      "max": 4657.02,
      "stddev": 158.2016
    }
  ]
}

次のようなワンライナーで整形しスプレッドシートに貼り付けられます。

jq -r '.result[] | [.coldStarts,.functionName,.max,.median,.memorySize,.min,.p25,.p75,.p95,.stddev] | @tsv'

実行結果

Rust およびPythonの各実装での実行結果は以下の通りです。

functioName memorySize coldStarts min p25 median p75 p95 max stddev
s3-admin-ListBucketsRust-Skixu32S4m77 128.00 90.00 1,025.26 1,231.88 1,258.11 1,291.68 1,354.99 1,490.81 64.70
s3-admin-ListBucketsPython-FBl1ffItnuYj 128.00 88.00 3,692.48 4,052.09 4,128.15 4,183.66 4,254.29 4,311.06 116.21

Rust実装の方が実行時間が短く実行時間の分散も小さくなっていることがわかります。

まとめ

SAR-measure-toolでRust/Pythonでの各実装のコールドスタート時のパフォーマンスを測定してみました。