リクエストを処理するために新たなコンテナを作成し、処理終了後にはそのコンテナを停止します。これをリクエストのたびに繰り返します。
コンテナの作成処理は非常に時間が掛かるため、レスポンス時間がとても長くなってしまいます。また、コンテナの作成処理や終了処理に CPU などのリソースを使うため、無駄なリソースが消費されます。
Hot Function という機能を使うことで、一定期間コンテナを再利用します。これにより、一定期間の間に同一のファンクションへリクエストがあると、前回と同じコンテナがリクエストを処理します。これにより、コンテナの作成処理や停止処理の回数が減少するため、レスポンス時間の短縮や、無駄なリソースの消費を抑えられます。
私の環境では、ノートパソコン上に VirtualBox で Linux として Docker Host を実行しています。その環境下でも、Hot Function を使わない場合はレスポンス時間が 2000~3000ms 程度かかりましたが、Hot Function を使うと 40~50ms になりました。
Hot Function の設定
Hot Function はファンクションの設定ファイルで有効にします。func.yaml
ファイルにformat
とidle_timeout
を設定します。format
はhttp
を設定すると Hot Function になります。idle_timeout
はファンクションが停止するまでのアイドル時間で、現時点でのデフォルトは 30 秒です。
>cat func.yaml name: hello-java version: 0.0.6 runtime: java cmd: com.example.fn.HelloFunction::handleRequest format: http
Hot Function 無効時
今回はhello-java
イメージを使用して検証します。リクエストを受けると、hello-java
コンテナが作成されます。リクエスト処理後すぐにそのコンテナが停止していることが分かります。
(リクエスト前の状況) >docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6d42ab37135f fnproject/functions "preentry.sh ./fun..." 3 days ago Up 3 days 2375/tcp, 0.0.0.0:8080->8080/tcp functions (リクエストを処理中) >docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 15c4f826e3d7 chiroito/hello-java:0.0.4 "/usr/bin/java -XX..." 53 seconds ago Up 1 second 01BWFPWAFF47WHG00000000000 6d42ab37135f fnproject/functions "preentry.sh ./fun..." 3 days ago Up 3 days 2375/tcp, 0.0.0.0:8080->8080/tcp functions (リクエスト処理後) >docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6d42ab37135f fnproject/functions "preentry.sh ./fun..." 3 days ago Up 3 days 2375/tcp, 0.0.0.0:8080->8080/tcp functions
Hot Function 有効時
こちらもリクエストを受けると、hello-java
コンテナが作成されます。リクエスト処理後すぐにそのコンテナが停止していません。今回、アイドル時間はデフォルトの 30 秒に設定しているため、30秒過ぎると停止します。
(リクエスト前の状況) >docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6d42ab37135f fnproject/functions "preentry.sh ./fun..." 3 days ago Up 3 days 2375/tcp, 0.0.0.0:8080->8080/tcp functions (リクエストを処理中) >docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ec034db565ca chiroito/hello-java:0.0.6 "/usr/bin/java -XX..." 52 seconds ago Up 1 second 01BWFZJES647WSJ00000000000 6d42ab37135f fnproject/functions "preentry.sh ./fun..." 3 days ago Up 3 days 2375/tcp, 0.0.0.0:8080->8080/tcp functions (リクエストの少し後) >docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ec034db565ca chiroito/hello-java:0.0.6 "/usr/bin/java -XX..." About a minute ago Up 25 seconds 01BWFZJES647WSJ00000000000 6d42ab37135f fnproject/functions "preentry.sh ./fun..." 3 days ago Up 3 days 2375/tcp, 0.0.0.0:8080->8080/tcp functions (リクエスト処理後しばらく後) >docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6d42ab37135f fnproject/functions "preentry.sh ./fun..." 3 days ago Up 3 days 2375/tcp, 0.0.0.0:8080->8080/tcp functions