(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024125912
(43)【公開日】2024-09-19
(54)【発明の名称】プログラム、情報処理方法および情報処理装置
(51)【国際特許分類】
G06F 9/445 20180101AFI20240911BHJP
【FI】
G06F9/445 130
【審査請求】未請求
【請求項の数】10
【出願形態】OL
(21)【出願番号】P 2023034045
(22)【出願日】2023-03-06
(71)【出願人】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】110002918
【氏名又は名称】弁理士法人扶桑国際特許事務所
(72)【発明者】
【氏名】皆藤 広樹
【テーマコード(参考)】
5B376
【Fターム(参考)】
5B376AC13
5B376AE21
5B376AE52
5B376EA08
5B376EA15
(57)【要約】
【課題】関数の実行環境の起動を高速化する。
【解決手段】処理部12は、ソースコード30に記述された関数の実行に用いられる第1のパッケージをソースコード30に基づいて特定する。処理部12は、第1のパッケージに含まれるメタ情報であって、第1のパッケージそれぞれにより参照される第2のパッケージを示すメタ情報に基づいて第2のパッケージを特定する。処理部12は、ソースコード30と第1のパッケージと第2のパッケージとを用いて関数の実行環境を構築する。
【選択図】
図1
【特許請求の範囲】
【請求項1】
コンピュータに、
ソースコードに記述された関数の実行に用いられる第1のパッケージを前記ソースコードに基づいて特定し、前記第1のパッケージに含まれるメタ情報であって、前記第1のパッケージにより参照される第2のパッケージを示す前記メタ情報に基づいて前記第2のパッケージを特定し、
前記ソースコードと前記第1のパッケージと前記第2のパッケージとを用いて前記関数の実行環境を構築する、
処理を実行させるプログラム。
【請求項2】
前記実行環境による前記関数の実行時のスタックトレースに基づいて、前記第2のパッケージが前記関数の実行に用いられたか否かを判定し、
前記第2のパッケージが前記関数の実行に用いられなかった場合、前記第2のパッケージを用いずに前記実行環境を再構築する、
処理を前記コンピュータに実行させる請求項1記載のプログラム。
【請求項3】
前記再構築では、前記第1のパッケージに含まれるコードの中から、前記第2のパッケージに属するプログラム部品を参照する参照コードを削除する、
処理を前記コンピュータに実行させる請求項2記載のプログラム。
【請求項4】
前記第2のパッケージを含む複数のパッケージそれぞれに含まれる他のメタ情報であって、当該パッケージにより参照される他のパッケージを示す前記他のメタ情報に基づき、前記第1のパッケージを起点に前記第2のパッケージを介して参照される第3のパッケージを特定し、前記第3のパッケージを更に用いて前記実行環境を構築する、
処理を前記コンピュータに実行させる請求項1記載のプログラム。
【請求項5】
前記実行環境による前記関数の実行時のスタックトレースに基づいて、前記第3のパッケージが前記関数の実行に用いられたか否かを判定し、
前記第3のパッケージが前記関数の実行に用いられなかった場合、前記第3のパッケージを用いずに前記実行環境を再構築する、
処理を前記コンピュータに実行させる請求項4記載のプログラム。
【請求項6】
前記再構築では、前記第3のパッケージの参照元である前記第2のパッケージまたは第4のパッケージに含まれるコードの中から、前記第3のパッケージに属するプログラム部品を参照する参照コードを削除する、
処理を前記コンピュータに実行させる請求項5記載のプログラム。
【請求項7】
前記関数の登録を受け付けると前記関数に対応する前記第1のパッケージおよび前記第2のパッケージを特定し、
前記関数の呼び出しを受け付けると前記実行環境を構築し、
前記関数の呼び出しを所定時間よりも短い時間間隔で受け付けるたびに、前記実行環境による前記関数の実行を指示し、
前記関数の呼び出しを受け付けない時間が前記所定時間に達すると、前記実行環境を削除する、
処理を前記コンピュータに実行させる請求項1記載のプログラム。
【請求項8】
前記実行環境は、前記コンピュータまたは他のコンピュータのリソースを用いて動作するコンテナである、
請求項1記載のプログラム。
【請求項9】
コンピュータが、
ソースコードに記述された関数の実行に用いられる第1のパッケージを前記ソースコードに基づいて特定し、前記第1のパッケージに含まれるメタ情報であって、前記第1のパッケージにより参照される第2のパッケージを示す前記メタ情報に基づいて前記第2のパッケージを特定し、
前記ソースコードと前記第1のパッケージと前記第2のパッケージとを用いて前記関数の実行環境を構築する、
情報処理方法。
【請求項10】
ソースコードを記憶する記憶部と、
前記ソースコードに記述された関数の実行に用いられる第1のパッケージを前記ソースコードに基づいて特定し、前記第1のパッケージに含まれるメタ情報であって、前記第1のパッケージにより参照される第2のパッケージを示す前記メタ情報に基づいて前記第2のパッケージを特定し、前記ソースコードと前記第1のパッケージと前記第2のパッケージとを用いて前記関数の実行環境を構築する処理部と、
を有する情報処理装置。
【発明の詳細な説明】
【技術分野】
【0001】
本発明はプログラム、情報処理方法および情報処理装置に関する。
【背景技術】
【0002】
現在、アプリケーションソフトウェアを実行する情報処理環境を自ら所有する代わりに、サービス事業者のもつ情報処理環境をネットワーク経由で利用することが増えている。ネットワーク経由で情報処理環境を利用させるサービスはクラウドサービスと言われることがある。クラウドサービスには、例えば、ユーザが作成した、サーバレス関数と呼ばれる軽量プログラムを配備し、特定のイベントが発生したときに短時間だけサーバレス関数を実行するサービスがある。サーバレス関数の実行には、例えばコンテナ型仮想化などの仮想化技術が用いられる。コンテナ型仮想化では、例えば所定のプログラムの実行に用いるライブラリなどの資源を纏めたコンテナが、当該プログラムの実行環境として定義される。
【0003】
ところで、プログラムの実行性能を向上するために種々の方法が考えられている。例えば、データベース管理システムにおいて、元のプログラムから、分岐条件評価においてローカル不変量を参照する分岐文などの不要なコードを排除するためにマイクロ特化と呼ばれる方法を適用する技術が提案されている。この提案では、ローカルに不変量である変数に起因して不要であると識別されたDBMS(DataBase Management System)コードを、より少ない命令で当該DBMSコードと同じ関数を実施するマイクロ特化DBMSコードに置換する。
【0004】
また、実行モジュールの実行により記録した実行状況に基づいて、ソースコードを改善すべきプログラムブロックを判定することで、限られた開発者資源を、高い性能改善効果を得られるプログラムブロックの最適化作業に割り当て可能にする方法の提案もある。
【0005】
なお、プログラムコードの静的解析の結果を基に、プログラムコードの一部に対して、動的解析の対象とする検出対象コードの検出を行うことで、動的解析の処理負荷を削減するコード検出方法の提案がある。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】特開2018-14142号公報
【特許文献2】特開2009-211424号公報
【特許文献3】特開2008-217751号公報
【発明の概要】
【発明が解決しようとする課題】
【0007】
ここで、ソースコードでは、ユーザが記述した関数の実行のためのモジュールを提供する種々のパッケージが参照される。また、あるパッケージ内の処理の実行のために、更に他のパッケージが利用され得る。このため、関数の実行環境を構築する際、ユーザの関数で使用される可能性のある、予め定められたパッケージ群が、当該関数の実行環境を構築する装置により取得されることがある。しかし、この方法では、取得するパッケージの量が多くなり、関数の実行環境の構築に時間がかかることがある。
【0008】
1つの側面では、本発明は、関数の実行環境の起動を高速化することを目的とする。
【課題を解決するための手段】
【0009】
1つの態様では、プログラムが提供される。このプログラムは、コンピュータに、ソースコードに記述された関数の実行に用いられる第1のパッケージをソースコードに基づいて特定し、第1のパッケージに含まれるメタ情報であって、第1のパッケージにより参照される第2のパッケージを示すメタ情報に基づいて第2のパッケージを特定し、ソースコードと第1のパッケージと第2のパッケージとを用いて関数の実行環境を構築する、処理を実行させる。
【0010】
また、1つの態様では、コンピュータが実行する情報処理方法が提供される。また、1つの態様では、記憶部と処理部とを有する情報処理装置が提供される。
【発明の効果】
【0011】
1つの側面では、関数の実行環境の起動を高速化できる。
【図面の簡単な説明】
【0012】
【
図1】第1の実施の形態の情報処理装置を説明する図である。
【
図2】第2の実施の形態の情報処理システムの例を示す図である。
【
図3】中継サーバのハードウェア例を示す図である。
【
図9】ソースコードに取り込まれるパッケージの特定例を示す図である。
【
図11】ソースコードの関数から特定できないパッケージ群の例を示す図である。
【
図12】あるパッケージで使用される他のパッケージの例を示す図である。
【
図13】メタ情報に基づく他のパッケージの特定例を示す図である。
【
図14】パッケージ対応テーブルの例を示す図である。
【
図16】静的参照および動的参照の例を示す図である。
【
図17】関連パッケージと実際の処理の関係性の乖離の例を示す図である。
【
図19】使用されなかったクラスの削除例を示す図である。
【
図20】パッケージの置き換えによる不要パッケージの削除例を示す図である。
【
図21】パッケージ内のメソッドの置き換え例を示す図である。
【
図22】サービス構築の例を示すフローチャートである。
【
図23】関数実行制御の例を示すフローチャートである。
【
図24】関数登録の例を示すフローチャートである。
【
図25】関数処理(1)の例を示すフローチャートである。
【
図26】解析結果更新の例を示すフローチャートである。
【
図27】関数処理(2)の例を示すフローチャートである。
【発明を実施するための形態】
【0013】
以下、本実施の形態について図面を参照して説明する。
[第1の実施の形態]
第1の実施の形態を説明する。
【0014】
図1は、第1の実施の形態の情報処理装置を説明する図である。
情報処理装置10は、ユーザにより定義された関数の実行環境の構築を行う。関数の実行環境は、例えばコンテナなどにより実現される。例えば、情報処理装置10は、ネットワークを介して実行ノード20に接続され、実行ノード20のCPU(Central Processing Unit)やRAM(Random Access Memory)などのハードウェアリソースを用いて、関数実行環境21を構築する。関数実行環境21は、ユーザにより定義された関数の実行環境である。
【0015】
実行ノード20は、物理的なコンピュータ(物理マシン)でもよいし、物理マシンのハードウェアリソースを用いて動作する仮想的なコンピュータ(仮想マシン)でもよい。関数実行環境21により実行される関数は、サーバレス関数と呼ばれるものでもよい。情報処理装置10は、コンピュータと言われてもよい。関数実行環境21は、情報処理装置10上に構築されてもよい。
【0016】
情報処理装置10は、記憶部11および処理部12を有する。記憶部11は、RAMなどの揮発性の半導体メモリでもよいし、HDD(Hard Disk Drive)やフラッシュメモリなどの不揮発性ストレージでもよい。記憶部11は、ユーザにより作成されたソースコード30を記憶する。ソースコード30は、関数「function()」の記述例を示す。関数「function()」の具体的な処理内容の記述は、「<ロジック>」のように略記されている。
【0017】
処理部12は、例えば、CPU、GPU(Graphics Processing Unit)、DSP(Digital Signal Processor)などのプロセッサである。ただし、処理部12は、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)などの特定用途の電子回路を含んでもよい。プロセッサは、RAMなどのメモリ(記憶部11でもよい)に記憶されたプログラムを実行する。複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うことがある。
【0018】
処理部12は、ソースコード30に含まれる関数の実行に用いられる第1のパッケージをソースコード30に基づいて特定する。パッケージは、予め用意されたプログラム部品を纏めたものであり、ユーザのソースコードに組み込んで使用できるように公開されている。なお、Java(登録商標)やC++などにおけるクラスやC言語における関数は、プログラム部品の一例である。
【0019】
処理部12は、ソースコード30の記述に用いられるプログラミング言語で用意されている、「import」などの予約語をソースコード30から検出し、当該予約語で指定されるクラス名などから第1のパッケージを特定することができる。例えば、当該クラス名は「PKG_A.データ操作」のように、パッケージ(例えばPKG_A)を識別可能な情報を含む。「PKG」はパッケージ(Package)の略である。
【0020】
ただし、importなどの予約語とともに記述されているクラス名とそのパッケージを含むパッケージファイル名は一致していない可能性もある。そこで、処理部12は、予めパッケージを全て解析することで、クラス名とパッケージとの対応関係を示す辞書型データを作成して記憶部11に格納しておき、当該辞書型データに基づいてimport文などのクラス名に対応するパッケージを特定してもよい。なお、import文などではクラスの完全修飾名だけでなく、その接頭辞が指定されることもある。このため、処理部12は、接頭辞とパッケージとの対応関係も辞書型データに登録することが好ましい。
【0021】
例えば、処理部12は、ソースコード30に含まれるimport文から、第1のパッケージとして、パッケージ40(PKG_A)およびパッケージ50(PKG_B)を特定する。
【0022】
処理部12は、第1のパッケージに含まれるメタ情報であって、第1のパッケージにより参照される第2のパッケージを示すメタ情報に基づいて第2のパッケージを特定する。例えば、パッケージ40は、メタ情報40aを含む。メタ情報40aは、パッケージ40により参照されるパッケージ61(「PKG_C」)、およびパッケージ63(「PKG_E」)の情報を含む。また、パッケージ50は、メタ情報50aを含む。メタ情報50aは、パッケージ50により参照されるパッケージ65(「PKG_G」)の情報を含む。このため、処理部12は、メタ情報40a,50aに基づいて、パッケージ40により参照されるパッケージ61,63およびパッケージ50により参照されるパッケージ65を特定する。パッケージ61,63,65は第2のパッケージの一例である。
【0023】
なお、処理部12は、第1のパッケージに含まれるメタ情報に基づく第2のパッケージの特定を、ソースコード30からの第1のパッケージの特定よりも前に行ってもよい。例えば、処理部12は、第1のパッケージと第2のパッケージとの対応情報を予め作成して記憶部11に格納しておき、ソースコード30による関数実行環境21の構築時に、対応情報を用いて第2のパッケージを特定してもよい。
【0024】
処理部12は、ソースコード30と第1のパッケージと第2のパッケージとを用いて関数の実行環境を構築する。例えば、処理部12は、特定した第2のパッケージとして、パッケージ61,63,65を所定の装置からネットワークを介してダウンロードする。このとき、処理部12はパッケージ40,50を未取得の場合はパッケージ40,50もダウンロードする。そして、処理部12は、ソースコード30とパッケージ40,50およびパッケージ61,63,65を用いて実行ノード20上に関数実行環境21を構築する。関数実行環境21の構築後は、実行ノード20上で、ソースコード30に対応する関数が実行される。
【0025】
このように、情報処理装置10によれば、ソースコード30に記述された関数の実行に用いられる第1のパッケージがソースコード30に基づいて特定される。第1のパッケージに含まれるメタ情報であって、第1のパッケージにより参照される第2のパッケージを示すメタ情報に基づいて第2のパッケージが特定される。ソースコード30と第1のパッケージと第2のパッケージとを用いて関数の実行環境が構築される。これにより、情報処理装置10は、関数の実行環境の起動を高速化できる。
【0026】
ここで、第1の実施の形態の例において、パッケージ61,63,65は、パッケージ群60に含まれる。パッケージ群60は、パッケージ61,62,63,64,65の集合である。パッケージ40,50やパッケージ群60の各パッケージは、ユーザに提供するパッケージの集合として予め用意される。比較例として、ソースコード30における関数の実行環境の構築時に、情報処理装置10によりパッケージ40,50およびパッケージ群60の全パッケージを取得して、当該構築に用いることが考えられる。しかし、これら全てのパッケージを闇雲に取得して実行環境を構築すると、ソースコード30の関数に使用されない余計なパッケージが含まれることがあり、当該余計なパッケージの取得のために実行環境の構築に時間がかかる。また、ユーザの関数で使用される可能性のあるパッケージ群60を全て取得していると、新たなパッケージの追加に伴ってパッケージ群60が肥大化していき、実行環境の構築にかかる時間も増大し易い。
【0027】
そこで、情報処理装置10は、ソースコード30から特定した第1のパッケージに含まれるメタ情報を基に、当該第1のパッケージから参照される第2のパッケージを特定することで、パッケージ群60の中から、当該第2のパッケージのみを抽出できる。上記の例で言えば、処理部12は、パッケージ群60のうち、パッケージ61,63,65を取得して関数実行環境21の構築に用いるが、パッケージ62,64を取得しない。このように、関数実行環境21の構築に余計なパッケージが取得されないので、関数実行環境21の構築に要する時間が短縮され、関数の実行環境を起動させる時間が短縮される。
【0028】
また、上記のように、関数実行環境21の構築後、当該関数が所定時間内に連続して実行される場合、既に構築済の関数実行環境21により、新たな実行環境の構築処理を行わずに、関数が実行される。当該関数が所定時間実行されない場合は、関数実行環境21のために確保されたリソースは解放され、当該関数を再度実行する際には、新たな実行環境の構築処理から行われる。このように、関数の起動を実行環境の構築処理から行うことはコールドスタートと言われることがある。それに対し、コールドスタート後、構築済の実行環境で関数を起動することはウォームスタートと言われることがある。情報処理装置10によれば、このような関数の実行手法において、コールドスタートの高速化を図れる。また、その結果、コールドスタートによる関数処理遅延を低減できる。
【0029】
[第2の実施の形態]
次に、第2の実施の形態を説明する。
図2は、第2の実施の形態の情報処理システムの例を示す図である。
【0030】
情報処理システム1は、クラウドサービスを提供する。情報処理システム1は、複数のサーバコンピュータを有する。情報処理システム1は、ネットワーク70に接続される。ネットワーク70は、LAN(Local Area Network)でもよいし、WAN(Wide Area Network)やインターネットでもよい。情報処理システム1は、ネットワーク70を介して複数のサーバコンピュータのハードウェアリソースをユーザに貸し出し、ユーザにより利用可能にする。情報処理システム1により提供されるサービスは、サーバレス関数の実行を含む。情報処理システム1は、ユーザが利用したサービスに応じてユーザに課金する。
【0031】
ここで、「サーバレス」とは、サーバを意識せずに、システムを構築・運用することである。「サーバレス」では、ファンクション(Functions)と呼ばれるトリガーを契機に、特定の条件を満たすとCPU/メモリ/ストレージなどのリソースがシステムから割り当てられ、事前に設定されたプログラムを実行し、終了後リソースを開放する。ファンクションをトリガーにプログラムが動作することから、サーバレスを採用したシステム群はFaaS(Function as a Service)と呼ばれることがある。また、サーバレス関数は、サーバレスにより実行されるプログラムであり、以下では、単に関数と称する。
【0032】
ネットワーク70には、端末装置80が接続される。端末装置80は、ユーザが操作するクライアントコンピュータである。ユーザは端末装置80を操作して、情報処理システム1のサービスを利用することができる。
【0033】
情報処理システム1が有する複数のサーバコンピュータは、中継サーバ100、実行サーバ200,…を含む。
中継サーバ100は、端末装置80から関数呼び出しを受け付けるサーバコンピュータである。中継サーバ100は、関数呼び出しに応じて、実行サーバ200に関数を実行させる。中継サーバ100は、関数の処理結果を、実行サーバ200から取得し、端末装置80に応答する。中継サーバ100は、第1の実施の形態の情報処理装置10の一例である。
【0034】
実行サーバ200は、ユーザの関数を実行するサーバコンピュータである。ユーザの関数は、実行サーバ200におけるコンテナなどの関数実行環境を用いて実行される。関数の初回実行は、コールドスタートとなる。コールドスタートは、関数の実行に用いられるパッケージのダウンロードを含む。実行サーバ200は、第1の実施の形態の実行ノード20の一例である。
【0035】
なお、中継サーバ100および実行サーバ200は、情報処理システム1における物理マシンのCPUやメモリを用いて動作する仮想マシンにより実現されてもよい。
コールドスタート後、比較的短時間に関数が連続して実行される場合、ウォームスタートとなる。ウォームスタートでは、既に構築済の関数実行環境を利用できるため、コールドスタートを行う場合よりも短時間で関数を実行できる。
【0036】
図3は、中継サーバのハードウェア例を示す図である。
中継サーバ100は、プロセッサ101、RAM102、HDD103、GPU104、入力インタフェース105、媒体リーダ106および通信インタフェース107を有する。中継サーバ100が有するこれらのユニットは、中継サーバ100の内部でバスに接続されている。プロセッサ101は、第1の実施の形態の処理部12に対応する。RAM102またはHDD103は、第1の実施の形態の記憶部11に対応する。
【0037】
プロセッサ101は、プログラムの命令を実行する演算装置である。プロセッサ101は、例えばCPUである。プロセッサ101は、HDD103に記憶されたプログラムやデータの少なくとも一部をRAM102にロードし、プログラムを実行する。なお、プロセッサ101は複数のプロセッサコアを含んでもよい。また、中継サーバ100は複数のプロセッサを有してもよい。以下で説明する処理は複数のプロセッサまたはプロセッサコアを用いて並列に実行されてもよい。また、複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うことがある。
【0038】
RAM102は、プロセッサ101が実行するプログラムやプロセッサ101が演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。なお、中継サーバ100は、RAM以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
【0039】
HDD103は、OS(Operating System)やミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。なお、中継サーバ100は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
【0040】
GPU104は、プロセッサ101からの命令に従って、中継サーバ100に接続されたディスプレイ111に画像を出力する。ディスプレイ111としては、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、プラズマディスプレイ、有機EL(OEL:Organic Electro-Luminescence)ディスプレイなど、任意の種類のディスプレイを用いることができる。
【0041】
入力インタフェース105は、中継サーバ100に接続された入力デバイス112から入力信号を取得し、プロセッサ101に出力する。入力デバイス112としては、マウス、タッチパネル、タッチパッド、トラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、中継サーバ100に、複数の種類の入力デバイスが接続されていてもよい。
【0042】
媒体リーダ106は、記録媒体113に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体113として、例えば、磁気ディスク、光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。磁気ディスクには、フレキシブルディスク(FD:Flexible Disk)やHDDが含まれる。光ディスクには、CD(Compact Disc)やDVD(Digital Versatile Disc)が含まれる。
【0043】
媒体リーダ106は、例えば、記録媒体113から読み取ったプログラムやデータを、RAM102やHDD103などの他の記録媒体にコピーする。読み取られたプログラムは、例えば、プロセッサ101によって実行される。なお、記録媒体113は可搬型記録媒体であってもよく、プログラムやデータの配布に用いられることがある。また、記録媒体113やHDD103を、コンピュータ読み取り可能な記録媒体と言うことがある。
【0044】
通信インタフェース107は、ネットワーク114に接続され、ネットワーク114を介して他の情報処理装置と通信する。ネットワーク114は、情報処理システム1の内部ネットワークである。通信インタフェース107は、スイッチやルータなどの有線通信装置に接続される有線通信インタフェースでもよいし、基地局やアクセスポイントなどの無線通信装置に接続される無線通信インタフェースでもよい。
【0045】
なお、実行サーバ200や端末装置80も、中継サーバ100と同様のハードウェアを用いて実現される。
図4は、情報処理システムの機能例を示す図である。
【0046】
中継サーバ100は、記憶部120およびプロキシ130を有する。記憶部120には、RAM102やHDD103などの記憶領域が用いられる。プロキシ130は、RAM102に記憶されたプログラムがプロセッサ101により実行されることで実現される。
【0047】
記憶部120は、プロキシ130の処理に用いられるデータを記憶する。記憶部120に記憶されるデータは、ユーザにより記述された関数のソースコードを含む。第2の実施の形態では、ソースコードの記述に用いられるプログラミング言語の一例として、Javaを挙げる。また、記憶部120に記憶されるデータは、クラスと当該クラスを含むパッケージとの対応関係を示す情報を含む。更に、記憶部120に記憶されるデータは、ユーザの関数と、当該関数で使用されるパッケージとの対応関係を示す情報を含む。
【0048】
プロキシ130は、端末装置80からの関数呼び出しを、実行サーバ200に中継する。プロキシ130は、実行サーバ200による関数の実行結果を取得し、端末装置80に送信してもよい。プロキシ130は、実行環境作成部131、最適化部132、関数実行指示部133および実行環境削除部134を有する。
【0049】
実行環境作成部131は、実行サーバ200上に関数実行環境210を作成する。関数実行環境210は、ユーザにより定義された関数の実行環境であり、前述のようにコンテナなどにより実現される。コンテナには、ユーザの関数本体の他、種々のパッケージが組み込まれる。
【0050】
最適化部132は、関数実行環境210に含まれるパッケージを最適化する。具体的には、最適化部132は、ユーザの関数の実行に用いられないパッケージを関数実行環境210から省くことで、関数実行環境210のコールドスタートの高速化を図る。
【0051】
関数実行指示部133は、端末装置80から受け付けた関数呼び出しに応じて、関数の実行を実行サーバ200に指示する。関数実行指示部133は、関数の実行結果を実行サーバ200から取得し、端末装置80に応答する。ここで、コールドスタート後に比較的短時間で連続して関数呼び出しを受け付ける場合、関数実行環境210の作成が省略されて、実行サーバ200へ関数の実行が指示される。この場合、ウォームスタートとなり、構築済みの関数実行環境210により当該関数が実行される。
【0052】
実行環境削除部134は、コールドスタート後、所定時間が経過しても該当の関数の呼び出しがない場合、当該関数の関数実行環境210を、実行サーバ200から削除する。
実行サーバ200は、関数実行環境210を有する。例えば、関数実行環境210の作成時に、実行サーバ200のプロセッサやRAMなどのリソースが、コンテナなどの関数実行環境210に割り当てられる。関数実行環境210が削除される際に、関数実行環境210に割り当てられていた、実行サーバ200のリソースが解放される。
【0053】
次に、関数実行環境210による関数の実行の流れを説明する。
図5は、関数の実行の流れの例を示す図である。
まず、プロキシ130は、端末装置80から関数呼び出しを受け付ける(ステップST1)。この段階では、実行サーバ200には、該当の関数の関数実行環境210が未作成である。そこで、プロキシ130は、実行サーバ200上に関数実行環境210を作成する(ステップST2)。前述のように、関数実行環境210は、例えばコンテナである。そして、プロキシ130は、関数実行環境210による関数実行を実行サーバ200に指示する(ステップST3)。ステップST2からステップST3までの期間は、コールドスタートが行われる期間に相当する。
【0054】
プロキシ130は、ステップST3の関数実行から所定時間が経過する前に、端末装置80から、同じ関数に対する関数呼び出しを受け付ける(ステップST4)。すると、プロキシ130は、関数実行環境210による関数実行を実行サーバ200に指示する(ステップST5)。ステップST4の関数呼び出しに対しては、作成済の関数実行環境210を利用できるため、ウォームスタートとなる。
【0055】
その後、プロキシ130は、該当の関数が実行されずに所定時間が経過したことを検出する。すると、プロキシ130は、実行サーバ200から関数実行環境210を削除する(ステップST6)。なお、ステップST4,ST6における所定時間は、例えば5分程度である。
【0056】
図6は、関数の起動時の処理例を示す図である。
タイムチャートc1は、関数の起動時に行われる処理を例示する。
図6の左側から右側へ向かう方向が時間の正方向である。例えば、クラウドサービスにおける関数の起動時には、まず、コードダウンロードが行われ、次に実行環境開始が行われる。コードダウンロードでは、所定のサーバから関数で用いられるパッケージのファイルのダウンロードが行われる。実行環境開始では、指定されたメモリ、ランタイムおよび各種設定に基づいて関数実行環境210が作成され、開始される。コードダウンロードおよび実行環境開始の期間は、コールドスタート期間(Cold start duration)と言われる。
【0057】
そして、関数実行環境210が開始されると、初期化コードの実行およびハンドラーコードの実行が、順次行われる。初期化コード実行およびハンドラーコード実行の期間は、呼び出し期間(Invocation duration)と言われる。
【0058】
コールドスタートにおける、関数の準備に要する時間は課金されない。しかし、コールドスタートは、関数の全体的な実行時間を遅延させる要因になる。
ここで、関数などで読み込まれるパッケージについて説明する。
【0059】
図7は、パッケージのインポート例を示す図である。
パッケージは、プログラムコードにおいて、複数のクラスを分類・管理するために使用される。開発者は、開発中のプロジェクト内のクラスだけでなく、Web上で公開されているパッケージなど、外部のパッケージに含まれるクラスもソースコード中で指定して使用することができる。
【0060】
図7の例では、開発者は、開発中のプロジェクトにおいて、パッケージ群P1を作成する。パッケージ群P1は、パッケージA,Bを含む。一方、開発者は、当該プロジェクトにおいて、Web上などで公開されている既存パッケージ群P2のうち、パッケージ群P2aを外部からロードして使用することができる。既存パッケージ群P2は、パッケージC,D,E,…を含む。パッケージ群P2aは、パッケージC,Eを含む。
【0061】
このように、既存の外部パッケージの利用により、開発するソースコードの記述量の低減や、開発効率の向上が図られる。Javaでは、パッケージは、「~.jar」というファイル名で公開される。
【0062】
次に、最適化部132による関数実行環境210の最適化の例を説明する。
図8は、関数実行環境の最適化の例を示す図である。
まず、最適化部132は、関数実行環境210aとして、パッケージが全て揃った環境を用意する(ステップST11)。ここでは、説明の簡単のため、DBアクセスPKG、ストレージPKG、メール送信PKGおよびセッションPKGという全4つのパッケージが揃った環境が用意されるものとする。
【0063】
次に、最適化部132は、これら全パッケージのうち、ユーザの関数で使用されないパッケージ、すなわち、必要のないパッケージを特定する(ステップST12)。例えば、最適化部132は、上記の4つのパッケージのうち、ストレージPKG、メール送信PKGおよびセッションPKGを必要のないパッケージとして特定する。
【0064】
そして、最適化部132は、用意された全パッケージのうち、必要のないパッケージを削除することで、関数実行環境210aを、関数実行環境210に最適化する(ステップST13)。例えば、最適化部132は、必要のないパッケージであるストレージPKG、メール送信PKGおよびセッションPKGを用いずに関数実行環境210を作成する。
【0065】
以下では、
図8に例示される最適化を含む、最適化部132による最適化の処理を更に具体的に説明する。まず、最適化部132による、ソースコードの静的解析による最適化を例示する。
【0066】
図9は、ソースコードに取り込まれるパッケージの特定例を示す図である。
あるパッケージに含まれるクラスを使用するソースコードを記述する場合、当該パッケージのどのクラスを使用するかを示す情報は、例えばソースコードの冒頭に記述される。そこで、最適化部132は、ユーザによる関数登録の受け付け時に、該当の記述を基に、関連するパッケージを特定することができる。
【0067】
例えば、ソースコード500は、関数「function()」の記述であり、冒頭の予約語「import」により、外部のクラスがインポートされる例を示す。具体的には、ソースコード500には「import DBアクセスPKG.データ操作.登録」が記述されている。最適化部132は、当該記述から、関連するパッケージとして、「DBアクセスPKG」を特定する。また、ソースコード500には、「import ストレージPKG.検索」が記述されている。最適化部132は、当該記述から、関連するパッケージとして、「ストレージPKG」を特定する。
【0068】
ただし、import文を用いて記述されるクラス名が、当該クラスを含むパッケージのパッケージファイル名に完全一致する名称を含まない可能性がある。そこで、最適化部132は、予めパッケージ内を解析することで、どのクラスがどのパッケージに含まれているかを示す辞書データを作成しておき、記憶部120に格納しておく。次に、当該辞書データの例を説明する。
【0069】
図10は、辞書データの例を示す図である。
辞書データ121は、最適化部132により作成され、記憶部120に格納される。辞書データ121は、クラス名または接頭辞の項目およびパッケージファイル名の項目を含む。クラス名または接頭辞の項目には、パッケージ内に存在するクラス名または接頭辞が登録される。接頭辞は、カンマ区切りで記述されるクラス名の何れかのカンマよりも左側に記述される部分であり、当該カンマよりも右側の記述がワイルドカードとなる。ワイルドカードは、アスタリスク記号「*」で表される。パッケージファイル名の項目には、クラス名または接頭辞に対応するパッケージのファイル名が登録される。
【0070】
例えば、辞書データ121は、クラス名または接頭辞「org.xxxxx.api.admin.progress.StatusMirroringImpl」、パッケージファイル名「xxxxx-api.jar」のレコードを有する。当該レコードは、クラス名「org.xxxxx.api.admin.progress.StatusMirroringImpl」のクラスが、パッケージファイル名「xxxxx-api.jar」のパッケージに含まれることを示す。
【0071】
また、辞書データ121は、クラス名または接頭辞「org.xxxxx.internal.api.*」、パッケージファイル名「internal-api.jar」のレコードを有する。当該レコードは、接頭辞「org.xxxxx.internal.api.*」で示されるクラスが、パッケージファイル名「internal-api.jar」のパッケージに含まれることを示す。
【0072】
更に、辞書データ121は、クラス名または接頭辞「org.xxxxx.*」、パッケージファイル名「xxxxx-api.jar」、「internal-api.jar」のレコードを有する。当該レコードは、接頭辞「org.xxxxx.*」で示されるクラスが、パッケージファイル名「xxxxx-api.jar」のパッケージおよびパッケージファイル名「internal-api.jar」のパッケージに含まれることを示す。
【0073】
辞書データ121には、他のクラス名または接頭辞とパッケージファイル名との対応関係を示すレコードも登録される。辞書データ121は、例えば辞書型リストのデータ構造により作成されてもよい。
【0074】
図11は、ソースコードの関数から特定できないパッケージ群の例を示す図である。
ここで、ソースコードからは、
図9で例示したように、import文などを参照することで、関数に使用されるパッケージを特定可能である。一方、当該パッケージが更に他のパッケージを使用する場合、関数のソースコードに記述されている情報だけでは当該他のパッケージを特定することはできない。
【0075】
例えば、ツリーt1は、ユーザにより定義される関数がDBアクセスPKGおよびストレージPKGという2つのパッケージを使用し、DBアクセスPKGおよびストレージPKGがそれぞれ2つの他のパッケージを使用するという関係を示す。この場合、DBアクセスPKGおよびストレージPKGにより使用されるパッケージ群は、ソースコードから特定することはできない。また、DBアクセスPKGおよびストレージPKGにより使用されるパッケージ群に含まれる各パッケージが更に他のパッケージを使用する場合も、当該他のパッケージをソースコードから特定することはできない。
【0076】
そこで、最適化部132は、あるパッケージが他のパッケージを使用するという関係性を、各パッケージを解析することで取得する。
図12は、あるパッケージで使用される他のパッケージの例を示す図である。
【0077】
ツリーt2は、パッケージPKG_AがパッケージPKG_C,PKG_Dを使用する関係性を示す。ツリーt3は、PKG_BがパッケージPKG_E,PKG_Fを使用する関係性を示す。
【0078】
最適化部132は、提供者により用意されるパッケージについて、当該パッケージ内を解析することでパッケージ間の関係性を予め取得する。最適化部132は、パッケージ間の関係性を、各パッケージに含まれるメタ情報に基づいて取得することができる。
【0079】
図13は、メタ情報に基づく他のパッケージの特定例を示す図である。
パッケージp1は、メタ情報m1を含む。メタ情報m1は、パッケージp1で参照される他のパッケージのリストを含む。例えば、Mavenプロジェクトからビルドされたファイルは、ビルド時にpom.xmlが必要になるため、パッケージファイルにもpom.xmlが含まれる。pom.xmlは、該当のパッケージにより使用される他のパッケージを示す情報が記述されている。このため、pom.xmlはメタ情報m1の一例である。
【0080】
最適化部132は、例えばパッケージ内のjarファイルを展開し、メタ情報m1を解析する。コードm1aは、メタ情報m1の一例であるpom.xmlの記述例である。コードm1aにおけるdependencyタグ内のartifactIdタグに、パッケージp1から参照される他のパッケージの情報が記述されている。
【0081】
コードm1aの例では、最適化部132は、パッケージp1から参照される他のパッケージのファイル名として、「hk2.jar」、「jakarta.xml.bind-api.jar」、「jaxb-osgi.jar」を特定する。最適化部132は、特定したパッケージ間の関係性をパッケージ対応テーブルに登録する。
【0082】
図14は、パッケージ対応テーブルの例を示す図である。
パッケージ対応テーブル122は、記憶部120に格納される。パッケージ対応テーブル122は、あるパッケージと当該パッケージにより参照される他のパッケージとの対応関係を示す情報である。パッケージ対応テーブル122は、パッケージおよび関連パッケージの項目を含む。パッケージの項目には、パッケージのファイル名が登録される。関連パッケージの項目には、パッケージの項目に登録されるパッケージから参照される他のパッケージ、すなわち、関連パッケージのファイル名が登録される。
【0083】
例えば、パッケージ対応テーブル122には、パッケージ「PKG_XXX.jar」、関連パッケージ「hk2.jar」、「jakarta.xml.bind-api.jar」、「jaxb-osgi.jar」のレコードを有する。このレコードは、ファイル名「PKG_XXX.jar」のパッケージが、ファイル名「hk2.jar」、「jakarta.xml.bind-api.jar」、「jaxb-osgi.jar」の3つのパッケージを使用する関係性を示す。
【0084】
最適化部132は、パッケージ対応テーブル122に基づいて、ユーザにより定義された関数が使用するパッケージと当該パッケージが使用する他のパッケージを特定し、関数管理テーブルに登録する。
【0085】
図15は、関数管理テーブルの例を示す図である。
関数管理テーブル123は、記憶部120に格納される。関数管理テーブル123は、ユーザの関数を管理する情報である。関数管理テーブル123は、例えばユーザ毎に作成される。関数管理テーブル123は、ユーザ関数名および関連パッケージの項目を含む。ユーザ関数名の項目には、ユーザにより定義された関数の関数名が登録される。関連パッケージの項目には、当該関数に関連する関連パッケージのファイル名が登録される。関連パッケージの項目には、当該関数から直接特定されるパッケージのファイル名の他、当該パッケージのメタ情報から連鎖的に特定される他のパッケージのファイル名も登録される。
【0086】
例えば、関数管理テーブル123には、ユーザ関数名「関数F1」、関連パッケージ「xxxxx-api.jar」、「internal-api.jar」、…のレコードを有する。当該レコードは、ユーザ関数名「関数F1」の関数が、ファイル名「xxxxx-api.jar」、「internal-api.jar」のパッケージを使用する関係性を示す。
【0087】
このように、最適化部132は、ユーザにより記述されたソースコードおよびパッケージの静的解析により関数管理テーブル123を作成可能である。実行環境作成部131は、関数管理テーブル123に基づいて関数実行環境210を作成することで、余計なパッケージの取得を省ける。
【0088】
一方、関数の実行において動的クラス参照が存在する場合や、静的解析で抽出される関連パッケージと実際の処理の関係性に乖離がある場合がある。そこで、最適化部132は、静的解析による最適化に加えて、動的解析による最適化を行う。
【0089】
図16は、静的参照および動的参照の例を示す図である。
ここで、クラス参照の仕方には静的参照および動的参照の二種類がある。
図16(A)は、静的参照(静的クラス参照)を例示する。
図16(B)は、動的参照(動的クラス参照)を例示する。
【0090】
例えば、あるプログラムの実行ファイルe1において静的参照されるクラスは、実行時に、当該クラスを含むパッケージp11から読み込まれて、必ずメモリに展開される。一方、実行ファイルe1において動的参照されるクラスは、実行時に、処理に応じて、当該クラスを含むパッケージp12から読み込まれて、メモリに展開される。
【0091】
静的参照は、コンパイル時に確定し静的解析により特定することができる。しかし、動的参照は、実行時に判断するしかないため、静的解析では検出することができない。
図17は、関連パッケージと実際の処理の関係性の乖離の例を示す図である。
【0092】
リストL1は、静的解析により特定される6個のパッケージPKG_A~Fの次の関係性を示す。パッケージAのメソッドA1はパッケージPKG_Bを参照する。パッケージAのメソッドA2はパッケージPKG_Cを参照する。また、パッケージPKG_Cから参照されるパッケージは、パッケージPKG_D,PKG_E,PKG_Fである。
【0093】
実際の処理ではパッケージPKG_Aにおいて、メソッドA1しか使われない場合を考える。この場合、メソッドA2は実行されないので、パッケージPKG_Cは不要である。それだけでなく、パッケージPKG_Cに紐づくパッケージPKG_D,PKG_E,PKG_Fも不要である。リストL2は、パッケージPKG_Aの実際の処理に対して、パッケージPKG_C~Fの4つのパッケージが不要であることを示す。
【0094】
こうした不要パッケージを除去するため、最適化部132は、次のように動的解析による最適化を行う。
図18は、スタックトレースの例を示す図である。
【0095】
最適化部132は、関数実行時に実際にどのメソッドが使われたのかを測定する。メソッドが使われることは、当該メソッドが呼びされて実行されることを示す。メソッドが使われることは、当該メソッドに対応するクラスが使われることを意味するとともに、当該クラスを含むパッケージが使われること(当該クラスを含むパッケージが用いられること)を意味する。
【0096】
例えば、JVM(Java Virtual Machine)では、標準でスタックトレース124を取得することが可能である。スタックトレース124は、ユーザの関数の実行過程で呼び出された他の関数やメソッドなど処理の履歴を示す情報である。例えば、スタックトレース124には、どのパッケージのどのクラスのどのメソッドが使われたかという情報が、処理の順番で記録される。最適化部132は、実行サーバ200からスタックトレース124を取得し、記憶部120に格納する。
【0097】
最適化部132は、スタックトレース124の記述内容から、関数の実行時に使用されたメソッドのリスト125を取得する。リスト125は、当該メソッドに対応するクラスの情報も含む。例えば、最適化部132は、スタックトレース124に基づいて、使用されたメソッド「org.xxxxx.grizzly…」、「zzz.nio.ch.SelectorImpl…」などを含むリスト125を取得する。
【0098】
図19は、使用されなかったクラスの削除例を示す図である。
最適化部132は、静的解析によりユーザの関数で使用されるクラスを抽出し、抽出したクラスの情報をリスト126に記録する。リスト126は、記憶部120に格納される。クラスの情報には、当該クラスを含むパッケージの情報が含まれる。前述の関数管理テーブル123は、リスト126に基づいて作成されてもよい。また、最適化部132は、動的解析により得られたリスト125を基に、実際に使用されたクラスを抽出し、抽出したクラスの情報をリスト127に記録する。リスト127は、記憶部120に格納される。
【0099】
最適化部132は、リスト126のクラスのうち、リスト127にないクラス、すなわち、使用されなかったクラスを、リスト126から削除することで、リスト128を作成する。そして、最適化部132は、リスト128に基づいて、パッケージを絞り込む。具体的には、最適化部132は、該当の関数について、関数管理テーブル123の関連パッケージから、リスト128に含まれないパッケージを削除する。
【0100】
ここで、パッケージの削除では、最適化部132は、パッケージの中身を置き換えることで、実際に使われるパッケージのみを残せるようにする。
図20は、パッケージの置き換えによる不要パッケージの削除例を示す図である。
【0101】
ツリーt4は、静的解析により抽出される、ユーザの関数に対するパッケージ間の関係の例を示す。例えば、関数は、パッケージPKG_A,PKG_Bを使用する。パッケージPKG_Aは、パッケージPKG_C,PKG_Dを使用する。パッケージPKG_Cは、パッケージPKG_E,PKG_Fを使用する。パッケージPKG_Dは、パッケージPKG_F,PKG_Gを使用する。パッケージPKG_Eは、パッケージPKG_H,PKG_Iを使用する。パッケージPKG_Fは、パッケージPKG_I,PKG_Jを使用する。パッケージPKG_Gは、パッケージPKG_J,PKG_Kを使用する。
【0102】
一方、動的解析により、実際の実行時には、パッケージPKG_D,PKG_F,PKG_G,PKG_J,PKG_Kが使用されないことが確認されたとする。この場合、最適化部132は、パッケージPKG_A,PKG_Cにおける、使用されないメソッドを置き換えることで、それぞれパッケージPKG_A’,PKG_C’とする。これにより、最適化部132は、パッケージPKG_D,PKG_F,PKG_G,PKG_J,PKG_Kが存在しないことによる実行時の失敗を防止する。ツリーt5は、パッケージPKG_A,PKG_CをそれぞれパッケージPKG_A’,PKG_C’に置き換えて、パッケージPKG_D,PKG_F,PKG_G,PKG_J,PKG_Kを削除する場合のパッケージ間の関係を示す。
【0103】
図21は、パッケージ内のメソッドの置き換え例を示す図である。
図20で例示したように、最適化部132は、不要なパッケージを削除する場合、残すパッケージのパッケージ間の依存関係の整合性を保つようにする。そこで、最適化部132は、クラスの中で実装されているメソッドに着目する。使われないメソッドに関しては処理が行われないため、中身が不要となる。最適化部132は、使われていないメソッドの処理内容を空にすることで使われていないクラスの参照をなくせる。すると、当該クラスの呼び出しがなくなり、整合性を保ったまま余計な部分を省けるようになる。
【0104】
コード501は、あるパッケージにおけるクラス「A」のメソッド「function_A」および「function_B」の記述例を示す。このうち、メソッド「function_B」は他クラスへのリンクを有する、実際には使われないメソッドである。このため、最適化部132は、コード501のメソッド「function_B」を空にすることでコード502を作成する。コード502は、コード501の代わりに用いられる。こうして、コード502では当該他クラスへのリンクを示す参照コードが除去され、当該他クラスを含むパッケージの削除が可能になる。
【0105】
例えば、最適化部132は、動的解析により一定期間の情報を蓄積し、当該一定期間使われなかった処理を削除することで最適化を行う。
なお、仮に、当該処理が最適化後に使われた場合、パッケージの参照に失敗し、関数の実行に失敗する。この場合、実行環境作成部131は、該当のパッケージを初期化して関数実行環境210を作り直す。そして、最適化部132は、動的解析による情報蓄積を再度行う。ただし、実際のサービス運用時は、運用前にテストを行ったり、一つの関数に対して一つの役割しか持たせないようにしたりするため、最適化により削除された処理が使用される可能性は非常に小さい。
【0106】
次に、中継サーバ100による処理手順を説明する。
図22は、サービス構築の例を示すフローチャートである。
サービス構築の処理は、ユーザによる関数登録を受け付ける前に、最適化部132により予め実行される。
【0107】
(S10)最適化部132は、ユーザが使い得るパッケージを取得する。
(S11)最適化部132は、取得した各パッケージを展開し、解析することで、クラスまたは接頭辞に対応するパッケージや、各パッケージにより使用される他のパッケージを特定する。最適化部132は、クラスまたは接頭辞に対応するパッケージを辞書データ121に登録する。また、最適化部132は、パッケージ間の依存関係を、パッケージ対応テーブル122に登録する。そして、サービス構築が終了する。
【0108】
図23は、関数実行制御の例を示すフローチャートである。
(S20)プロキシ130は、関数登録を行う。関数登録は、ユーザにより入力される関数の登録を行う処理である。関数登録では、ユーザの関数に対して使用されるクラスのリスト126および関数管理テーブル123のレコードが作成される。関数登録の詳細は後述される。
【0109】
(S21)プロキシ130は、下記のステップS22の関数処理(1)に対して、一定期間の間、動的解析の結果を繰り返し取得する。
(S22)プロキシ130は、関数処理(1)を行う。関数処理(1)により、リスト126および関数管理テーブル123を基に関数実行環境210が構築される。そして、関数実行環境210を用いてユーザの関数が実行される。関数処理(1)の詳細は後述される。
【0110】
(S23)プロキシ130は、一定期間が経過すると、動的解析の結果の繰り返し取得を終了する。なお、ステップS21,S23における動的解析の結果の取得は、最適化部132により行われる。
【0111】
(S24)プロキシ130は、動的解析の結果として得られたスタックトレースに基づいて、解析結果更新を行う。解析結果更新では、動的解析の結果を基に、リスト126がリスト128に更新され、関数管理テーブル123が更新される。解析結果更新の詳細は後述される。
【0112】
(S25)プロキシ130は、関数処理(2)を行う。関数処理(2)により、リスト128および更新後の関数管理テーブル123を基に関数実行環境210が再構築される。そして、再構築された関数実行環境210を用いてユーザの関数が実行される。関数処理(2)の詳細は後述される。
【0113】
(S26)プロキシ130は、ステップS25におけるユーザの関数の処理が正常に終了したか否かを判定する。正常に終了した場合、関数実行制御が終了し、以後、ステップS25で再構築された関数実行環境210が使用される。正常に終了しなかった場合、ステップS21に処理が進む。ステップS21に処理が進む場合、プロキシ130は、ステップS25の再構築前のパッケージを用いて関数実行環境210を再度構築し直すことになる。なお、ステップS26の判定は最適化部132により行われる。
【0114】
図24は、関数登録の例を示すフローチャートである。
関数登録は、ステップS20に相当する。
(S30)最適化部132は、ユーザによる関数のロジックの実装を受け付ける。
【0115】
(S31)最適化部132は、ステップS30で実装されたコードに対する静的解析を行うことで、辞書データ121およびパッケージ対応テーブル122に基づき、当該コードから参照されるパッケージを解析し、リスト126を作成する。
【0116】
(S32)最適化部132は、ステップS31の解析の結果から、ユーザの関数の環境起動およびビルドに用いるパッケージを、関数管理テーブル123に登録する。そして、関数登録が終了する。
【0117】
図25は、関数処理(1)の例を示すフローチャートである。
関数処理(1)は、ステップS22に相当する。
(S40)関数実行指示部133は、ユーザの関数呼び出しを端末装置80から受け付けると、呼び出し対象の関数を実行するための関数実行環境210が存在するか否かを判定する。関数実行環境210が存在しない場合、ステップS41に処理が進む。関数実行環境210が存在する場合、ステップS42に処理が進む。ステップS41に処理が進む場合、コールドスタートとなる。ステップS42に処理が進む場合、ウォームスタートとなる。
【0118】
(S41)実行環境作成部131は、静的解析で抽出したクラスのリスト126を基に、関数実行環境210を作成する。ここでは、コールドスタートとなるため、実行環境作成部131は、関数管理テーブル123に基づいて、関数実行環境210の作成に用いるパッケージのファイルを所定のサーバからダウンロードする。
【0119】
(S42)関数実行指示部133は、実装されたコードによる処理の実行を関数実行環境210に指示し、当該処理を実行させる。
(S43)関数実行指示部133は、ステップS42の関数の実行結果を関数実行環境210から取得し、呼び出し元の端末装置80に応答する。
【0120】
(S44)最適化部132は、関数実行環境210での関数実行に応じて作成されたスタックトレースを実行サーバ200から取得し、当該スタックトレースから実際に使われたメソッドを解析する。
【0121】
(S45)最適化部132は、ステップS44で特定された、実際に使われたメソッドの情報をリスト125に記録することで、解析された情報を蓄積する。そして、関数処理(1)が終了する。
【0122】
図26は、解析結果更新の例を示すフローチャートである。
解析結果更新は、ステップS24に相当する。
(S50)最適化部132は、蓄積されたデータ、すなわち、リスト125から該当の関数で実際に使用されたクラスを抽出し、リスト127を作成する。
【0123】
(S51)最適化部132は、抽出されたクラスに対応するパッケージを抽出する。例えば、最適化部132は、リスト127に記録されるクラス名、および、辞書データ121に基づいて、当該パッケージの情報を抽出することができる。
【0124】
(S52)最適化部132は、抽出されたパッケージを残すように環境情報を更新する。例えば、最適化部132は、リスト127に基づき、リスト126から使用されないクラスの情報を削除することで、リスト126をリスト128に更新する。また、最適化部132は、リスト128に残っていないパッケージを関数管理テーブル123における該当の関数の関連パッケージから削除する。そして、解析結果更新が終了する。
【0125】
図27は、関数処理(2)の例を示すフローチャートである。
関数処理(2)は、ステップS25に相当する。
(S60)関数実行指示部133は、ユーザの関数呼び出しを端末装置80から受け付けると、呼び出し対象の関数を実行するための関数実行環境210が存在するか否かを判定する。関数実行環境210が存在しない場合、ステップS61に処理が進む。関数実行環境210が存在する場合、ステップS62に処理が進む。ステップS61に処理が進む場合、コールドスタートとなる。ステップS62に処理が進む場合、ウォームスタートとなる。
【0126】
(S61)実行環境作成部131は、動的解析で更新したクラスのリスト128を基に、関数実行環境210を作成する。ステップS61では、コールドスタートとなるため、実行環境作成部131は、動的解析による更新後の関数管理テーブル123に基づいて、関数実行環境210の作成に用いるパッケージのファイルを所定のサーバからダウンロードする。この場合、最適化部132は、
図20で例示したように、パッケージ間の関係性の整合を保つため、パッケージ内のメソッドの置き換えを行う。
【0127】
(S62)関数実行指示部133は、実装されたコードによる処理の実行を関数実行環境210に指示し、当該処理を実行させる。
(S63)関数実行指示部133は、ステップS62の関数の実行結果を関数実行環境210から取得し、呼び出し元の端末装置80に応答する。そして、関数処理(2)が終了する。
【0128】
ステップS61では、動的解析により関連パッケージが更に絞り込まれる。このため、ステップS41よりも関数実行環境210の作成にかかる時間が短縮される。
また、関数処理(2)では、ステップS60の判定を行わずに、実行環境作成部131がステップS61を実行することで、動的解析の結果を基に関数実行環境210が必ず再構築されるようにしてもよい。
【0129】
更に、ステップS26 YESの後、プロキシ130は、ステップS25で更新された関数実行環境210による通常の運用を行う。
以上説明したように中継サーバ100は、関数のソースコードから特定した第1のパッケージに含まれるメタ情報を基に、当該第1のパッケージから参照される第2のパッケージを特定することで、提供されるパッケージ群から第2のパッケージのみを抽出できる。このため、中継サーバ100は、関数実行環境210の構築の際に取得対象のパッケージを絞り込み、余計なパッケージの取得を省ける。これにより、関数実行環境210の構築に要する時間が短縮され、関数実行環境210の起動(コールドスタート)が高速化される。その結果、関数処理遅延が低減される。
【0130】
また、中継サーバ100は、動的解析により、関数実行時に実際に使用されるパッケージを残し、使用されないパッケージを削除することで、関数の実行に必要なパッケージを更に絞り込むことができる。これにより、関数実行環境210の構築に要する時間が更に短縮され、関数実行環境210の起動が更に高速化される。その結果、関数処理遅延が更に低減される。
【0131】
ここで、コールドスタートの際の関数実行環境210の起動の遅延に対し、比較例として、関数内で利用できるパッケージを予め制限して利用できるパッケージの数を減らすという方法も考えられる。しかし、比較例の方法では、既存アプリケーションで実装されている関数をそのままサーバレスで利用できず、サーバレスで利用可能なパッケージの範囲に関数の実装を変更することになる。例えば、比較例の方法では、制限対象のパッケージにメール送信用のパッケージが含まれる場合、メール送信の機能をもつ関数を利用できなくなってしまう。
【0132】
一方、中継サーバ100によれば、関数内でユーザが利用できるパッケージを制限するのではなく、ユーザが実装した関数ごとに必要なパッケージを割り出して最適化を行う。このため、中継サーバ100は、比較例の方法に比べて、ユーザにより利用可能なパッケージを制限せずに済む。
【0133】
また、中継サーバ100は、静的解析および動的解析を組合せて関数実行環境210の最適化を行う。これにより、中継サーバ100は、効率的に最適化を行える。例えば、動的解析は運用中に行われるものであり、動的解析だけでは運用の最初期において必要なパッケージを特定できないが、静的解析を用いることで、使用されるパッケージをある程度絞れる。また、仮に、提供される全てのパッケージを関数実行環境210に取り入れた場合、関数実行環境210のリソースの消費が大きくなり現実的な運用が困難になり得る。そこで、中継サーバ100は、静的解析および動的解析を用いることで、関数実行環境210に取り入れるパッケージの数が過大にならないように、関数実行環境210に取り込むパッケージを段階的に絞り込むことができる。
【0134】
以上説明したように、中継サーバ100は次の処理を実行する。
プロセッサ101は、ソースコードに記述された関数の実行に用いられる第1のパッケージをソースコードに基づいて特定する。プロセッサ101は、第1のパッケージに含まれるメタ情報であって、第1のパッケージにより参照される第2のパッケージを示すメタ情報に基づいて第2のパッケージを特定する。プロセッサ101は、ソースコードと第1のパッケージと第2のパッケージとを用いて関数の実行環境を構築する。
【0135】
これにより、中継サーバ100は、関数の実行環境の構築に用いるパッケージを絞り込むことができ、関数の実行環境の起動を高速化できる。
なお、例えばソースコードの冒頭のimport文などから特定されるパッケージは、第1のパッケージの一例である。また、前述のpom.xmlはメタ情報の一例である。更に、関数実行環境210は「関数の実行環境」に相当する。
【0136】
また、プロセッサ101は、第1のパッケージおよび第2のパッケージを含む複数のパッケージそれぞれのメタ情報に基づいて、当該パッケージと当該パッケージにより参照される他のパッケージとの対応関係を示すパッケージ対応テーブル122を予め作成しておいてもよい。プロセッサ101は、ユーザによる関数の登録を受け付けた場合に、当該対応関係を示す情報に基づいて、当該関数に用いられるパッケージの情報を関数管理テーブル123に登録する。すると、プロセッサ101は、当該関数の呼び出しを受け付けた際などに、関数管理テーブル123に基づいて、当該関数に用いられるパッケージを取得し、当該関数の実行環境を構築することができる。これにより、中継サーバ100は、関数の実行環境の起動を高速化できる。
【0137】
プロセッサ101は、実行環境による関数の実行時のスタックトレースに基づいて、第2のパッケージが当該関数の実行に用いられたか否かを判定してもよい。プロセッサ101は、第2のパッケージが当該関数の実行に用いられなかった場合、第2のパッケージを用いずに実行環境を再構築してもよい。
【0138】
これにより、中継サーバ100は、関数の実行環境の構築に用いるパッケージを更に絞り込むことができ、関数の実行環境の起動を一層高速化できる。
プロセッサ101は、
図21で例示したように、当該再構築の際に、第1のパッケージに含まれるコードの中から、第2のパッケージに属するプログラム部品を参照する参照コードを削除する。
【0139】
これにより、中継サーバ100は、第2のパッケージに属するプログラム部品が存在しないことによる関数の実行失敗を防げる。例えば、jarファイルで公開されるパッケージのクラスは、プログラム部品の一例である。
【0140】
なお、プロセッサ101は、スタックトレースに基づいて第1のパッケージが関数の実行に用いられたか否かを判定してもよい。そして、プロセッサ101は、第1のパッケージが関数の実行に用いられなかった場合に、第1のパッケージを用いずに実行環境を再構築してもよい。
【0141】
プロセッサ101は、第2のパッケージを含む複数のパッケージそれぞれに含まれる他のメタ情報であって、当該パッケージにより参照される他のパッケージを示す他のメタ情報に基づき、第1のパッケージを起点に第2のパッケージを介して参照される第3のパッケージを特定してもよい。そして、プロセッサ101は、第3のパッケージを更に用いて関数の実行環境を構築してもよい。
【0142】
これにより、中継サーバ100は、関数の実行環境の構築に用いるパッケージを絞り込むことができ、関数の実行環境の起動を高速化できる。
プロセッサ101は、実行環境による関数の実行時のスタックトレースに基づいて、第3のパッケージが関数の実行に用いられたか否かを判定してもよい。プロセッサ101は、第3のパッケージが当該関数の実行に用いられなかった場合、第3のパッケージを用いずに実行環境を再構築してもよい。
【0143】
これにより、中継サーバ100は、関数の実行環境の構築に用いるパッケージを更に絞り込むことができ、関数の実行環境の起動を一層高速化できる。
プロセッサ101は、
図21で例示したように、当該再構築の際に、第3のパッケージの参照元である第2のパッケージまたは第4のパッケージに含まれるコードの中から、第3のパッケージに属するプログラム部品を参照する参照コードを削除する。
【0144】
これにより、中継サーバ100は、第3のパッケージに属するプログラム部品が存在しないことによる関数の実行失敗を防げる。
例えば、プロセッサ101は、関数の登録を受け付けると当該関数に対応する第1のパッケージおよび第2のパッケージを特定する。そして、プロセッサ101は、関数の呼び出しを受け付けると当該関数の実行環境を構築する。プロセッサ101は、関数の呼び出しを所定時間よりも短い時間間隔で受け付けるたびに、当該実行環境による関数の実行を指示する。関数の実行の指示は、例えば実行環境を動作させるノード(例えば、実行サーバ200)に対して行われてもよい。そして、プロセッサ101は、関数の呼び出しを受け付けない時間が所定時間に達すると、当該実行環境を削除する。
【0145】
このように、プロセッサ101は、ユーザによる関数の登録を受け付けたタイミングで、当該関数に対応する第1のパッケージおよび第2のパッケージの特定を予め行うようにする。すると、プロセッサ101は、当該関数の呼び出し時に、当該特定を行わなくてよく、特定済の第1のパッケージおよび第2のパッケージを取得して、当該関数の実行環境の構築を行える。こうして、中継サーバ100は、コールドスタートおよびウォームスタートを用いて実行されるサーバレス関数などの関数において、コールドスタートによる実行環境の起動時間を短縮することができる。また、その結果、コールドスタート時の関数処理遅延が低減される。
【0146】
更に、プロセッサ101により構築される実行環境は、中継サーバ100に相当するコンピュータ、または、実行サーバ200に相当する他のコンピュータの、プロセッサやメモリなどのリソースを用いて動作するコンテナでもよい。すなわち、関数の実行環境を構築する処理、あるいは、関数の実行環境を作成する処理は、当該関数を実行するコンテナを作成する処理でもよい。例えば、サーバレス関数の実行サービスを提供する情報処理システム1において、コールドスタートによるコンテナの起動は頻繁に行われ得る。このため、中継サーバ100による実行環境、すなわち、コンテナの起動時間の短縮は、当該コンテナを用いて提供されるサーバレス関数の実行サービスの運用に特に有用である。
【0147】
なお、第1の実施の形態の情報処理は、処理部12にプログラムを実行させることで実現できる。また、第2の実施の形態の情報処理は、プロセッサ101にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体113に記録できる。
【0148】
例えば、プログラムを記録した記録媒体113を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体113に記録されたプログラムまたは他のコンピュータから受信したプログラムを、RAM102やHDD103などの記憶装置に格納し(インストールし)、当該記憶装置からプログラムを読み込んで実行してもよい。
【符号の説明】
【0149】
10 情報処理装置
11 記憶部
12 処理部
20 実行ノード
21 関数実行環境
30 ソースコード
40,50,61,62,63,64,65 パッケージ
40a,50a メタ情報
60 パッケージ群