#chiroito ’s blog

Java を中心とした趣味の技術について

Hot Function でファンクションのレスポンス時間を短縮 @ Fn

リクエストを処理するために新たなコンテナを作成し、処理終了後にはそのコンテナを停止します。これをリクエストのたびに繰り返します。

コンテナの作成処理は非常に時間が掛かるため、レスポンス時間がとても長くなってしまいます。また、コンテナの作成処理や終了処理に CPU などのリソースを使うため、無駄なリソースが消費されます。

Hot Function という機能を使うことで、一定期間コンテナを再利用します。これにより、一定期間の間に同一のファンクションへリクエストがあると、前回と同じコンテナがリクエストを処理します。これにより、コンテナの作成処理や停止処理の回数が減少するため、レスポンス時間の短縮や、無駄なリソースの消費を抑えられます。

私の環境では、ノートパソコン上に VirtualBox で Linux として Docker Host を実行しています。その環境下でも、Hot Function を使わない場合はレスポンス時間が 2000~3000ms 程度かかりましたが、Hot Function を使うと 40~50ms になりました。

Hot Function の設定

Hot Function はファンクションの設定ファイルで有効にします。func.yamlファイルにformatidle_timeoutを設定します。formathttpを設定すると 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