はじめに
OCI Fuctionsの実行環境はコンテナです。
Functionsをキックすると、コンテナイメージがPullされてコンテナが起動し、コードが実行されますが、初回起動時にはこの実行環境の起動に時間がかかります。(コールドスタート)
これを回避するための機能としてProvisioned Concurrencyがあります。
Provisioned Concurrencyを活用することで、事前にコンテナを起動しておいて、初回起動時の遅延を少なくすることができます。(ホットスタート)
Provisioned Concurrencyなしの状態
今回はGoのサンプルアプリを使用して実行時間を比べます。
こちらと同じ手順でサンプルアプリをデプロイし、Functionsを実行します。
$ time fn invoke app01 hello-func01
{"message":"Hello World"}
real 0m24.168s
user 0m0.081s
sys 0m0.012s
実行時間は約24秒でした。
なお、2回目以降はコンテナが保持されているので、約3秒となります。コンテナは一定時間が経過すると削除されます。
$ time fn invoke app01 hello-func01
{"message":"Hello World"}
real 0m3.664s
user 0m0.073s
sys 0m0.015s
Provisioned Concurrencyありの状態
OCIコンソールから新しいアプリケーションを作成し、関数を作成します。
その際、使用するコンテナイメージは同じイメージを指定します。
Functionsを実行します。
$ time fn invoke app02 hello-func02-pc
{"message":"Hello World"}
real 0m3.591s
user 0m0.076s
sys 0m0.010s
約3秒となり、Provisioned Concurrencyを活用したホットスタートの効果がわかります。
補足
実は、最初に実行したProvisioned Concurrency「なし」と同じコンテナが使われてるから早いのではないかと思ったので、念のためさらに別のアプリケーションを作成して、Provisioned Concurrency「なし」の状態でFunctionsを実行したところ、20秒以上かかりました。
これでProvisioned Concurrencyの効果が確認できたと思います。
$ time fn invoke app03 hello-func03
{"message":"Hello World"}
real 0m21.789s
user 0m0.077s
sys 0m0.009s