(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2023052064
(43)【公開日】2023-04-11
(54)【発明の名称】ヒープをため込んでいるスタックトレースを特定するための、スレッド強度とヒープ使用量との相関
(51)【国際特許分類】
G06F 11/34 20060101AFI20230404BHJP
G06F 11/30 20060101ALI20230404BHJP
【FI】
G06F11/34 171
G06F11/30 140N
【審査請求】有
【請求項の数】16
【出願形態】OL
【外国語出願】
(21)【出願番号】P 2022207000
(22)【出願日】2022-12-23
(62)【分割の表示】P 2021158071の分割
【原出願日】2017-05-08
(31)【優先権主張番号】62/333,786
(32)【優先日】2016-05-09
(33)【優先権主張国・地域又は機関】US
(31)【優先権主張番号】62/333,798
(32)【優先日】2016-05-09
(33)【優先権主張国・地域又は機関】US
(31)【優先権主張番号】62/333,804
(32)【優先日】2016-05-09
(33)【優先権主張国・地域又は機関】US
(31)【優先権主張番号】62/333,809
(32)【優先日】2016-05-09
(33)【優先権主張国・地域又は機関】US
(31)【優先権主張番号】62/333,811
(32)【優先日】2016-05-09
(33)【優先権主張国・地域又は機関】US
(31)【優先権主張番号】62/340,256
(32)【優先日】2016-05-23
(33)【優先権主張国・地域又は機関】US
(31)【優先権主張番号】15/588,521
(32)【優先日】2017-05-05
(33)【優先権主張国・地域又は機関】US
(31)【優先権主張番号】15/588,523
(32)【優先日】2017-05-05
(33)【優先権主張国・地域又は機関】US
(31)【優先権主張番号】15/588,526
(32)【優先日】2017-05-05
(33)【優先権主張国・地域又は機関】US
(31)【優先権主張番号】15/588,531
(32)【優先日】2017-05-05
(33)【優先権主張国・地域又は機関】US
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.WINDOWS PHONE
2.iOS
(71)【出願人】
【識別番号】502303739
【氏名又は名称】オラクル・インターナショナル・コーポレイション
(74)【代理人】
【識別番号】110001195
【氏名又は名称】弁理士法人深見特許事務所
(72)【発明者】
【氏名】チャン,エリック・エス
(57)【要約】 (修正有)
【課題】メモリ効率を最適化するためにヒープをため込んでいるスタックトレースを特定するための方法及びシステムを提供する。
【解決手段】高いヒープ使用量に対応するコードの特定方法であって、プロセスによるヒープ使用量が閾値を上回っている時間の長さを判断し、この時間の長さの間のプロセスのヒープ情報を決定する。ヒープ情報は、この時間の長さにおける各間隔のヒープ使用量情報を含む。次に、この時間の長さの間の1つ以上のプロセスのスレッド情報を決定する。スレッド情報を決定することは、スレッドのクラスを決定することを含み、スレッド情報は、スレッドのクラスの各々について、間隔の各々のスレッド強度情報を含む。次に、ヒープ情報をスレッド情報に相関させて、閾値を上回るヒープ使用量に対応するコードを特定する。次に、このコードに関連するアクションを開始する。
【選択図】
図9
【特許請求の範囲】
【請求項1】
コンピュータにより実現される方法であって、
1つ以上のコンピュータシステムによって、1つ以上のプロセスによるヒープ使用量が閾値を上回っている時間の長さを判断するステップと、
前記時間の長さの間の前記1つ以上のプロセスのヒープ情報を決定するステップと含み、前記ヒープ情報は、前記時間の長さにおける複数の間隔の各々のヒープ使用量情報を含み、前記方法は、さらに、
前記時間の長さの間の前記1つ以上のプロセスのスレッド情報を決定するステップを含み、前記スレッド情報を決定するステップは、1つ以上のスレッドのクラスを決定するステップを含み、前記スレッド情報は、前記1つ以上のスレッドのクラスの各々について、前記複数の間隔の各々のスレッド強度情報を含み、前記方法は、さらに、
前記ヒープ情報を前記スレッド情報に相関させて、前記閾値を上回るヒープ使用量に対応する前記1つ以上のプロセスの1行以上のコードを特定するステップと、
前記1行以上のコードを特定することに応答して、前記1行以上のコードに関連する1つ以上のアクションを開始するステップとを含む、方法。
【請求項2】
前記ヒープ情報は、前記複数の間隔の各々のヒープ使用量季節因子を含み、
前記スレッド情報は、前記1つ以上のスレッドのクラスの各々について、前記複数の間隔の各々のスレッド強度季節因子を含む、請求項1に記載の方法。
【請求項3】
前記ヒープ情報を前記スレッド情報に相関させるステップは、
前記1つ以上のスレッドのクラスの各々について、前記複数の間隔のヒープ使用量季節因子と、スレッドのクラスおよび前記複数の間隔のスレッド強度季節因子とに基づいて、前記スレッドのクラスと前記閾値を上回るヒープ使用量との相関度合いを決定するステップと、
前記1つ以上のスレッドのクラスから、前記閾値を上回るヒープ使用量に対する相関度合いが前記1つ以上のスレッドのクラスの中で最も高い所与のスレッドのクラスを選択するステップと、
前記所与のスレッドのクラスに基づいて、前記1行以上のコードを特定するステップとを含む、請求項2に記載の方法。
【請求項4】
前記スレッドのクラスと前記閾値を上回るヒープ使用量との前記相関度合いを決定するステップは、
前記複数の間隔のヒープ使用量季節因子の平均を算出するステップと、
前記スレッドのクラスおよび前記複数の間隔のスレッド強度季節因子の平均を算出するステップと、
前記複数の間隔のヒープ使用量季節因子の分散を算出するステップと、
前記スレッドのクラスおよび前記複数の間隔のスレッド強度季節因子の分散を算出するステップと、
前記複数の間隔のヒープ使用量季節因子の平均、前記スレッドのクラスおよび前記複数の間隔のスレッド強度季節因子の平均、前記複数の間隔のヒープ使用量季節因子の分散、ならびに前記スレッドのクラスおよび前記複数の間隔のスレッド強度季節因子の分散に基づいて、前記相関度合いを算出するステップとを含む、請求項3に記載の方法。
【請求項5】
前記所与のスレッドのクラスに属する前記1つ以上のプロセスの各スレッドが、前記1行以上のコードを実行する、請求項3に記載の方法。
【請求項6】
前記時間の長さは、第1長さを有する期間の1つ以上のサイクルおよび第2長さを有する期間の1つ以上のサイクルにまたがるデータセット内に位置し、
前記第1長さを有する期間は、前記1つ以上のスレッドのクラスの各々の第1種別の平滑化後のヒープ使用量季節因子および第1種別の平滑化後のスレッド強度季節因子に各々が関連する第1の複数の季節に分割され、
前記第2長さを有する期間は、前記1つ以上のスレッドのクラスの各々の第2種別の平滑化後のヒープ使用量季節因子および第2種別の平滑化後のスレッド強度季節因子に各々が関連する第2の複数の季節に分割され、
前記複数の間隔の各々は、前記第1の複数の季節のうちの1つまたは前記第2の複数の季節のうちの1つに対応付けられ、
前記複数の間隔の各々について、間隔の前記ヒープ使用量季節因子は、前記間隔が対応付けられた前記第1の複数の季節のうちの1つまたは前記第2の複数の季節のうちの1つに関連する平滑化後のヒープ使用量季節因子に対応し、
前記複数の間隔の各々、前記1つ以上のスレッドのクラスの各々について、間隔の前記スレッドのクラスの前記スレッド強度季節因子は、前記間隔が対応付けられた前記第1の複数の季節のうちの1つまたは前記第2の複数の季節のうちの1つに関連する前記スレッドのクラスの平滑化後のスレッド強度季節因子に対応する、請求項2に記載の方法。
【請求項7】
前記第1種別の平滑化後のヒープ使用量季節因子は、
前記第1の複数の季節の各々について、前記第1の複数の季節のうちの季節の平均ヒープ使用量を、前記第1長さを有する期間の平均ヒープ使用量と比較することによって、前記第1種別のヒープ使用量季節因子を決定し、
前記第1種別のヒープ使用量季節因子の各々について、第1種別のヒープ使用量季節因子を正規化因子で除算して前記第1種別のくりこまれたヒープ使用量季節因子を取得し、
前記第1種別のくりこまれたヒープ使用量季節因子に第1スプライン関数を適用して前記第1種別の平滑化後のヒープ使用量季節因子を取得することによって、決定され、
前記第2種別の平滑化後のヒープ使用量季節因子は、
前記第2の複数の季節の各々について、前記第2の複数の季節のうちの季節の平均ヒープ使用量を、前記第2長さを有する期間の平均ヒープ使用量と比較することによって、前記第2種別のヒープ使用量季節因子を決定し、
前記第2種別のヒープ使用量季節因子の各々について、第2種別のヒープ使用量季節因子を正規化因子で除算して前記第2種別のくりこまれたヒープ使用量季節因子を取得し、
前記第2種別のくりこまれたヒープ使用量季節因子に第2スプライン関数を適用して前記第2種別の平滑化後のヒープ使用量季節因子を取得することによって、決定される、請求項6に記載の方法。
【請求項8】
前記1つ以上のスレッドのクラスを決定するステップは、
前記1つ以上のプロセスの1つ以上のスレッドダンプを取得するステップを含み、前記スレッドダンプの各々は、前記1つ以上のプロセスが実行中に異なる時点で出力され、前記1つ以上のスレッドのクラスを決定するステップは、さらに、
前記1つ以上のスレッドダンプの1つ以上のスレッドの各々について、スレッドに対応するスタックトレースに基づいて前記スレッドを分類するステップとを含み、前記スタックトレースは、前記スレッドダンプが出力されたときに前記スレッドが実行するコードを示す、請求項2に記載の方法。
【請求項9】
前記スタックトレースに基づいて前記スレッドを分類するステップは、
前記スタックトレースに含まれるスタックフレームの組合せに対応するスレッドのクラスが存在するかどうかを判断するステップと、
前記スタックトレースに含まれるスタックフレームの組合せに対応するスレッドのクラスが存在しないと判断することに応答して、前記スタックトレースに含まれるスタックフ
レームの組合せに対応する新しいスレッドのクラスを作成するステップと、
前記スタックトレースに含まれるスタックフレームの組合せに対応するスレッドのクラスに関連する1つ以上のカウンタをインクリメントするステップとを含む、請求項8に記載の方法。
【請求項10】
前記1つ以上のスレッドのクラスの各々、前記複数の間隔の各々について、間隔の前記スレッド強度情報は、前記間隔を通じて実行中のスレッドのクラスに属するスレッドの平均数を示す、請求項1に記載の方法。
【請求項11】
前記1つ以上のアクションは、
前記1行以上のコードに関連するアラートを生成するステップ、または、
前記1行以上のコードを最適化するステップ、の少なくとも一方を含む、請求項1に記載の方法。
【請求項12】
前記1行以上のコードを最適化するステップは、使用されるヒープメモリの量を低減するまたは前記ヒープメモリの使用期間を減らすために前記1行以上のコードを修正するステップを含む、請求項11に記載の方法。
【請求項13】
1つ以上のプロセッサと、
前記1つ以上のプロセッサにアクセス可能なメモリとを備え、前記メモリは、1つ以上の命令を格納し、前記1つ以上の命令は、前記1つ以上のプロセッサによって実行されると、前記1つ以上のプロセッサに、
1つ以上のプロセスによるヒープ使用量が閾値を上回っている時間の長さを判断させ、
前記時間の長さの間の前記1つ以上のプロセスのヒープ情報を決定させ、前記ヒープ情報は、前記時間の長さにおける複数の間隔の各々のヒープ使用量情報を含み、前記1つ以上の命令は、前記1つ以上のプロセッサによって実行されると、前記1つ以上のプロセッサに、さらに、
前記時間の長さの間の前記1つ以上のプロセスのスレッド情報を決定させ、前記スレッド情報を決定することは、1つ以上のスレッドのクラスを決定することを含み、前記スレッド情報は、前記1つ以上のスレッドのクラスの各々について、前記複数の間隔の各々のスレッド強度情報を含み、前記1つ以上の命令は、前記1つ以上のプロセッサによって実行されると、前記1つ以上のプロセッサに、さらに、
前記ヒープ情報を前記スレッド情報に相関させて、前記閾値を上回るヒープ使用量に対応する前記1つ以上のプロセスの1行以上のコードを特定させ、
前記1行以上のコードを特定することに応答して、前記1行以上のコードに関連する1つ以上のアクションを開始させる、システム。
【請求項14】
前記ヒープ情報は、前記複数の間隔の各々のヒープ使用量季節因子を含み、
前記スレッド情報は、前記1つ以上のスレッドのクラスの各々について、前記複数の間隔の各々のスレッド強度季節因子を含む、請求項13に記載のシステム。
【請求項15】
前記ヒープ情報を前記スレッド情報に相関させることは、
前記1つ以上のスレッドのクラスの各々について、前記複数の間隔のヒープ使用量季節因子と、スレッドのクラスおよび前記複数の間隔のスレッド強度季節因子とに基づいて、前記スレッドのクラスと前記閾値を上回るヒープ使用量との相関度合いを決定することと、
前記1つ以上のスレッドのクラスから、前記閾値を上回るヒープ使用量に対する相関度合いが前記1つ以上のスレッドのクラスの中で最も高い所与のスレッドのクラスを選択することと、
前記所与のスレッドのクラスに基づいて、前記1行以上のコードを特定することとを含む、請求項14に記載のシステム。
【請求項16】
前記スレッドのクラスと前記閾値を上回るヒープ使用量との前記相関度合いを決定することは、
前記複数の間隔のヒープ使用量季節因子の平均を算出することと、
前記スレッドのクラスおよび前記複数の間隔のスレッド強度季節因子の平均を算出することと、
前記複数の間隔のヒープ使用量季節因子の分散を算出することと、
前記スレッドのクラスおよび前記複数の間隔のスレッド強度季節因子の分散を算出することと、
前記複数の間隔のヒープ使用量季節因子の平均、前記スレッドのクラスおよび前記複数の間隔のスレッド強度季節因子の平均、前記複数の間隔のヒープ使用量季節因子の分散、ならびに前記スレッドのクラスおよび前記複数の間隔のスレッド強度季節因子の分散に基づいて、前記相関度合いを算出することとを含む、請求項15に記載のシステム。
【請求項17】
前記時間の長さは、第1長さを有する期間の1つ以上のサイクルおよび第2長さを有する期間の1つ以上のサイクルにまたがるデータセット内に位置し、
前記第1長さを有する期間は、前記1つ以上のスレッドのクラスの各々の第1種別の平滑化後のヒープ使用量季節因子および第1種別の平滑化後のスレッド強度季節因子に各々が関連する第1の複数の季節に分割され、
前記第2長さを有する期間は、前記1つ以上のスレッドのクラスの各々の第2種別の平滑化後のヒープ使用量季節因子および第2種別の平滑化後のスレッド強度季節因子に各々が関連する第2の複数の季節に分割され、
前記複数の間隔の各々は、前記第1の複数の季節のうちの1つまたは前記第2の複数の季節のうちの1つに対応付けられ、
前記複数の間隔の各々について、間隔の前記ヒープ使用量季節因子は、前記間隔が対応付けられた前記第1の複数の季節のうちの1つまたは前記第2の複数の季節のうちの1つに関連する平滑化後のヒープ使用量季節因子に対応し、
前記複数の間隔の各々、前記1つ以上のスレッドのクラスの各々について、間隔の前記スレッドのクラスの前記スレッド強度季節因子は、前記間隔が対応付けられた前記第1の複数の季節のうちの1つまたは前記第2の複数の季節のうちの1つに関連する前記スレッドのクラスの平滑化後のスレッド強度季節因子に対応する、請求項14に記載のシステム。
【請求項18】
前記第1種別の平滑化後のヒープ使用量季節因子は、
前記第1の複数の季節の各々について、前記第1の複数の季節のうちの季節の平均ヒープ使用量を、前記第1長さを有する期間の平均ヒープ使用量と比較することによって、前記第1種別のヒープ使用量季節因子を決定し、
前記第1種別のヒープ使用量季節因子の各々について、第1種別のヒープ使用量季節因子を正規化因子で除算して前記第1種別のくりこまれたヒープ使用量季節因子を取得し、
前記第1種別のくりこまれたヒープ使用量季節因子に第1スプライン関数を適用して前記第1種別の平滑化後のヒープ使用量季節因子を取得することによって、決定され、
前記第2種別の平滑化後のヒープ使用量季節因子は、
前記第2の複数の季節の各々について、前記第2の複数の季節のうちの季節の平均ヒープ使用量を、前記第2長さを有する期間の平均ヒープ使用量と比較することによって、前記第2種別のヒープ使用量季節因子を決定し、
前記第2種別のヒープ使用量季節因子の各々について、第2種別のヒープ使用量季節因子を正規化因子で除算して前記第2種別のくりこまれたヒープ使用量季節因子を取得し
、
前記第2種別のくりこまれたヒープ使用量季節因子に第2スプライン関数を適用して前記第2種別の平滑化後のヒープ使用量季節因子を取得することによって、決定される、請求項17に記載のシステム。
【請求項19】
前記1つ以上のアクションは、
前記1行以上のコードに関連するアラートを生成すること、または、
前記1行以上のコードを最適化すること、の少なくとも一方を含む、請求項13に記載のシステム。
【請求項20】
1つ以上の命令を格納する非一時的なコンピュータ読み取り可能な媒体であって、前記1つ以上の命令は、1つ以上のプロセッサによって実行されると、前記1つ以上のプロセッサに、
1つ以上のプロセスによるヒープ使用量が閾値を上回っている時間の長さを判断させ、
前記時間の長さの間の前記1つ以上のプロセスのヒープ情報を決定させ、前記ヒープ情報は、前記時間の長さにおける複数の間隔の各々のヒープ使用量情報を含み、前記1つ以上の命令は、前記1つ以上のプロセッサによって実行されると、前記1つ以上のプロセッサに、さらに、
前記時間の長さの間の前記1つ以上のプロセスのスレッド情報を決定させ、前記スレッド情報を決定することは、1つ以上のスレッドのクラスを決定することを含み、前記スレッド情報は、前記1つ以上のスレッドのクラスの各々について、前記複数の間隔の各々のスレッド強度情報を含み、前記1つ以上の命令は、前記1つ以上のプロセッサによって実行されると、前記1つ以上のプロセッサに、さらに、
前記ヒープ情報を前記スレッド情報に相関させて、前記閾値を上回るヒープ使用量に対応する前記1つ以上のプロセスの1行以上のコードを特定させ、
前記1行以上のコードを特定することに応答して、前記1行以上のコードに関連する1つ以上のアクションを開始させる、非一時的なコンピュータ読み取り可能な媒体。
【発明の詳細な説明】
【技術分野】
【0001】
関連出願の相互参照
本願は、2017年5月5日に出願され、「Correlation of Thread Intensity and Heap Usage to Identify Heap-Hoarding Stack Traces(ヒープをため込んでいるスタック
トレースを特定するための、スレッド強度とヒープ使用量との相関)」と題された米国通常出願第15/588,531号、2016年5月9日に出願され、「Correlation of Thread Intensity and Heap Usage to Identify Heap-Hoarding Stack Traces(ヒープを
ため込んでいるスタックトレースを特定するための、スレッド強度とヒープ使用量との相関)」と題された米国仮出願第62/333,786号、2016年5月9日に出願され、「Memory Usage Determination Techniques(メモリ使用量判断技術)」と題された米
国仮出願第62/333,798号、2016年5月9日に出願され、「Compression Techniques for Encoding Stack Traces Information(スタックトレース情報を符号化するための圧縮技術)」と題された米国仮出願第62/333,804号、2016年5月9日に出願され、「Correlation of Stack Segment Intensity in Emergent Relationships(出現した関係におけるスタックセグメント強度の相関)」と題された米国仮出願第62/333,811号、2016年5月9日に出願され、「Systems and Methods of Stack
Trace Analysis(スタックトレース分析のシステムおよび方法)」と題された米国仮出
願第62/333,809号、2016年5月23日に出願され、「Characterization of Segments of Time-Series(時系列のセグメントの特徴づけ)」と題された米国仮出願
第62/340,256号、2017年5月5日に出願され、「Memory Usage Determination Techniques(メモリ使用量判断技術)」と題された米国通常出願第15/588,
526号、2017年5月5日に出願され、「Compression Techniques for Encoding Stack Trace Information(スタックトレース情報を符号化するための圧縮技術)」と題さ
れた米国通常出願第15/588,523、および、2017年5月5日に出願され、「Correlation of Stack Segment Intensity in Emergent Relationships(出現した関係におけるスタックセグメント強度の相関)」と題された米国通常出願第15/588,521の国際出願であり、米国特許法第119条(e)の下で、これらの出願に基づく優先権の利益を主張するものであり、これらの出願のすべてを、あらゆる目的のために引用により本明細書に援用する。
【0002】
(1)2017年5月8日に出願され、「MEMORY USAGE DETERMINATION TECHNIQUES(
メモリ使用量判断技術)」と題されたPCT通常特許出願PCT/US2017/031589号(代理人整理番号:088325-1047576(175210PC))。
【0003】
(2)2017年5月8日に出願され、「COMPRESSION TECHNIQUES FOR ENCODING STACK TRACE INFORMATION(スタックトレース情報を符号化するための圧縮技術)」と題され
たPCT通常特許出願PCT/US2017/031593号(代理人整理番号:088325-1047578(175220PC))。
【0004】
(3)2017年5月8日に出願され、「CORRELATION OF STACK SEGMENT INTENSITY IN EMERGENT RELATIONSHIPS(出現した関係におけるスタックセグメント強度の相関)」と題されたPCT通常特許出願PCT/US2017/031594号(代理人整理番号:088325-1047582(175230PC))。
【背景技術】
【0005】
背景
一般に、クラウドサービスプロバイダは、顧客とのサービスレベル契約(SLA:Service Level Agreements)を満たすために運用資源を維持する。プロバイダは、クラウドサービスがSLAに適合していることを確実にするために、自身が提供するサービスのパフォーマンス評価指標を常時監視する。しかしながら、利用可能なツールが、差し迫ったSLA違反を予測または検出する機能を有していない場合があるので、この運用資源では、当該違反を避けることができないだろう。これに加えて、ツールは、SLA違反の根本的原因を診断する機能を有していない場合があるので、運用には、このような違反が生じたときにそれを解決するためにより多くの時間がかかってしまうだろう。その結果、カスタマーエクスペリエンスに悪影響を与えてしまう可能性がある。
【0006】
さらに、このようなSLAは、SLA違反を回避し、かつ、契約内容を満たしているかどうかを判断するために、データを体系的に解析して、当該データに含まれる実行可能な情報に従って先回りして行動することを要求し得る。サービスレベル契約およびその他の要件に従うことは、非常に煩わしく、時間が経つにつれてさらに煩わしくなるだろう。
【発明の概要】
【発明が解決しようとする課題】
【0007】
上述の機能を得るためには、システムの下位レベルのイベントおよびシステム測定に基づいて簡単に更新できる上位レベルの状態モデルを使用して当該システムを表す手法が必要である。下位レベルのイベントの評価指標を取得することに関して、当該システムの基礎となるアプリケーションプログラムを計測してイベントの正確な測定値を収集することができる。しかしながら、このような手法では、計測自体が測定値に影響を与え得る。この問題は、メソッドの前後の計測コードの実行時間がメソッド自体の実行時間の大半を占める場合(たとえば、メソッド呼び出し回数が多い場合)には、より顕著であり得る。
【0008】
概要
メモリ効率を最適化するためにヒープをため込んでいるスタックトレースを特定するための特定の手法を開示する。いくつかの実施形態は、ソフトウェア実行環境内で高いヒープ使用量に対応するコードを特定するために、ヒープ情報をスレッド情報と相関させてもよい。
【課題を解決するための手段】
【0009】
一実施形態は、方法を対象とする。この方法は、1つ以上のコンピュータシステムによって、1つ以上のプロセスによるヒープ使用量が閾値を上回っている時間の長さを判断するステップと、時間の長さの間の1つ以上のプロセスのヒープ情報を決定するステップと含み、ヒープ情報は、時間の長さにおける複数の間隔の各々のヒープ使用量情報を含み、方法は、さらに、時間の長さの間の1つ以上のプロセスのスレッド情報を決定するステップを含み、スレッド情報を決定するステップは、1つ以上のスレッドのクラスを決定するステップを含み、スレッド情報は、1つ以上のスレッドのクラスの各々について、複数の間隔の各々のスレッド強度情報を含み、方法は、さらに、ヒープ情報をスレッド情報に相関させて、閾値を上回るヒープ使用量に対応する1つ以上のプロセスの1行以上のコードを特定するステップと、1行以上のコードを特定することに応答して、1行以上のコードに関連する1つ以上のアクションを開始するステップとを含み得る。
【0010】
例示的な実施形態を、下記の図面を参照しながら以下に詳細に説明する。
【図面の簡単な説明】
【0011】
【
図1】一定期間にわたって1つのスレッドのランタイムを比較的高い周波数の標本抽出レートでプロファイリングする例を示す図である。
【
図2】例示的な呼び出しコンテキストのツリーを示す図である。
【
図3】いくつかの実施形態に係る、一定期間にわたる仮想マシンのスレッドダンプの例を示す図である。
【
図4】いくつかの実施形態に係る、スレッド分類シグネチャの例を示す図である。
【
図5】いくつかの実施形態に係る、スレッド分類シグネチャの例を示す図である。
【
図6】いくつかの実施形態に係る、スレッド分類シグネチャの例を示す図である。
【
図7】いくつかの実施形態に係る、スレッドダンプに応答した1つ以上のスレッド分類シグネチャの生成および/または変更を表す簡略フローチャートである。
【
図8】分岐点を検出することに応答したスレッド分類シグネチャの生成または変更を表す簡略フローチャートである。
【
図9】いくつかの実施形態に係る、高いヒープ使用量に対応するコードの特定を表す簡略フローチャートである。
【
図10】いくつかの実施形態に係る、様々なスレッドのクラスと高いヒープ使用量との相関度合いの算出を表す簡略フローチャートである。
【
図11】標本の測定値に割り当てられた重みが当該標本の測定値に関連する標本抽出時間間隔に対して、例示的なデータセットの時間領域にわたってプロットされた、例示的なグラフである。
【
図12】本番環境におけるヒープ使用量を求めるためのそれぞれ異なる線形回帰法によって導出されたトレンドグラフを示す例示的なチャートである。
【
図13】標準的なロバスト回帰法によって得られた誤った結果を示す別のトレンドグラフを示す例示的なチャートである。
【
図14】いくつかの実施形態に係る、信号の予測の生成を表す簡略フローチャートである。
【
図15】特定の実施形態を実現するための分散システムの略図である。
【
図16】いくつかの実施形態に係る、クラウドサービスとしてサービスが提供され得るシステム環境の1つ以上のコンポーネントの簡略ブロック図である。
【
図17】特定の実施形態を実現するために使用され得る例示的なコンピュータシステムを示す図である。
【0012】
特許または出願ファイルは、色つきで製作された少なくとも1つの図面を含む。カラー図面を有する当該特許または特許出願公開の原稿は、請求および必要な料金の支払いが行われると、庁によって提供される。
【発明を実施するための形態】
【0013】
詳細な説明
I.概要
下記の記載において、本開示の実施形態の十分な理解を与えるために、説明の便宜上、具体的な詳細を記載する。しかしながら、これらの具体的な詳細なしに様々な実施形態を実施してもよいことは明らかである。図面および説明は、限定を意図したものではない。
【0014】
本開示は、全体として、最適化の可能性のためにマルチスレッドプロセス(たとえば、アプリケーションプログラム)内のコードブロックを特定し、かつ、将来のヒープ使用量および/またはスレッド強度を予測するために、ヒープ使用量統計データおよびスレッド強度統計データを利用することに関する。スレッド強度統計データは、プロセスの基礎となるコードを計測せずに、またはコード注入を使用せずに、プロセスの応答、負荷、およびリソース使用を追跡するために利用してもよい。具体的には、スレッドの型またはスタックセグメントの型の強度は、スレッドが実行中のまたはスタックセグメントが参照中のコードブロックの「ホット性(hotness)」の統計的測定値を指してもよい。コードブロ
ックのホット性は、実行量(たとえば、コードブロックの呼び出し回数×コードブロックの実行時間)によって定量化され得る。ホット性の高いコードブロックのほうが、呼び出し回数が多く、および/または応答時間が長い。
【0015】
規則的または不規則な時間間隔でプロセスから出力される一連のスレッドダンプを解析することによって、いくつかの実施形態は、(1)低オーバヘッドであり、(2)中断を伴わない、(3)常時接続で監視する、かつ(4)計測コードが計測中のコードの実行時間の大半を占めてしまう問題(すなわち、ハイゼンベルク問題)を回避する、統計的標本抽出ソリューションを提供してもよい。
【0016】
いくつかの実施形態は、強度統計データに基づいてスレッドおよびスタックセグメントを分類してもよい。ソフトウェア実行環境(たとえば、仮想マシン)から受信したスレッドダンプに含まれる個々のスレッドのスタックトレースを監視することによって、監視プロセスは、当該スレッドを、スレッドのスタックトレースの内容に基づいて1つ以上のスレッドクラスに分類できる。さらに多くのスタックトレースが解析されると、いくつかの実施形態は、スレッドクラスのサブクラスへの分岐を観測し、最終的には、スレッドクラスの階層構造を作成してもよい。たとえば、スタックセグメント(A)がスタックセグメント(A,B,D)の成分であると観測された場合、スレッド型(A,B,D)は、スレッド型(A)のサブクラスであると言えるだろう。また、スレッド型(A,C)は、スレッド型(A)のサブクラスであるとも言えるだろう。(A,B,D)および(A,C)に対応する強度統計データの集成が(A)に対応する強度統計データによって表され得るという意味では、スレッド型(A)は、サブクラス(A,B,D)および(A,C)を含む。これに加えて、いくつかの実施形態は、スレッドクラス階層構造を下方向に進み(たとえば、ツリーまたはグラフを横断し)、特定のスレッドクラスの強度がこのスレッドクラスの1つ以上のサブクラスの強度にどのように比例し得るかを観測してもよい。たとえば、(A)のスレッド強度は、(A,B,D)および(A,C)のスレッド強度に比例し得る。その他の実施形態では、各スタックトレースは、二分木として表されてもよい。
【0017】
いくつかの実施形態は、測定値、変化率(rate of change)、加速度、季節因子、および残差を推定するための1つ以上のシーケンシャルフィルタを提供できる。複数の期間(たとえば、平日期間および週末期間)の別々の季節指数を表し、かつ、複数の期間の季節因子を正規化するための手法がこのような実施形態によって実行されてもよい。具体的には、いくつかの実施形態は、複数の期間の各々の季節指数の別個のシーケンスを表してもよい。たとえば、複数の期間は、平日期間、週末期間、四半期末の期間、または個々の祝祭日期間を含んでもよい。また、複数の期間の季節指数を推定する際、いくつかの実施形態は、(1)季節指数をくりこんで(renormalize)、すべての期間にわたって共通のス
ケールおよび共通の基準レベルを提供し、(2)隣接する期間の端から端まで平滑化スプラインをフィットさせて、1つの期間に含まれるサイクル間の、または2つの隣接する期間に含まれるサイクル間の円滑な遷移をもたらしてもよい。くりこみによって、複数の期間の間の季節因子は、共通のスケールを有し得る。
【0018】
いくつかの実施形態は、ヒープ使用量統計データと、様々なスレッドのクラスの強度統計データとの間でトレンドを相関させて、高いヒープ使用量との相関度が高い強度統計データを有するスレッドのクラスを特定してもよい。ソフトウェア実行環境において、強度統計データが高いヒープ使用量と高い相関関係にあるスレッドのクラスの中から、非効率なヒープメモリ使用量が見つかる確率は高い。スレッドのクラスが特定されると、スレッドのクラスに関連するコードが調査および/または最適化されてもよい。
【0019】
いくつかの実施形態は、プロセスを実行するマルチスレッド型環境(たとえば、仮想マシン)のモデル(たとえば、一変量モデル、多変量モデル)を構築および保守してもよい。モデルは、各スレッドクラスの強度の季節トレンド、線形トレンド、および一次非線形トレンドを含む。システムの性能のトレンドについての季節調整済みの長期予測を取得するためにこのようなモデルが用いられてもよい。
【0020】
(1)スレッドを動的に分類してスレッドクラスのサブクラスの強度がスレッドクラスの総強度にどのように寄与するかを観測し、(2)検出された高いヒープ使用量の期間と様々なスレッドのクラスがどれくらい密接に相関関係にあるのかを観測することによって、いくつかの実施形態は、クラウドサービス・プロビジョニングシステム内のパフォーマンス欠陥の検出および観測を容易にしてもよい。軽微なパフォーマンス欠陥であっても、プロセス内のSLA違反となり得る問題が明らかになる場合が多いので、サービスプロバイダがパフォーマンス欠陥を検出して対処することを可能にすることによって、このような違反のリスクが大幅に低減される可能性がある。
【0021】
II.スレッドのランタイムのプロファイリング
図1~
図2は、様々なスタックセグメントが互いに関連してどれくらいの間スレッドのコールスタック上に存在するのかを判断するために、実行中のスレッドをプロファイリングする手法を表す図である。
図1は、一定期間にわたって1つのスレッド100のランタイムを比較的高い周波数の標本抽出レートでプロファイリングする例を示す。場合によっては、特定の手法は、ランタイムプロファイラを利用して、スレッドの複数のスタックトレース標本を出力し、
図2に示す呼び出しコンテキストのツリー200を構成してもよい。ランタイムプロファイラが採用する標本抽出間隔がスレッドの実行時間と比較して短い場合、スレッドの呼び出しコンテキストごとの観測回数(すなわち、呼び出し回数)の統計データを使用して、標本抽出間隔に対する呼び出しコンテキストの実行時間を正確に推定および/または表すことができる。
【0022】
たとえば、
図1に示すように、スレッド100の総実行時間は、100ミリ秒~1秒の間であってもよいのに対して、標本抽出間隔は、10ミリ秒~100ミリ秒の間である。スレッドがどのメソッドを呼び出すかによっては、スレッドの実行中にスレッドのスタック内に異なる呼び出しコンテキストが存在してもよい。スレッドは、スタックセグメントAに対応するメソッドのセットを呼び出すことによって、その実行を開始してもよい。
【0023】
なお、スタックセグメントは、線形接続された1つ以上のスタックフレームのセットに対応する。線形接続されたスタックフレームは、スタックトレース内で常に一緒に観測されるため、その強度統計データは同じである。したがって、スタックセグメントAは、スタックフレームa1、a2、およびa3などの複数のスタックフレームに対応してもよい。スレッドを標本抽出することによって、標本抽出されたスレッドの呼び出しコンテキスト全体をスタックフレームのリストで記述したスタックトレースができてもよい。リストにあるスタックフレームのいくつかが線形接続されている場合、これらのスタックフレームは、概念的に1つのスタックセグメントにまとめられてもよい。その結果、スタックトレースは、1つ以上のスタックフレームを各々が含む1つ以上のスタックセグメントを含むだろう。
【0024】
スレッドがその実行を続けると、スタックセグメントAに関連するコードが、当該スレッドに、スタックセグメントBに対応するメソッドのセットを呼び出させてもよい。次に、スタックセグメントBに関連するコードが、スレッドに、スタックセグメントDに対応するさらに別のメソッドのセットを呼び出させてもよい。短い期間の後、ランタイムプロファイラは、スレッド100の標本1を取ってもよく、その結果、第1スタックトレースができる。第1スタックトレースから、ランタイムプロファイラは、スタックセグメントA、B、およびDが標本抽出時にスタック上にあったと判断できる。1つの標本抽出間隔の後、ランタイムプロファイラは、スレッドの別の標本2を取ってもよく、その結果、第2スタックトレースができる。第2スタックトレースから、ランタイムプロファイラは、スタックセグメントA、B、およびDがスタック上にあったと判断できる。スレッドが実行を継続すると、スタックセグメントDに関連するメソッドが返されてもよく、その結果
、スタックから飛び出したスタックセグメントDに対応するスタックフレームができる。次に、ランタイムプロファイラは、スレッドの別の標本3を取ってもよく、その結果、第3スタックトレースができる。第3スタックトレースから、ランタイムプロファイラは、スタックセグメントAおよびBがスタック上にあったと判断できる。
【0025】
スレッドが実行すると、スタックセグメントBはスタックセグメントEを呼び出し、スタックセグメントEはスタックセグメントFを呼び出す。次に、標本4を取ることによって、スタックセグメントA、B、E、およびFがスタック上にあったことを示す第4スタックトレースができる。スタックセグメントF、E、およびBは、互いを返す。次に、標本5を取ることによって、スタック上にスタックセグメントAしかないことを示す第5スタックトレースができる。スタックセグメントAは、スタックセグメントCをスタック上にのせる。スタックセグメントCが戻る前に標本6および7が取られ、その結果、スタックセグメントAおよびCがスタック上にあることを示す第6スタックトレースおよび第7スタックトレースができる。最終的に、スタックセグメントCが戻り、スタック上にはスタックセグメントAしか残らない。スタックセグメントAに関連するメソッドが戻ったとき、スレッドは実行を終了する。
【0026】
図2に示すように、呼び出しコンテキストのツリー200は、標本抽出間隔に対するスタックセグメントA~Fの実行時間を表す。ノード202は、7つの標本すべてにおいてスタックセグメントAが観測されたことを示す。ノード204は、7つの標本のうちの4つおいてスタックセグメントBが観測されたことを示す。ノード206は、7つの標本のうちの2つにおいてスタックセグメントCが観測されたことを示す。ノード208は、7つの標本のうちの2つにおいてスタックセグメントDが観測されたことを示す。ノード210は、7つの標本のうちの1つにおいてスタックセグメントEが観測されたことを示す。ノード212は、7つの標本のうちの1つにおいてスタックセグメントFが観測されたことを示す。スレッド100の総実行時間が標本抽出間隔の存続期間のほぼ10倍であるので、各スタックセグメントの観測回数は、スタックセグメントの実行時間と密接な相関関係にあるだろう。たとえば、スタックセグメントBが4回観測されたので、スタックセグメントBの相対実行時間は、少なくとも標本抽出間隔の4倍であると推測できる。
【0027】
場合によっては、スレッド100が動作する環境(すなわち、ソフトウェア実行環境)は、標本抽出間隔ごとに1つのスレッドダンプが1回出力される仮想マシン(たとえば、Hotspot Java(登録商標)仮想マシン(JVM))に対応してもよい。スレッドダンプを出力する前に、仮想マシンは、実行中のスレッドのすべて(たとえば、スレッド100)にセーフポイントで一時停止するよう信号を送ってもよい。このセーフポイントメカニズムは、フル(full)ガベージコレクションを実行する前にスレッドを一時停止するためにガベージコレクタが使用するものと同様であってもよい。なお、カーネルモードで実行中(たとえば、入出力操作上で実行中/ブロック中)のスレッドは、スレッドがカーネルモードを出て戻る(たとえば、JVMモードに戻る)までセーフポイントで一時停止しなくてもよい。
【0028】
なお、しかしながら、高い頻度率でセーフポイントメカニズムを呼び出すことは、相当なオーバヘッドにつながる。したがって、高標本抽出レートに頼るランタイムプロファイリング手法は、本番環境よりも開発環境またはテスト環境にふさわしいだろう。
【0029】
オーバヘッドを減らすために、いくつかの実施形態は、標本抽出レートを下げることを補償するためのシステムモデルを採用する。たとえば、いくつかの実施形態は、マルチスレッドプロセスのスレッドの強度を追跡して、待機時間を決定する閾値を上回る強度を有するスレッドのみを標本抽出してもよい。低標本抽出レートまたは適応標本抽出レートを採用する実施形態の1つの利点は、カーネルモードで実行中のスレッドがセーフポイント
で一時停止させられることが少ないことである。オーバヘッドを低減するその他の方法は、標本抽出中のスレッドの強度に釣り合うように標本抽出間隔を長くすることを必要としてもよい。たとえば、1分の標本抽出間隔は、本番環境内で無視できるオーバヘッドをもたらし得るが、本番環境においてスレッドとその成分スタックセグメントの相対実行時間を導出するには短すぎる可能性がある。したがって、いくつかの実施形態は、リトルの公式の仮定と一致させるための定常平均エルゴード性または周期定常平均エルゴード性を示す本番システムのための常時接続の性能監視ソリューションを提供してもよい。このような実施形態では、常時接続の性能監視ソリューションは、本番システムの1台以上の仮想マシン内で実行中のスレッドを定期的に標本抽出する監視プロセス(すなわち、制御システム)に含められてもよい。
【0030】
III.スレッドの分類
様々な実施形態は、スレッドクラスを特定して当該スレッドクラスに関係する強度統計データを追跡するために1台以上の仮想マシン(たとえば、JVM)から出力された一連のスレッドダンプ標本を逐次解析するための手法を提供する。たとえば、仮想マシン内での1つ以上のマルチスレッドプロセスの実行中、制御システムは、仮想マシンのスレッドダンプを定期的に出力してもよい。このスレッドダンプによって、仮想マシンにおいて動作中のスレッド毎のスタックトレースができてもよい。受信するスタックトレースごとに、制御システムは、スタックトレースに含まれるテキストを解析して、関連するスレッドを分類し、すべてのスレッドクラスについて追跡された強度統計データをスタックトレースに基づいて更新してもよい。
【0031】
スレッドを分類することに加えて、実施形態は、前に分類されたスタックセグメントに沿った分岐点で新しいスタックセグメントが出現する度に、当該新しいスタックセグメントを分類してもよい。スレッドクラスが発見される前に制御システムが第1スタックトレースを観測した場合、制御システムは、スタックトレース内のスタックフレームのシーケンス全体が線形接続されていると考えてもよい。なぜならば、今のところスタックフレームのシーケンス全体が一緒でしか現れていないからである。これに応答して、制御システムは、スレッドクラスを初期化して、スタックトレース全体(すなわち、スタックフレームのシーケンス全体)を分類してもよい。制御システムがスタックフレームの様々なシーケンスを含む後続スタックトレースを観測すると、制御システムは、追加のスレッドクラスを初期化して、スタックフレームの一意の順列の各々を分類することができる。場合によっては、制御システムは、先に観測されたスタックトレースとスタックフレームを共有しない(すなわち、共通のスタックフレームを有さない)スタックトレースを観測する場合がある。これに応答して、制御システムは、別のスレッドクラスを初期化して新しいスタックトレースの全体を分類すればよい。
【0032】
しかしながら、より一般的には、制御システムは、1つ以上のスタックフレームを、先に観測されたスタックトレースと共有するスタックトレース観測することができる。
図1に戻ると、たとえば、制御システムが観測した第1スタックトレースが{(A,B,D)}(すなわち、標本1または標本2に含まれるスタックトレース)であるとする。このスタックトレースは、スタックセグメントA、B、およびDに含まれるスタックフレームを含む。制御システムは、スレッドクラス{(A,B,D)}を初期化し、スタックセグメントA、B、およびDに含まれるスタックフレームを含むと観測されるすべてのスレッドを分類してもよい。次に、制御システムによって観測された第2スタックトレースが{(A,C)}(すなわち、標本6または標本7に含まれるスタックトレース)であるとする。この点については、制御システムは、第1スタックトレースと第2スタックトレースは互いに異なるが、第1スタックトレースと第2スタックトレースは、スタックセグメントAに含まれるスタックフレームのすべてを共有していると判断してもよい。これによって、スタックセグメントAにおいて分岐点ができる。これに応答して、制御システムは、ス
レッドクラス{(A,C)}を初期化して、スタックセグメントAおよびCをコールスタック上に含むすべてのスレッドを分類してもよい。
【0033】
なお、スタックセグメントAに含まれるスタックフレームがスタックセグメント(B,D)に含まれるスタックフレームとは別に観測されたので、スタックセグメントAと(B,D)は、もはや、線形接続されているとは制御システムによって考えられていない。しかし、制御システムは、スタックセグメントAに含まれるスタックフレームは線形接続されており、スタックセグメント(B,D)に含まれるスタックフレームは線形接続されていると今も考えている。この点については、制御システムは、スレッドクラス{(A,B,D)}およびスレッドクラス{(A,C)}のいくつかのスレッドセグメント成分を初期化して、新しく発見された分岐点によって形成された新しいスタックセグメントを分類してもよい。具体的には、制御システムは、スレッドセグメント(A)、スレッドセグメント(B,D)、およびスレッドセグメント(C)を初期化してもよい。スレッドセグメント(A)および(B,D)は、スレッドクラス{(A,B,D)}の成分であり、スレッドセグメント(A)および(C)は、スレッドクラス{(A,C)}の成分である。
【0034】
いくつかの実施形態は、分類シグネチャを用いてスタックトレースおよびスタックセグメントを表してもよい。具体的には、トレースシグネチャは、特定のスレッドクラスのスタックトレースを表すために用いることができ、セグメントシグネチャは、特定のスレッドセグメントのスタックセグメントを表すために用いることができる。各トレースシグネチャは、合成解析処理によって作成されるラベル付けされた二分木から成る組(tuple)
に対応してもよい。一方では、スレッドセグメントの各セグメントシグネチャは、スレッドクラスに対応する組のノードに対応してもよい。当該スレッドクラスのスレッドセグメントが組の成分である。後に解析処理において、組を解析木のように(たとえば、生成文法(production grammar)の一部として)用いて、入ってくるスタックトレースを認識してもよい。
【0035】
上記例に戻ると、第1スタックトレースの観測の後、第2スタックトレースの観測の前、スレッドクラス{(A,B,D)}は、1つの二分木からなる組に対応してもよい。第1スタックトレース内のフレームのシーケンス全体が1つのスタックセグメントと考えられるので、当該1つの二分木は、スタックセグメント(A,B,D)を表す1つの根ノードを含んでもよい。第2スタックトレースの観測の後、組は、まだ1つの二分木しか含んでいないだろう。しかしながら、ここで、二分木は、スタックセグメント(A,B,D)を表す根ノードと、スタックセグメント(A)を表す根ノードの第1子ノードと、スタックセグメント(B,D)を表す根ノードの第2子ノード、という3つの別々のノードを含んでもよい。トレースシグネチャとセグメントシグネチャとを合成する処理については、
図4~
図6を参照して以下にさらに詳細に説明する。
【0036】
二分木に含まれる各ノードは、コンパクト符号と称され得るラベルまたは識別子によって一意に識別されてもよい。いくつかの実施形態では、スレッドクラスに対応する組の各最上位ノードを識別する1つ以上のコンパクト符号によって、特定のスレッドクラスのスレッドが表されてもよい。ハフマン符号化またはその他のエントロピー符号化方式と同様のやり方で、いくつかの実施形態は、より人気のある(すなわち、より高いスレッド強度の)および/または最初に発見されるスレッドクラスに、より短い組を関連付けてもよい。その結果、より短いコンパクト符号のシーケンスによって、より一般的な型のスレッドをコンパクトに表すことができる。いくつかの実施形態では、これは、オフライン解析(すなわち、オフライン処理)でスタックトレースの確率分布をまず解析して、スタックトレースを頻度の低いものから順に制御システムに送ることによって確実にされてもよい。
【0037】
オフライン解析に頼らない実施形態では、制御システムは、1台以上の仮想マシン(す
なわち、オンライン処理)から定期的に出力されるスレッドダンプとともにスタックトレースを順々に受信してもよい。
【0038】
異なる型のスタックトレースが観測される順序は、各型のスタックトレースの強度の影響を受ける可能性がある。すなわち、強度が高いスタックトレースは、統計上、シーケンスの中で早く観測される傾向がある。したがって、このような実施形態は、(1)特定のスレッドクラスのスレッド強度が、関連するスタックトレースの発生確率を表し、(2)強度が強いスレッドクラスに関連するスタックトレースのほうが、強度が低いスレッドクラスに関連するスタックトレースよりも前に観測されることが多い、と想定してもよい。この点については、制御システムは、最も高い強度のスレッドについて最もコンパクトな表現を自然に導出する。したがって、オフライン処理ではなくスレッド強度統計データに頼ることによって、いくつかの実施形態は、一連のスレッドダンプに応答して観測されるスタックトレースにとって最適な圧縮アルゴリズムを提供することができる。
【0039】
A.スレッド強度の季節変動
【0040】
【0041】
いくつかの実施形態では、季節トレンド把握処理は、不規則な標本抽出間隔(たとえば、ヒープ使用量の標本抽出および/またはスレッドダンプの出力)を考慮に入れるために、そして、コーシー分布問題を克服するために、変数フィルタパラメータを使用してもよい。また、この処理は、複数の種類の様々な長さ(たとえば、1日、2日)の期間(たとえば、平日期間、週末期間、および祝祭日期間)を逐次フィルタリングすることをサポートできる。さらに、この処理は、スレッドダンプに基づいて決定されるスレッド強度統計データの特定の信頼水準を維持しつつ、季節変動に応じてスレッドダンプの出力率を調整してオーバヘッドを低減できる。また、場合によっては、スレッドダンプ率を調整することによって、オフライン処理のためにネットワーク(たとえば、LAN、インターネット)で他のマシン(たとえば、ビッグデータ・レポジトリ)に運ばれる必要のあるスレッドダンプデータの量を最低限に抑えてもよい。
【0042】
いくつかの実施形態では、季節トレンド把握処理は、平日期間(すなわち、24時間)を96個の15分間隔に分割してもよく、この結果、平日期間ごとに96個の季節指数(すなわち、季節)ができる。この処理は、週末期間(すなわち、48時間)を192個の
15分間隔に分割してもよく、この結果、週末期間ごとに192個の季節指数ができる。特定の長さのデータセット(たとえば、1つまたは2つの週末を含む10日間のスレッドダンプまたはヒープ使用量を記録した時系列)を受信すると、処理は、1つの平日にわたって観測された季節パターンと全週末にわたって観測された季節パターンとを分けるために、平日期間と週末期間とに多期間トレンド把握フィルタを別々に適用することができ、この結果、各平日に含まれる96個の季節指数に対して、96個の季節因子からなるセット、および、各週末に含まれる192個の季節指数に対して、192個の季節因子からなるセットができる。次に、この処理は、「1」という季節因子が平日期間および週末期間に共通の基準レベルを表すように、平日季節因子および週末季節因子をくりこんでもよい。
【0043】
なお、1よりも大きい季節因子が季節指数に割り当てられた場合、その季節指数は、期間の残りと比較して、平均値よりも高い値を有する。一方では、1よりも小さい季節因子が季節指数に割り当てられた場合、その季節指数は、期間の残りと比較して、平均値よりも低い値を有する。たとえば、午前9時~午前9時15分という間隔に対応する季節指数の特定のスレッドクラスのスレッド強度の季節因子が1.3である場合、午前9時~午前9時15分という間隔の間のその特定のスレッドクラスの平均スレッド強度は、その特定のスレッドクラスの平日全体の平均スレッド強度よりも30%高い。
【0044】
いくつかの実施形態では、平日期間は24時間ごとに繰り返し、週末期間は5日または7日ごとに繰り返すが、季節トレンド把握処理は、祝祭日(たとえば、労働者の日(Labor Day)、クリスマス祭日)を、12か月に1回の頻度で繰り返す別個の期間として分け
てもよい。1という季節因子がすべての期間に共通の基準レベルを表すように、平日期間および週末期間の季節因子のセットとともに、このような祝祭日期間の季節因子のセットがくりこまれてもよい。必要に応じて適切にその他の頻度が各期間に用いられてもよい。例として、祝祭日が6か月ごとの頻度などで分けられてもよいのに対して、平日は、12時間ごとに繰り返す期間などであってもよい。
【0045】
いくつかの実施形態では、強度統計データの決定および追跡は、将来の値および変化率を予測することをさらに含んでもよい。しかしながら、標本抽出間隔は、不規則で有り得、または、気まぐれにゼロに近づいてしまったりさえする。標本抽出間隔が気まぐれにゼロに近づいてしまう場合、変化率は、平均および標準偏差が未定義であるコーシー分布の確率変数になる可能性がある。適応標本抽出間隔を用いて季節トレンドを決定することについてのコーシー分布問題を克服するために、いくつかの実施形態は、ホルト(Holt)の2重指数フィルタ、ウィンター(Winter)の3重指数フィルタ、ライト(Wright)の不規則な間隔のための拡張、ハンザック(Hanzak)の時間近接間隔の調整因子、外れ値の検出、および外れ値のカットオフの適応型スケーリングを伴うクリッピングなど、様々な適応を採用してもよい。指数フィルタの5つのセットをデータセットに逐次適応して、平日期間および週末期間の季節因子のセットを推定することができる。
【0046】
B.分類シグネチャおよび圧縮方式
特定の実施形態は、コンパクト符号の可変長シーケンスをスレッドのスタックトレースに割り当て得る。シーケンスの長さは、スレッドの強度によって異なる。例示的なスタックトレースを以下に示す。
【0047】
【0048】
スタックトレースの例では、Java Database Connectivity(JDBC)ドライバのスタックセグメント(すなわち、「oracle.jdbc.driver…」を含んだ2つのスタックフレーム)下のスタックフレーム「oracle
mds core MetadataObject getBaseMO」は、Meta Data Service(MDS)ライブラリが当該JDBCスタックセグメントに対応するJDBC動作を呼び出すことを示す。MDSライブラリのスタックセグメント(すなわち、「oracle.mds…」を含んだ3つのスタックフレーム)下のスタックフレーム「oracle adf model servlet ADFBindingFilter doFilter」は、MDS動作がApplication Development Framework(ADF)動作によって呼び出されることを示す。このスタックトレースの下部のWebLogicスタックセグメント(すなわち、「weblogic…」を含んだ4つのスタックフレーム)が示すように、ADF動作は、Hypertext Transfer Protocol(HTTP)Servletリクエストによって呼び出される。
【0049】
例として、2レベルハフマン符号化法を用いて上記スタックトレースを符号化して圧縮することができ、その結果、このスタックトレース例を表すコンパクト符号のシーケンスができる。第1レベルでは、圧縮ツール(たとえば、gzip)が、「ServletRequestImpl.java」および「weblogic.servlet.internal.ServletRequestImpl.run」など、スタックトレース内の部分文字列を検出して、これらの部分文字列がどれだけ頻繁にスタックトレースに存在するかに応じて部分文字列のハフマン符号を導出できる。圧縮比を上げるためには、より頻繁に存在する部分文字列に、より短いハフマン符号を割り当てればよい。第1レベルの圧縮の後、圧縮されたスタックトレースは、ハフマン符号から部分文字列を復元するために使用され得る符号化辞書をメタデータとして含んでもよい。
【0050】
第2レベルは、スタックトレースのスタックセグメントをセグメントシグネチャに置き
換えることによって、圧縮されたスタックトレースに別レベルの圧縮を加えることを必要としてもよい。第2レベルの圧縮を加えるステップについては、
図4~
図6を参照して以下にさらに詳細に説明する。
【0051】
C.データ構造の例
分類シグネチャは、1つ以上のオブジェクト型を介してメモリで表されてもよい。具体的には、いくつかの実施形態は、ThreadClassificationInfoオブジェクトを用いてスレッドクラスの分類シグネチャ(すなわち、トレースシグネチャ)を表し、SegmentInfoオブジェクトを用いてスレッドセグメントの分類シグネチャ(すなわち、セグメントシグネチャ)を表し、StackFrameInfoオブジェクトを用いてスタックセグメント内の線形接続されたスタックフレームに含まれる各要素を表し、SeasonalTrendInfoオブジェクトを用いてスレッドクラスまたはスレッドセグメントの強度統計データをカプセル化して追跡してもよい。
【0052】
ThreadClassificationInfoオブジェクト、SegmentInfoオブジェクト、StackFrameInfoオブジェクト、およびSeasonalTrendInfoオブジェクトを定義するクラス/インタフェース定義の例を以下に示す。
【0053】
【0054】
上記定義から分かるように、各ThreadClassificationInfoオブジェクト、SegmentInfoオブジェクト、およびStackFrameInfoオブジェクトは、一意の識別子(すなわち、ID)と、名称と、同じ型(たとえば、同
じスレッドクラス、同じスレッドセグメント、同じ型のスタックフレーム)のオブジェクトが最新のスレッドダンプにおいて観測された回数(すなわち、numOfOccur)を追跡するカウンタと、同じ型のオブジェクトがすべてのスレッドダンプにおいて観測された回数を追跡する別のカウンタとを含む。
【0055】
ThreadClassificationInfoオブジェクトは、SegmentInfoオブジェクトのリストと、SeasonalTrendInfoオブジェクトとを含み得る。この点については、ThreadClassificationInfoが二分木からなる組に対応し得るのに対して、SegmentInfoオブジェクトのリストは、二分木を構成するノードに対応する。SeasonalTrendInfoオブジェクトは、ThreadClassificationInfoオブジェクトが表すスレッドクラスに関する強度統計データ(たとえば、フィルタ状態)を記録してもよい。
【0056】
SegmentInfoオブジェクトは、StackFrameInfoオブジェクトのリストと、第1の子であるSegmentInfoオブジェクト(すなわち、firstSegment)と、第2の子であるSegmentInfoオブジェクト(すなわち、secondSegment)と、結合(coalescing)(すなわち、親である)SegmentInfoオブジェクト(すなわち、coalescingSegment)と、前節の兄弟であるSegmentInfoオブジェクト(すなわち、前節点)のリストと、次節の兄弟であるSegmentInfoオブジェクト(すなわち、次節点)のリストと、SeasonalTrendInfoオブジェクトとを含み得る。この点については、SegmentInfoオブジェクトは、スタックセグメントに対応し得る。SegmentInfoオブジェクトが葉ノードに対応する場合、StackFrameInfoオブジェクトのリストは、スタックセグメントに含まれる線形接続されたスタックフレームに対応してもよい。SegmentInfoオブジェクトが分岐点に隣接する場合、兄弟であるSegmentInfoオブジェクトは、分岐点の反対側のスタックセグメントに対応し得るのに対して、結合SegmentInfoオブジェクトは、当該スタックセグメントおよび兄弟スタックセグメントを含む親スタックセグメントに対応し得る。SegmentInfoオブジェクトが葉ノードに対応しない場合、子であるSegmentInfoオブジェクトは、スタックセグメントにおいて分岐点が発見された時に作成されたスタックセグメントのサブセグメントに対応し得る。SeasonalTrendInfoオブジェクトは、SegmentInfoオブジェクトが表すスレッドセグメントに関する強度統計データを記録してもよい。
【0057】
いくつかの実施形態は、一緒に観測されるStackFrameInfoオブジェクトのリストを1つのSegmentInfoノードに関連付けることによって、スタックトレースのスタックセグメントを分類してもよい。すなわち、SegmentInfoノードは、スタックセグメントの各StackFrameInfoオブジェクトの結合ノードである。各StackFrameInfoオブジェクトは、1つの結合SegmentInfoノードを有してもよい。SegmentInfoノードの線形接続されたStackFrameInfoオブジェクトに沿った箇所のどこかで分岐点が検出された場合、いくつかの実施形態は、2つの新しいSegmentInfoノードを作成し、線形接続されたStackFrameInfoオブジェクトを、新しいSegmentInfoノードの2つの線形接続されたStackFrameInfoオブジェクトのセットに分割してもよい。次に、この2つのStackFrameInfoオブジェクトを分岐点を経由して接続することができる。
【0058】
新しいSegmentInfoノードの各々は、セグメントの一部においてStackFrameInfoオブジェクトの結合ノードになる。特定の実施形態は、StackFrameInfoオブジェクトのcoalescingSegmentを、各Stack
FrameInfoオブジェクトが適切な結合SegmentInfoノードを参照するように、対応付けて更新できる。この2つの新しいSegmentInfoノードは、左兄弟ノードと右兄弟ノードとして表される。また、この2つの新しいSegmentInfoノードは、元のSegmentInfoノードの子ノードにもなり、当該元のSegmentInfoノードは、これら2つの新しいSegmentInfoノードの親になる。親であるSegmentInfoノードは、2つの新しいSegmentInfoノードの結合ノードになり得る。
【0059】
発見された分岐点に応答してスタックセグメントを分割する処理によって、SegmentInfoノードから構成される二分木構造ができ得る。この分割処理は、スレッドクラス(すなわち、スタックトレースのクラス)のスレッドサブクラスへの分岐として見られ得る。いくつかの実施形態は、スタックセグメントに含まれる個々のスタックフレームの強度が時間の経過に伴い発散するにつれ、スタックセグメントをより小さなスタックセグメントに分割し続けることができる。これによって、スレッドクラス階層構造をドリルダウンして、スレッドクラスの強度がスレッドサブクラスの強度にどのように比例し得るかを観測することが可能になる。
【0060】
いくつかの実施形態では、二分木の内部にあるSegmentInfoノードは、StackFrameInfoオブジェクトがすべて線形接続されているわけではない親ノードである。なぜならば、分岐点を経由して接続されているスタックフレームもあるからである。対照的に、葉であるSegmentInfoノードのStackFrameInfoオブジェクトは、線形接続されている可能性がある。SegmentInfoノード内で、線形接続または分岐点で接続されたStackFrameInfoオブジェクトは、下側にStackFrameInfo、上側にStackFrameInfoを有するスタックとして方向付けられ得る。慣習により、左の兄弟であるSegmentInfoノードに含まれる上側のStackFrameInfoオブジェクトは、右の兄弟であるSegmentInfoノードに含まれる下側のStackFrameInfoオブジェクトに、分岐点を経由して接続され得る。
【0061】
各SegmentInfoノードは、SegmentInfoノードが表すスレッド(サブ)クラスの強度統計データを追跡するためのSeasonalTrendInfoオブジェクトを含んでもよい。SegmentInfoノードを2つの新しい子であるSegmentInfoノードに分割する際、いくつかの実施形態は、SegmentInfoノードのSeasonalTrendInfoオブジェクトをクローン作成して2つの新しいSeasonalTrendInfoオブジェクトを作成し、子であるSegmentInfoノードの各々に1つのSeasonalTrendInfoオブジェクトをセットすることができる。
【0062】
いくつかの実施形態は、分割処理を通して親であるSegmentInfoノードのフィルタ状態を新しい子であるSegmentInfoノードに複製する機能を提供する。そうすることで、いくつかの実施形態は、親であるSegmentInfoノードと兄弟であるSegmentInfoノードとの間の強度統計データの比を常時追跡することができる。具体的には、子であるSegmentInfoノードの強度統計データは、当初、親であるSegmentInfoノードの強度統計データと同じである。しかしながら、新しい標本が取得されると、子であるSegmentInfoノードの強度統計データは、親であるノードの強度統計データから、および、その他の子であるSegmentInfoノードの強度統計データから発散し始めるだろう。新しいスタックセグメントのフィルタ状態は別々に更新されるので、新しいスタックセグメントのフィルタ状態は、互いから、および、元のスタックセグメントのフィルタ状態からはずれ始めるだろう。
【0063】
場合によっては、親であるSegmentInfoノードと兄弟であるSegmentInfoノードとの間の強度統計データは、時間の経過に伴い一定の比に収束し得る。いくつかの実施形態は、親子および兄弟関係をSegmentInfoノード間で当てはめて、多変量状態推定手法の場合の相関モデルを定義することができる。具体的には、この処理が定常である場合、関係するSegmentInfoノード間の強度統計データの比は、定常状態に収束するだろう。具体的には、処理が厳密な意味または広い意味で定常である場合、関係するSegmentInfoノード間の強度統計データの同時確率分布の1次モーメントおよび2次モーメント(関係するSegmentInfoノードの平均、分散、自己共分散、および相互共分散を含み得る)は、時間の経過とともに変化することはないだろう。したがって、親であるSegmentInfoノードと兄弟であるSegmentInfoノードとの間の強度統計データの比は、時間の経過に伴い収束すると予想され得る。したがって、分岐点を経由する兄弟であるSegmentInfoノードの強度統計データを常時追跡し、親であるSegmentInfoノードと兄弟であるSegmentInfoノードとの間の強度統計データの比が時間の経過に伴い収束すると判断することによって、いくつかの実施形態は、当該比を用いて、多変量状態推定手法の場合の相関モデルを定義することができる。結果として得られるモデルは、アノマリ検出法と予測を生成することに用いることができる。
【0064】
StackFrameInfoオブジェクトは、1つ以上の前節のStackFrameInfoオブジェクトおよび/または1つ以上の次節のStackFrameInfoオブジェクト(すなわち、前節点および次節点)と、結合SegmentInfoオブジェクト(すなわち、coalescingSegment)と、StackFrameInfoオブジェクト(すなわち、classMethodLineNumber)が参照するコードを識別する情報とを含み得る。StackFrameInfoオブジェクトが分岐点に隣接しない場合、StackFrameInfoオブジェクトは、1つの前節点であるスタックフレームと1つの次節点であるスタックフレームとに線形接続することができる。StackFrameInfoオブジェクトは、含んでいるSegmentInfoオブジェクトを、メンバ変数coalescingSegmentによって参照することができる。
【0065】
最新のスレッドダンプを処理する時が来ると、ThreadClassificationInfoオブジェクト、SegmentInfoオブジェクト、およびStackFrameInfoオブジェクトごとのメンバ変数numOfOccurは、0にリセットされ得る。スレッドダンプから得られた各スタックトレースは、スタックトレースの下から上に構文解析されてもよい。第1レベルのハフマン符号化法を適用して当該スタックトレースを圧縮した後、スタックトレースの各行は、StackFrameInfoオブジェクトに構文解析されてもよい。StackFrameInfoオブジェクトのリストをSegmentInfoオブジェクトのリストに構文解析した後、いくつかの実施形態は、SegmentInfoオブジェクトの一致するリストを含むThreadClassificationInfoオブジェクトにSegmentInfoオブジェクトのリストを照合しようと試みてもよい。このようなThreadClassificationInfoオブジェクトが存在しない場合、いくつかの実施形態は、SegmentInfoオブジェクトのリストを表すための新しいThreadClassificationInfoオブジェクトを登録してもよい。その後、次に、いくつかの実施形態は、一致する/新しいThreadClassificationInfoオブジェクトのnumOfOccurメンバ変数およびtotalNumOfOccurメンバ変数、ならびに当該一致する/新しいThreadClassificationInfoオブジェクトに含まれる各SegmentInfoオブジェクトおよびStackFrameInfoオブジェクトを更新してもよい。なお、SegmentInfoノードが葉レベルのノードである場合、当該ノードのnumOfOccurメンバ変数は、SegmentInfo
ノードに含まれる各StackFrameInfo要素のnumOfOccurメンバ変数と同等である。
【0066】
次に、いくつかの実施形態は、関連するSeasonalTrendInfoオブジェクトにカプセル化された強度の統計的測定値を更新できる。具体的には、いくつかの実施形態は、含んでいるThreadClassificationInfoオブジェクトまたはSegmentInfoオブジェクトのnumOfOccurメンバ変数にrawMeasureをセットすることによって、各SeasonalTrendInfoオブジェクトに含まれるrawMeasureメンバ変数を更新してもよい。なお、いくつかの実施形態では、rawMeasureは、N個のスレッドダンプごとに更新されればよく、この場合、SeasonalTrendInfoオブジェクトのrawMeasureは、Nで除算された対応するnumOfOccurにセットされる。いくつかの実施形態では、このような実施形態は、関連するThreadClassificationInfoオブジェクトまたは関連するSegmentInfoオブジェクトのnumOfOccurメンバ変数がゼロでない場合にのみ、SeasonalTrendInfoオブジェクトのrawMeasureメンバ変数を更新してもよい。numOfOccurメンバ変数がゼロでない場合、SeasonalTrendInfoオブジェクトのrawMeasureは、Nで除算されたnumOfOccurの値にセットされる。ここで、Nは、rawMeasureが最後に更新されてからのスレッドダンプの数である。このような実施形態では、メソッドは、numOfOccurがゼロであるときのケースを、使用可能な測定値がないかのように扱う。この点については、使用可能な測定値がない場合、rawMeasureは更新されない。言い換えると、このような実施形態は、rawMeasure「N」が最後に更新されてからのスレッドダンプの数を追跡する。スレッド強度の測定値は、不規則な時系列に対応してもよい。なお、不規則な間隔のための指数フィルタ(たとえば、上述したホルトの二重指数およびウィンターの3重指数フィルタ)は、rawMeasureを効果的にフィルタリングし、季節変動が除去された(de-seasonalized)測定値および季節因子を、不規則な間隔で行われた一連の測定から得ること
ができる。
【0067】
なお、各SeasonalTrendInfoオブジェクトは、次の統計的測定値の各々に適用されている5つの指数フィルタのセットによって生成された時系列データを含み得る:スレッド強度の生測定値、スレッド強度が増加または減少する率、この率の加速または減速、スレッド強度の季節因子、および残差成分。SeasonalTrendInfoオブジェクト内では、変数用の5つの指数フィルタのセットの状態、フィルタ定数、(標本間の不規則な間隔のために調整する)フィルタパラメータ調整重み因子、およびフィルタパラメータは、当該時系列データによって表され得る。
【0068】
D.分類シグネチャの生成の例
図3は、いくつかの実施形態に係る、一定期間にわたる仮想マシン300のスレッドダンプの例を示す図である。
図1の標本抽出間隔が100ミリ秒~1秒であるランタイムプロファイリングとは対照的に、
図3の制御システムが採用する標本抽出間隔は、標本抽出のオーバヘッドを低減するために、さらに長くてもよい(たとえば、20秒~1分の間)。
図3に示すように、2~3つの標本抽出間隔内で、仮想マシン300内で動作中のプロセスは、スレッド302、304、306、308、310、および312を生成する。スレッド302~312の各々は、動作中に別のコールスタックに関連付けられるので、スレッドダンプが出力されたときにスタックトレースを出力することができる。
図3は、スレッドダンプN、スレッドダンプN+1、およびスレッドダンプN+2という、全部で3つの出力されるスレッドダンプを表す。
【0069】
図3は、3つの連続したスレッドダンプにおいて(A,B,D)、(A,B,D)、(
A,C)、(A,B,E)の順序で観測される3つの異なる型のスタックトレースを示す。スタックトレース(A,B,D)は、2回観測される。スレッドダンプNが出力される前に、スレッド302が生成されて動作を開始する。スレッドダンプNが出力されると、スレッド302に関して、スタックトレース(A,B,D)が観測される。なお、スタックセグメントA、スタックセグメントB、およびスタックセグメントDはまだ識別されていないが、説明を簡単にするため、
図3に示す例の初めから終わりまでスタックセグメントの名前を使用する。スレッドダンプNが出力された後に1つの標本抽出間隔が経過すると、スレッド302が終了し、スレッド306および308が生成されている間にスレッド304が生成されて、標本抽出されることなく終了する。スレッドダンプN+1が出力されると、スレッド308がスタックトレース(A,B,D)を出すのに対して、スレッド310は、スタックトレース(A,C)を出す。スレッドダンプN+1が出力された後に別の標本抽出間隔が経過すると、スレッド306および308が終了し、スレッド310が生成されて、標本抽出されることなく終了し、スレッド312が生成される。スレッドダンプN+2が出力されると、スレッド312は、スタックトレース(A,B,E)を出す。
図3から分かるように、(A,B,D)スレッド型は、観測される最初の型のスレッドであり、(A,B,D)スレッド型の強度は、(A,C)または(A,B,E)スレッド型よりも大きい。
【0070】
スレッドダンプNの後、制御システムは、1つのSegmentInfo(A,B,D)ノードをスタックトレース(A,B,D)の分類シグネチャとして登録できる。次に、制御システムは、SeasonalTrendInfo(A,B,D)オブジェクトをSegmentInfo(A,B,D)ノードに関連付けて、このノードによってカプセル化された状態を更新してもよい。
【0071】
SegmentInfo(A,B,D).numOfOccur = 1.
SegmentInfo(A,B,D).totalNumOfOccur = 1.
図4は、スタックトレース(A,B,D)に応答して登録された1つの分類シグネチャ450を含む分類シグネチャ400のセットを示す図である。
図4から分かるように、分類シグネチャ450は、SegmentInfo(A,B,D)に対応する1つのノード402を含む。SegmentInfo(A,B,D)は、スタックトレースのすべてのスタックフレームa1~d3の結合ノードとして示されている。
【0072】
スレッドダンプN+1においてスタックトレース(A,B,D)が再び観測された場合、制御システムは、SegmentInfo(A,B,D)ノードを、以下のように更新してもよい。
【0073】
SegmentInfo(A,B,D).numOfOccur = 1.
SegmentInfo(A,B,D).totalNumOfOccur = 2.
スレッドダンプN+1においてスタックトレース(A,C)が初めて観測された場合、制御システムは、スタックセグメント(A,B,D)内のスタックフレームのセット全体はもはや線形接続されていないと判断する。ここで、「A」で表されるスタックフレームのセットのうちの最後のスタックフレーム(たとえば、スタックトレースの上から下へと進む)と、「B,D」で表されるスタックフレームのセットのうちの最初のスタックフレームとの間に分岐点が存在する。なぜならば、どのようなスタックトレースにおいても、最後のスタックフレームに続く次のスタックフレームは、(1)(B,D)のうちの最初のスタックフレーム、または(2)「C」で表されるスタックフレームのセットのうちの最初のスタックフレームであるからである。したがって、制御システムは、ノードSegmentInfo(A)およびSegmentInfo(B,D)を作成してこれら2つのノードをSegmentInfo(A,B,D)の子ノードに割り当てることによって、スタックセグメント(A,B,D)をスタックセグメント(A)とスタックセグメント
(B,D)とに分割してもよい。スタックトレース(A,C)については、制御システムは、ノードSegmentInfo(C)を作成することによってスタックセグメント(C)を初期化し、SegmentInfo(A)およびSegmentInfo(C)をスタックトレース(A,C)の分類シグネチャとして含む順序組を登録してもよい。
【0074】
いくつかの実施形態では、制御システムは、下記のように、SeasonalTrendInfo(A,B,D)オブジェクトをクローン作成して、ノードSegmentInfo(A)およびSegmentInfo(B,D)のSeasonalTrendInfo(A)オブジェクトおよびSeasonalTrendInfo(B,D)オブジェクトをそれぞれ作成し、SegmentInfo(C)の新しいSeasonalTrendInfo(C)を作成してもよい。
【0075】
SeasonalTrendInfo(A) <-SeasonalTrendInfo(A,B,D)
SeasonalTrendInfo(B,D) <-SeasonalTrendInfo(A,B,D)
SeasonalTrendInfo(C) <- new SeasonalTrendInfo
また、制御システムは、上記SegmentInfoノードを、以下のように更新してもよい。
【0076】
SegmentInfo(A).numOfOccur = 2
SegmentInfo(A).totalNumOfOccur = 3
SegmentInfo(C).numOfOccur = 1
SegmentInfo(C).totalNumOfOccur = 1
図5は、分類シグネチャ450と、スタックトレース(A,C)を初めて観測したことに応答して生成された新しい分類シグネチャ550とを含む、分類シグネチャ500のセットを示す図である。
図5から分かるように、ここで、分類シグネチャ450は、ノード402、ノード502、およびノード504という3つのノードを含む。ノード402は、SegmentInfo(A,B,D)に対応し、これは、ノード502およびノード504の結合ノードである。ノード502は、SegmentInfo(A)に対応し、スタックフレームa1~a3を結合する。ノード504は、SegmentInfo(B,D)に対応し、スタックフレームb1~d3を結合する。分類シグネチャ550は、スタックフレームa1~a3を結合するものとして示されるSegmentInfo(A)に対応するノード506、および、スタックフレームc1~c3を結合するものとして示されるSegmentInfo(C)に対応するノード508という2つのノードを含む。
【0077】
スレッドダンプN+2においてスタックトレース(A,B,E)が初めて観測された場合、制御システムは、スタックセグメント(B,D)内のスタックフレームのセット全体はもはや線形接続されていないと判断する。ここで、「B」で表されるスタックフレームのセットのうちの最後のスタックフレームと「D」で表されるスタックフレームのセットのうちの最初のスタックフレームとの間に分岐点が存在する。なぜならば、どのようなスタックトレースにおいても、最後のスタックフレームに続く次のスタックフレームは、(1)(D)のうちの最初のスタックフレーム、または(2)「E」で表されるスタックフレームのセットのうちの最初のスタックフレームであるからである。したがって、制御システムは、ノードSegmentInfo(B)およびSegmentInfo(D)を作成して、これら2つのノードをSegmentInfo(B,D)の子ノードに割り当てることによって、スタックセグメント(B,D)をスタックセグメント(B)とスタックセグメント(D)とに分割してもよい。スタックトレース(A,B,E)については、制御システムは、ノードSegmentInfo(E)を作成することによってスタックセグメント「E」を初期化し、SegmentInfo(A)、SegmentInfo
(B)、およびSegmentInfo(E)をスタックトレース(A,B,E)の分類シグネチャとして含む順序組を登録してもよい。
【0078】
いくつかの実施形態では、制御システムは、下記のように、SeasonalTrendInfo(B,D)オブジェクトをクローン作成して、ノードSegmentInfo(B)およびSegmentInfo(D)のSeasonalTrendInfo(B)オブジェクトおよびSeasonalTrendInfo(D)オブジェクトをそれぞれ作成し、SegmentInfo(E)の新しいSeasonalTrendInfo(E)を作成してもよい。
【0079】
SeasonalTrendInfo(B) <-SeasonalTrendInfo(B,D)
SeasonalTrendInfo(D) <-SeasonalTrendInfo(B,D)
SeasonalTrendInfo(E) <- new SeasonalTrendInfo
また、制御システムは、上記SegmentInfoノードを、以下のように更新してもよい。
【0080】
SegmentInfo(A).numOfOccur = 1
SegmentInfo(A).totalNumOfOccur = 4
SegmentInfo(B).numOfOccur = 1
SegmentInfo(B).totalNumOfOccur = 3
SegmentInfo(E).numOfOccur = 1
SegmentInfo(E).totalNumOfOccur = 1
図6は、分類シグネチャ450および550と、スタックトレース(A,B,E)に応答して生成された新しい分類シグネチャ650とを含む、分類シグネチャ600を示す図である。
図6から分かるように、ここで、分類シグネチャ450は、ノード402、ノード502、ノード504、ノード602、およびノード604という5つのノードを含む。ノード504は、SegmentInfo(B,D)に対応し、これは、ノード602とノード604との結合ノードである。ノード602は、SegmentInfo(B)に対応し、スタックフレームb1~b3を結合する。ノード604は、SegmentInfo(D)に対応し、これは、スタックフレームd1~d3の結合ノードである。分類シグネチャ550は変更されていない。分類シグネチャ650は、スタックフレームa1~a3を結合するものとして示されるSegmentInfo(A)に対応するノード606、スタックフレームb1~b3を結合するものとして示されるSegmentInfo(B)に対応するノード608、およびスタックフレームe1~e3を結合するものとして示されるSegmentInfo(E)に対応するノード610という3つのノードを含む。
【0081】
図6に示すように、スタックトレース(A,B,D)の分類シグネチャは、分類シグネチャ450の根にある1つのSegmentInfoノードから構成され得る。すなわち、強度が最も高いスタックトレースであるスタックトレース(A,B,D)は、最もコンパクトな表現を有する。一方では、スタックトレース(A,C)には、2つの順序ノード(A)および(C)を有する2番目に短い分類シグネチャが割り当てられている。最後に検出されたスタックトレース(A,B,E)には、3つの順序ノード(A)、(B)、および(E)を有する3番目に短い分類シグネチャが割り当てられている。
図4~
図6に示すように、ThreadClassificationInfoオブジェクトは、SegmentInfoノードからなる組に対応してもよく、1つのSegmentInfoノードは、その他のSegmentInfoノードおよび/またはその他のStackFrameInfoオブジェクトのセットからなる二分木(またはバイナリである部分木)を
参照してもよい。ThreadClassificationInfoオブジェクト、SegmentInfoノード、およびStackFrameInfoオブジェクトは、合わせて、生成文法を構成してもよい。
【0082】
Thread1 -> (A,B,D)
Thread2 ->(A)(C)
Thread3 ->(A)(B)(E)
(A,B,D) ->(A)(B,D)
(B,D) ->(B)(D)
A -> a1,a2,a3
B -> b1,b2,b3
C -> c1,c2,c3
D -> d1,d2,d3
E -> e1,e2,e3
上記から分かるように、個々のスタックフレームai、bi、ci、di、eiが文法の終端であるのに対して、SegmentInfoノードは、非終端である。いくつかの実施形態は、スタックトレースのスタックフレームを、スタックトレースの下から上に(下記の表記法において左から右の方向に)構文解析できる。
【0083】
a1,a2,a3,b1,b2,b3,d1,d2,d3
(A),b1,b2,b3,d1,d2,d3 生成規則(A)->a1,a2,a3を使用
(A),(B),d1,d2,d3 生成規則(B)->b1,b2,b3を使用
(A),(B),(D) 生成規則(D) -> d1,d2,d3を使用
(A),(B,D) 生成規則(B,D) -> (B)(D)を使用
(A,B,D) 生成規則(A,B,D) -> (A),(B,D)を使用
Thread1 生成規則Thread1 -> (A,B,D)を使用
上記から分かるように、いくつかの実施形態は、上向き構文解析によってスタックフレームを解析できる。上向き構文解析は、シフト還元構文解析または左から右への「LR」構文解析と同様であり得る。この解析には、木の葉から根に向かって解析を進めていくことによってスタックトレースの解析木を構成するために、スタックフレームおよびSegmentInfoノードをシフト還元することが必要になり得る。いくつかの実施形態は、スレッドのスタックトレースの先の出現についての解析木を合成し、別の出現のスレッドのスタックトレースを、同じ解析木に還元する(すなわち、シフト還元構文解析、左から右に読む「LR」構文解析)ことによって解析する。分類木の各ノードは、スタックトレースのクラスのコンパクトラベルで有り得、分類木の根は、スレッドのクラスのコンパクトラベルで有り得る。
【0084】
図7は、いくつかの実施形態に係る、スレッドダンプに応答して1つ以上のスレッド分類シグネチャを生成および/または変更するためのプロセスのフローチャート700である。いくつかの実施形態では、フローチャート700に示すプロセスは、1つ以上のプロセッサを有するコンピュータシステム(たとえば、
図17のコンピュータシステム1700)によって実施されてもよい。1つ以上のプロセッサが、コンピュータ読み取り可能な媒体に格納されたコンピュータコードに基づいてステップを実行できる。
図7に説明するステップは、その他のステップの有無を問わず、任意の順序で実行できる。
【0085】
フローチャート700は、ステップ702から始まる。ステップ702において、実施形態は、マルチスレッドプログラムの実行中にスレッドダンプを行う。具体的には、いくつかの実施形態は、マルチスレッドプログラムが動作するソフトウェア実行環境を監視する1つ以上の監視プロセスに対応してもよい。ソフトウェア実行環境は、当該マルチスレ
ッドプログラムを含む複数のマルチスレッドプロセスをサポートしてもよい。場合によっては、ソフトウェア実行環境は、スレッドダンプの出力をサポートする仮想マシンであってもよい。いくつかの実施形態では、1つ以上の監視プロセスが、マルチスレッドプログラムと並んで仮想マシン内で動作してもよい。いくつかの実施形態では、1つ以上の監視プロセスは、仮想マシンとは別に、同じセットのマシン上でまたは異なるセットのマシン上で動作してもよい。1つ以上の監視プロセスは、仮想マシンのスレッドダンプを定期的に開始してもよい。特定のスレッドダンプについては、当該特定のスレッドダンプが出力される時にマルチスレッドプログラムに代わって(たとえば、当該マルチスレッドプログラムによって生成される)動作しているスレッドごとにスタックトレースが取得されてもよい。
【0086】
ステップ704において、実施形態は、スレッドダンプ中に実行中であったスレッドごとにスタックトレースを受信する。特定のスレッドのスタックトレースは、スレッドのコールスタックを記述した1行以上のテキストに対応してもよい。スタックトレース内の各行は、スレッドのコールスタック上の特定のスタックフレームに対応し、当該スタックフレームに関するコードブロックを記述してもよい。いくつかの実施形態では、スタックフレームは、ソースコードファイルと、コードブロックを指し示す行番号と、コードブロックに関するクラス名および/またはメソッド名とを含んでもよい。
【0087】
判断706において、実施形態は、別のスタックトレースを解析する必要があるかどうかを判断する。必要がない場合、フローチャートは、ステップ716で終了する。具体的には、スレッドダンプのスタックトレースのすべてが1つ以上の監視プロセスによって解析されると、いくつかの実施形態は、1つ以上のオブジェクトによってメモリにカプセル化された強度統計データを更新してもよい。たとえば、スレッドダンプからどのような種類のスタックトレースが得られたかに基づいて、1つ以上のSeasonalTrendInfoオブジェクトのメンバ変数(たとえば、rawMeasure、rawDeseasonalizedMeasure、smoothedWeekdaySeasonalFactor、および/またはsmoothedWeekendSeasonalFactor)が更新されてもよい。
【0088】
別のスタックトレースを解析する必要があるかどうかを判断する必要がある場合、ステップ708において、実施形態は、存在するトレースシグネチャが、スタックトレースが含むスタックフレームのシーケンスを表すかどうかを判断する。具体的には、いくつかの実施形態は、前のスレッドダンプから受信したスタックフレームに基づいて作成された分類シグネチャの存在するセットを生成文法として使用して、スタックフレームのシーケンスが存在するシグネチャのうちの1つによって表され得るかどうかを判断してもよい。これは、スタックトレースの一部が葉SegmentInfoノードに折り畳まれ、SegmentInfoノード自体は結合ノードに折り畳まれる、1つ以上のシフト還元動作を必要としてもよい。分類シグネチャとして登録される順序組がシフト還元動作によってできた場合、その分類シグネチャが、スタックトレースが含むスタックフレームのシーケンスを表す。
【0089】
判断710において、このようなトレース(すなわち、分類)シグネチャが存在する場合、フローチャートは、ステップ714に進む。存在しない場合、ステップ712において、実施形態は、スタックトレースが含むスタックフレームのシーケンスを表す新しいトレースシグネチャを生成する。すなわち、線形接続されていると考えられていたスタックフレームのセット内に分岐点が発見される。次に、いくつかの実施形態は、1つ以上のSegmentInfoノードを生成し、1つ以上の二分木を変更し、および/または1つ以上の順序組を変更して、スタックトレースが含む(前に)線形接続されたスタックフレームのセットを表す新しい分類シグネチャを生成してもよい。新しい分類シグネチャを生
成する手法については、
図8を参照して以下にさらに詳細に説明する。
【0090】
ステップ714において、実施形態は、判断706に戻る前に、トレースシグネチャに関するカウンタをインクリメントする。具体的には、スタックトレース、スタックセグメント、およびスタックフレームが受信および発見されるときに、それらの数をその型によって追跡するために、ThreadClassificationInfoオブジェクト、SegmentInfoオブジェクト、および/またはStackFrameInfoオブジェクトのメンバ(たとえば、numOfOccurおよび/またはtotalNumOfOccur)である特定のカウンタがインクリメントされてもよい。
【0091】
図8は、いくつかの実施形態に係る、分岐点を検出することに応答してスレッド分類シグネチャを生成または変更するためのプロセスのフローチャート800である。いくつかの実施形態では、フローチャート800に示すプロセスは、1つ以上のプロセッサを有するコンピュータシステム(たとえば、
図17のコンピュータシステム1700)によって実施されてもよい。1つ以上のプロセッサが、コンピュータ読み取り可能な媒体に格納されたコンピュータコードに基づいてステップを実行できる。
図8に説明するステップは、その他のステップの有無を問わず、任意の順序で実行できる。
【0092】
フローチャート800は、ステップ802から始まる。ステップ802において、実施形態は、1つ以上のSegmentInfoノードが前に生成されているかどうかを判断する。生成されている場合、フローチャートは、ステップ804に進む。生成されていない場合、フローチャートは、ステップ814に進む。現在解析中のスタックトレースが、データセットについて受信された最初のスタックトレースでない限り、分類シグネチャのセットは、前のスタックトレースのために前に生成された、SegmentInfoノードを含む1つ以上の分類シグネチャを含んでいる可能性がある。同じプロセスから受信したスタックトレースの型はスタックセグメントを互いに共有している可能性があるので、初めて受信されたどの型のスタックトレースも、分岐点の発見につながる可能性がある。
【0093】
ステップ804において、実施形態は、前に生成されたノードによって表されないスタックトレースが含むスタックフレームのシーケンスに含まれる1つ以上のスタックフレームのサブシーケンスを決定する。具体的には、いくつかの実施形態は、スタックトレースが含むスタックフレームのシーケンスを一連のシフト還元動作によって圧縮しようとしながら、存在する分類シグネチャおよびSegmentInfoノードを調べてもよい。還元できないシーケンスのスタックフレームのサブシーケンスは、いずれも、新しい型のスタックセグメントであると判断されてもよい。この場合、いくつかの実施形態は、新しい型のスタックセグメントを表すSegmentInfoノードが生成される必要があると判断してもよい。
【0094】
ステップ806において、実施形態は、当該1つ以上のスタックフレームのサブシーケンスを表すための、1つ以上の追加ノードを生成してもよい。具体的には、新しい型のスタックセグメントに含まれるスタックフレームごとに新しいStackFrameInfoオブジェクトが生成されてもよい。新しい型のスタックセグメントに対応する新しいSegmentInfoノードが生成されてもよく、新しいSegmentInfoノードは、新しいStackFrameInfoオブジェクトの各々を参照する。
【0095】
ステップ808において、実施形態は、前に生成された1つ以上の組に含まれる、前に生成された1つ以上の二分木に、当該1つ以上の追加ノードのうちの少なくとも1つを合体させる。新しく発見された分岐点を考慮に入れるために、1つ以上の存在する分類シグネチャの1つ以上の二分木を変更および/または展開してもよい。存在する二分木の葉SegmentInfoノードによって表されるスタックセグメントが新しい分岐点によっ
て分割される場合、その葉ノードは、2つの新しい葉SegmentInfoノードの結合ノードになってもよい。
【0096】
ステップ810において、実施形態は、1つ以上の追加の二分木を生成する。1つ以上の二分木の少なくとも1つ以上は、1つ以上の追加のノードの少なくとも1つを含む。ほとんどの場合、1つ以上の追加の二分木は、1つのノードを有する単レベルの木であるだろう。新たに生成された二分木のうちの1つが、ステップ806において生成された新しいSegmentInfoノードを含んでもよい。
【0097】
ステップ812において、実施形態は、スタックトレースを表すための、当該1つ以上の追加の二分木を含む追加の組を生成する。この追加の組は、新たに発見された型のスタックトレースを表す分類シグネチャに対応してもよい。いくつかの組は、1つのノードを含み、かつ、ノードのリストに似た、単レベルの二分木の順序集合であってもよい。他の組は、1つの多レベルの二分木に対応してもよい。さらに別の組は、単レベルの二分木と多レベルの二分木との組合せを含んでもよい。一般に、より多くの型のスタックトレースが発見されるにつれ、生成される後続の分類シグネチャは、より長い順序組に対応し得る。しかしながら、共通型のスタックトレースのほうが最初に遭遇する可能性が高いので、長い分類シグネチャほど、あまり頻繁に発生しないスタックトレースを表す傾向にある。これによって、確実に、割合の高いスタックトレースほど、短い分類シグネチャに圧縮されることになるだろう。ステップ812の後、フローチャートは、ステップ820で終了する。
【0098】
ステップ814において、実施形態は、スタックトレースを表すための、1つのノードを含む1つの二分木を含む組を生成する。SegmentInfoノードが見つからないため、現在解析中のスタックトレースが最初のSegmentInfoノードであると思われる。その結果、いくつかの実施形態は、1つのSegmentInfoノードしか有さない1つの二分木に対応する分類シグネチャを生成してもよい。ステップ814の後、フローチャートは、ステップ820で終了する。今後、異なる型のスタックトレースに遭遇すると、二分木は、新しく遭遇した分岐点を表すために、新しいSegmentInfoノードを用いて展開されてもよい。
【0099】
IV.ヒープ使用量の不規則な間隔での測定
いくつかの実施形態は、制御システムに時系列データのヒープ割当て(すなわち、ヒープ使用量)を監視させて、トレンドを推定したり、将来の仮想マシン内のメモリ使用量を予測したりしてもよい。季節トレンドを検出して記憶容量要件を予測することによって、いくつかの実施形態は、共有システムメモリを仮想マシン間で動的に再割り当てすることができ、リソース割り当てを柔軟にすることができる。容量要件の予測には、ヒープの増加率の推定が必要である場合がある。標本の正確さを確実にするために、フルガベージコレクション(GC)サイクルの間にヒープ割当てを測定してもよい。GCサイクルは、不規則な間隔で発生する。ヒープ増加率の推定には、ランダム間隔による分割が必要である場合があり、断続的に気まぐれにゼロに近づく不規則な間隔により、複雑になっている。増加率の測定値におけるノイズは、コーシー分布をもたらす2つのガウス分布の割合であり、ガウス分布は、フィルタリングすることが難しい。多数のデータ点では、1つのデータ点よりも、平均および標準偏差を正確に推定できない、という意味では、コーシー分布の平均および標準偏差は未定義である。標本のプールが大きくなると、時間近接間隔による分割に対応する大きな絶対値を有する標本点に遭遇する可能性が上昇し得る。
【0100】
なお、フルGCサイクルの不規則性によって標本抽出間隔が不規則であるヒープサイズの測定値とは異なり、スレッド強度測定値は、一定の間隔で標本抽出され、時間近接間隔を回避できる。たとえそうであっても、本明細書において説明するヒープ割当てをトレン
ド把握するための手法と同じ手法を、スレッド強度およびスタックセグメント強度の測定を季節トレンド把握および予測することに適用できる。いくつかの実施形態では、この手法は、スレッドのCPUスケジューリングおよびフルGCサイクルの妨害による不定のレイテンシに合わせることができる。また、この手法は、スタックセグメントを分類するために必要な不定の計算時間による不定の標本抽出間隔にも合わせることができる。特定のスレッドまたはスタックセグメントがスレッドダンプにおいて観測されていない場合では、いくつかの実施形態は、関連するThreadClassificationInfoオブジェクトまたは関連するSegmentInfoオブジェクトのnumOfOccurメンバ変数をゼロのままにしてもよい。ゼロは、特定のスレッドまたはスタックセグメントについての測定値が利用可能ではないことを示し得る。このような実施形態は、SeasonalTrendInfoオブジェクトのrawMeasure変数を更新しなくてもよい。このような実施形態は、関連するThreadClassificationInfoオブジェクトまたは関連するSegmentInfoオブジェクトのnumOfOccurメンバ変数がゼロではない場合にのみ、SeasonalTrendInfoオブジェクトのrawMeasureメンバ変数を更新してもよい。このような実施形態は、rawMeasureが最後に更新されてからスレッドダンプの数「N」を追跡してもよい。スレッド強度測定値は、不規則な間隔を有する時系列に対応してもよい 。
【0101】
1957年および1960年に発表されたホルト・ウィンタース3重指数フィルタは、季節トレンド把握および予測のために用いることができる。C.C.ホルト(C.C.Holt)による「Forecasting Trends and Seasonal by Exponentially Weighted Averages(指数移動平均によるトレンドおよび季節の予測)」(海軍研究事務所覚書、第52号、1957年)が引用によって本明細書に援用される。P.R.ウィンタース(P.R.Winters)による「Forecasting Sales by Exponentially Weighted Moving Averages(指数加重移動平均による販売予測)」(Management Science第
6巻、第3号324頁~342頁、1960年)が引用によって本明細書に援用されている。ライト(Wright)は、不規則な間隔に対応するために1986年にホルト・ウィンタース法を拡張させた。D.J.ライト(D.J.Wright)による「Forecasting data published at irregular time intervals using an extension of Holt's method(ホルト法の拡張を用いた、不規則な時間間隔で公開されるデータの予測)」、(Management Science第32巻、第4号499頁~510頁、1986年)が引用によって本明細書に援用されている。2008年に、ハンザック(Hanzak)が時間近接間隔の調整因子を提唱した。T.ハンザック(T.Hanzak)による「Improved Holt Method for Irregular Time Series(不規則な時系列のために改良されたホルト法)」(世界科学データシステム(WDS)2008年予稿集(WDS’08 Proceedings)第1部、62頁~67頁、2008年)が引用によって本明細書に援用されている。
【0102】
率推定におけるランダムな時間近接間隔によってさらに高くなったノイズの相対強度を補償する時間近接間隔の調整因子は、メモリリークまたはデッドロックによって生じた輻輳の間に時間間隔が単調に減少した場合、変化率の推定を誤って鈍らせてしまう可能性がある。フルGCアルゴリズムの非線形または多項式時間計算量によって、輻輳が酷くなるにつれて、スレッドのランタイム間隔が小さくなってしまう可能性がある。メモリリークの場合、時間間隔が短くなると、ランタイムが短くなり得るが、測定時間は長くなり得る。なぜならば、フルGCがより頻繁に実行されることによって、仮想マシンがより長い間フリーズし得るからである。フルGCの間に仮想マシンがフリーズした場合、新しいリクエストは、仮想マシン外部の待ち行列に入れられていく可能性がある。後続のランタイムの間、バックログがヒープ使用量の変化率を加速させる可能性がある。いくつかの実施形態では、ハンザックの時間近接間隔の調整因子がヒープ割当てのトレンド把握および予測のために用いられて、加速するヒープ増加率が追跡される。
【0103】
本発明の実施形態では、ヒープ使用量の季節トレンド把握および予測にホルト・ウィンタース3重指数フィルタを適用して、柔軟なメモリ割り当てを効果的に実現することができる。規則的な時系列からの予測を要求するために適用され得る標準ホルト・ウィンタース3重指数フィルタは、不規則な時間近接間隔を有するランダム間隔で利用できるよう特別に調整することができる。本発明の実施形態は、不規則な間隔に対してライトの公式を適用し、ヒープ割当てのトレンド把握および予測のための時間近接間隔に対してハンザックの調整因子を適用することができる。フルGCによって生じた不規則な間隔に適したフィルタの構造の非自明な選択が行われ得る。ホルト・ウィンター・ライト・ハンザックフィルタの構造を第一原理から導出し、フルGCサイクルによって作り出された時系列に一致する適応を体系的に考案することができる。
【0104】
いくつかの実施形態では、ヒープメモリ使用量およびスレッド強度などのリソース利用量の測定値を監視および予測するために、指数平滑移動平均線を求める式を当てはめて時系列データ、局所的な線形トレンド、季節トレンド、予測の誤差残差、および予測の絶対偏差を平滑化する。いくつかの実施形態では、この式は、1956年に提唱されたブラウンの指数フィルタと、1957年に提唱されたホルトの2重指数フィルタと、1960年に提唱されたウィンタースの3重指数フィルタと、1986年に提唱されたライトの不規則な間隔のための拡張と、2008年に提唱されたハンザックの時間近接間隔の調整因子と、外れ値検出およびクリッピングとに基づき得る。下記の刊行物は、引用によって本明細書に援用されている。R.G.ブラウン(R.G.Brown)による「Exponential Smoothing for Predicting Demand(需要予測のための指数平滑法)」(ケンブリッジ、
アーサー・D・リトル株式会社(Arthur D. Little Inc.)、1956年)、15頁、C
.C.ホルトによる「Forecasting Trends and Seasonal by Exponentially Weighted Averages(指数移動平均によるトレンドおよび季節の予測)」(海軍研究事務所覚書、第52号、1957年)、P.R.ウィンタースによる「Forecasting Sales by Exponentially Weighted Moving Averages(指数加重移動平均による販売予測)」(Managem
ent Science第6巻、第3号324頁~342頁、1960年)、D.J.ライトによる「Forecasting data published at irregular time intervals using an extension of Holt's method(ホルト法の拡張を用いた、不規則な時間間隔で公開されるデータの予測)」(Management Science第32巻、第4号499頁~510頁、1986年)、T.ハンザックによる「Improved Holt Method for Irregular Time Series(不規則な時系列のために改良されたホルト法)」(世界科学データシステム(WDS)2008年予稿集(WDS’08 Proceedings)第1部、62頁~67頁、2008年)、S.マウン(S.Maung)、S.W.バトラー(S.W.Butler)、およびS.A.ヘンク(S.A.Henck)による「Method and Apparatus for process Endpoint Prediction based on Actual Thickness Measurements(実
際の厚み測定値に基づくエンドポイント予測を処理するための方法および装置)」(米国特許第5503707号、1996年)。
【0105】
V.スレッド強度とヒープ使用量との相関付け
様々な実施形態は、マルチスレッドアプリケーションによって生成された様々なスレッドのクラスの強度統計データとヒープ使用量統計データとの間でトレンドを相関させることによってアプリケーション内のヒープをため込んでいるスタックトレース(すなわち、スレッドのクラス)を特定するための手法を提供する。そうすることで、いくつかの実施形態は、ヒープ使用量統計データに基づいて、1つ以上のマルチスレッドアプリケーションがソフトウェア実行環境内で実行中の期間内で、高いヒープ使用量が大きい傾向にある季節(すなわち、ヒープ使用量が高い季節)を特定してもよい。上に説明したように、次に、いくつかの実施形態は、ヒープ使用量が高い季節と同じ期間にソフトウェア実行環境から取得したスレッドダンプの解析によって、複数のスレッドのクラスの強度統計データ
を特定および収集してもよい。次に、いくつかの実施形態は、特定されたクラスのスレッドの強度統計データとヒープ使用量が高いトレンドとの相関度合いによってスレッドのクラスをランク付けすることによって、特定されたクラスのスレッドの中から「ヒープをため込んでいる」スレッドのクラス(すなわち、ヒープをため込んでいるスタックトレース)を特定してもよい。
【0106】
いくつかの実施形態は、このようなスレッドのクラスを、ヒープをため込んでいると言ってもよい。なぜならば、このようなスレッドが実行しているコードは、ヒープメモリ使用量の点で非効率である確率が高いからである。言い換えると、これらのスレッドが実行する間違いの多いコードおよび/または最適化されていないコードは、スレッドが大量のヒープメモリをため込んでしまう原因となり得、ヒープ使用量が高いトレンドの大きな一因となる。
【0107】
なお、このようなメモリホットスポットは、クラウドベースのサービスを本番環境で長い間動作させるという観点から、重要である。したがって、このようなホットスポットの連続検出および軽減を可能にすることによって、いくつかの実施形態は、クラウドサービスの作動効率に直接影響を与えてもよい。また、このような実施形態は、このようなアプリケーションをプロファイルするためにメモリプロファイラツールを使用することよりも有利であり得る。なぜならば、このようなツールは、アプリケーションに過度のオーバヘッドを加え得るからである。したがって、メモリプロファイラツールは、本番環境で実行中のアプリケーションを常時プロファイリングするには実用的ではないだろう。
【0108】
A.コードにおける非効率なヒープ使用量
非効率なメモリ使用の一般的な原因の1つは、スレッドのスタックフレームにおいて定義されたローカル変数によるものである。一般に、実行中のスレッドがオブジェクトをインスタンス化した場合、そのオブジェクトは、ヒープメモリを、オブジェクトを(直接または間接的に)参照するスタックフレームの数がヒープメモリが次のガベージコレクションにおいて解放されるゼロになるまで、占有する。したがって、長い間稼働したままであるスタックフレームから大きなオブジェクトを参照するローカル変数は、ヒープメモリ使用量の大きな一因に意図せずになってしまう可能性がある。なぜならば、このようなローカル変数は、オブジェクトをガベージコレクションさせないからである。
【0109】
いくつかの実施形態は、総ヒープ使用量「G」バイトの端数「P」が、スレッドのクラス「C」に起因し得ると想定する。さらに、いくつかの実施形態は、このスレッドのクラス「C」間の平均ヒープ使用量(すなわち、スレッドあたりのヒープ使用量)が「М」バイトであると想定してもよい。この場合、「TC」が、スレッドのクラス「C」の予想スレッド数を示すとする。下記の関係によって、「TC」が得られる。「TC」は、統計的モデルにおいてスレッド強度として定義される。
【0110】
【0111】
ヒープをため込んでいるスレッドのクラスを特定することに応答して、特定の実施形態は、開発者、パフォーマンスエンジニア、およびその他の関係者に当該スレッドのクラスを伝えてもよい(たとえば、通知またはアラートによって)。その結果、このような型のスレッドに関連するコードは、詳細なコードレビューおよびコードプロファイリングの対象になり得る。場合によっては、特定の関連するスタックフレームが検査され得る。たとえば、調査は、ヒープをため込んでいるスレッドのスタックトレースに含まれるスタック
フレームを検査するために、ヒープ使用量が季節ピークに近いときの間にヒープダンプを出力することを必要としてもよい。このスタックフレームは、高いヒープ使用量の一因となっているオブジェクト(たとえば、大量のヒープメモリを占有するオブジェクト)を参照するローカル変数を含み得る。この種類のコード検査および最適化は、目視によるコードレビュー、自動コードレビュー、特定されたスレッドのプロファイリング、JIT(just-in-time)コンパイラ最適化、動的バイトコード注入、またはこれらの手法の組合せによって行われる。いくつかの実施形態では、ヒープをため込んでいるスレッドのクラスがその他の自動コード最適化ツールに伝えられ、これらのツールのコード最適化機能が利用されてもよい。
【0112】
いくつかの実施形態は、アプリケーションコードを自動的に設計し直すまたは書き換えて、アプリケーションコードのメモリ使用をより効率的なものにしてもよい。たとえば、いくつかの実施形態は、アプリケーションの挙動または正当性を変えないで、大きなオブジェクトをローカル変数がなるべく早く解放するように、コードを自動的に書き換えることができる。場合によっては、これは、ヒープをため込んでいるスレッドに含まれるコードパスの綿密な解析を必要としてもよい。
【0113】
たとえば、下記のコードを考える。
fileOS.write(buffer.toString().getBytes());
いくつかの実施形態は、ヒープをため込んでいるスレッドのスタックフレームに含まれるローカル変数によってbuffer、buffer.toString()、およびbuffer.toString().getBytes()という3つのオブジェクトが保持されているという理由で、上記コードがメモリ使用量に関して非効率であると判断され得る。具体的には、当該ローカル変数は、ファイルシステムコールにおいてスレッドがブロック状態である間にこれらの3つのオブジェクトがガベージコレクションされないようにする。
【0114】
いくつかの実施形態は、ファイルシステムコールにおいてスレッドがブロック状態である間にbufferおよびbuffer.toString()という少なくとも2つのオブジェクトがガベージコレクションされるように、コードを下記のように修正できる。
【0115】
【0116】
いくつかの実施形態は、中断を伴わない方法を用いて、ヒープをため込んでいるスタックトレースのスタックフレームを検査できる。
【0117】
B.平日期間および週末期間の季節因子の初期化
ヒープをため込んでいるスタックトレースを特定するために、いくつかの実施形態は、(1)実行環境のヒープ使用量統計データの季節トレンドを推定することによってヒープ使用量が高い季節を特定し、(2)1つ以上のスレッドのクラスの各々について、スレッドのクラスのスレッド強度統計データの季節トレンドを推定してもよい。規則的間隔または不規則な間隔のヒープ使用量統計データの季節トレンドおよびスレッド強度統計データの季節トレンドを決定するためのいくつかの手法が、特許出願第14/109,578号、第14/109,546号、および第14/705,304号に記載されている。これ
らの出願は、あらゆる目的のために、引用により本明細書に援用する。
【0118】
統計データの季節トレンドを決定するために、この季節トレンドが対応付けられる期間および間隔が定義されてもよい。具体的には、1つの期間は複数の重複しない間隔に分割することができる。期間の各間隔は、1つの季節指数に関連付けられ得る。たとえば、期間が1日であり、間隔が1時間である場合、この期間を含むために24個の季節指数があるはずである。別の例として、期間が1年であり、間隔が1月である場合、12個の季節指数があるはずである。
【0119】
いくつかの実施形態は、平日、週末、および祝祭日を別々の期間としてモデル化することができる。平日期間と週末期間とが分けられている場合、5つの連続した平日期間の後に1つの週末期間が処理されるように、5サイクルの平日期間に対して1サイクルの週末期間を交互配置することができる。したがって、当該連続した平日期間の頻度は、24時間ごとに1つの平日期間であり、週末期間の頻度は、7日ごとに1つの週末期間である。個々の祝祭日(たとえば、クリスマス祭日および元日)が別々の期間としてモデル化される実施形態では、特定の祝祭日期間の頻度は、1年に1回である。
【0120】
季節指数は、乗法季節因子、または、季節指数に関連付けられた間隔に適用される追加季節期間であり得る。たとえば、乗法季節因子を用いて季節指数を表す実施形態では、「午前9時~午前10時」という間隔が1.3という季節因子に関連付けられる場合、午前9時~午前10時という間隔の間に標本抽出された測定値は、いずれも30%高くなるように調整される(すなわち、1.3を乗算される)。季節指数が追加季節期間によって表される実施形態では、追加季節期間が測定値に加えられる。
【0121】
季節は、間隔のセットをある基準によって分類する。たとえば、1年という期間を考えると、1月、2月、3月、4月、5月、6月、7月、8月、9月、10月、11月、および12月という12個の間隔は、下記のように4つの北部気象季節に分類できる。
【0122】
12月、1月、および2月は、冬の季節として分類される。
3月、4月、および5月は、春の季節として分類される。
【0123】
6月、7月、および8月は、夏の季節として分類される。
9月、10月、および11月は、秋の季節として分類される。
【0124】
いくつかの実施形態は、平日期間を96個の15分間隔に分割してもよい。この点については、96個の季節指数が導出される。ここで、96個の平日季節指数(すなわち、平日因子)の各々は、96個の平日間隔のうちの異なる1つに対応付けられる。同様に、いくつかの実施形態は、週末期間を192個の15分間隔に分割してもよい。これによって、192個の季節指数が導出され、192個の週末季節指数(すなわち、週末因子)の各々は、192個の週末間隔のうちの異なる1つに対応付けられる。
【0125】
平日期間の季節パターンと週末期間の季節パターンとを分けるために、特定の実施形態は、多期間トレンド把握フィルタを平日期間に適用することと、このようなフィルタを週末期間に適用することとを分けて行ってもよい。次に、いくつかの実施形態は、1という季節因子が平日期間および週末期間に共通の基準レベルを表すように、平日因子および週末因子をくりこんでもよい。その結果、1よりも大きい季節因子は、季節因子が適用される期間の間の、平均よりも高いヒープ使用量を表してもよい。一方では、1よりも小さい別の季節因子は、当該別の季節因子が適用される別の期間の間の、平均よりも低いヒープ使用量を表してもよい。
【0126】
いくつかの実施形態では、多期間トレンド把握の手法を展開して、祝祭日(たとえば、労働者の日、クリスマス祭日、元日など)を別々の期間として分けることができる。ここで、祝祭日の期間は、12か月に1回という頻度で繰り返す。一方では、平日期間は、24時間に1回という頻度で繰り返し、週末期間は、7日に1回という頻度で繰り返す。このような実施形態では、1という季節因子が平日期間、週末期間、および祝祭日期間に共通の基準レベルを表すように、祝祭日期間の季節因子、平日期間の季節因子、および週末期間の季節因子のすべては、ともにくりこまれてもよい。
【0127】
期間(たとえば、平日期間、週末期間、または祝祭日期間/1年という期間など)を考えると、Pが、所与の測定データセット(たとえば、特定の期間にまたがるヒープ使用量の測定値の時系列)に含まれる期間のサイクル数を示し、Kが、当該所与のデータセットに含まれる期間の数に含まれる間隔の数を示す。Lが1つの期間における季節指数の数を示す場合、K=P×Lとなる。たとえば、データセット内に少なくとも3年分のデータがあり、1つの期間が1年に対応し、1つの間隔が1月に対応する場合、この期間のサイクルの数Pは、3つあり、月単位の間隔の数は、36個ある。
【0128】
【0129】
具体的には、特定の間隔の季節因子は、データセット全体に対するその間隔の平均ヒープ使用量(データセット全体(たとえば、まる一週間にまたがるデータセット)における
すべての同じ間隔(たとえば、すべての午前9時~午前10時の間隔)の平均ヒープ使用量、およびデータセット全体の期間の平均ヒープ使用量を平均することによって算出される。)の割合に等しくてもよい。
【0130】
C.くりこみ
上述したように、いくつかの実施形態は、「1」という季節因子が平日期間および週末期間に共通の基準レベルを表すように、平日季節因子および週末季節因子をくりこんでもよい。
【0131】
一般に、特定の実施形態は、すべての期間にわたる季節因子の加重平均を計算し、季節因子の各々を加重平均で除算することによってくりこみを行ってもよい。異なる長さの複数の期間の季節指数を必要とする下記の例を考える。ここで、各期間は、15分間隔に分割されている。
【0132】
平日の季節指数:Di、i=1,2,…96
週末の季節指数:Ei、i=1,2,…,192
10個の祝祭日の季節指数:Hk,i、i=1,2,…,96;k=1,2,…10
特定の年において、253日の平日(祝祭日を除く)と、50.5日の週末と、10日の祝祭日があるとする。253+50.5×2+10=364日である。この例において、いくつかの実施形態は、下記の式を用いて、季節因子の加重平均「A」を算出してもよい。ここで、重みは、1年における各期間(たとえば、平日期間、週末期間、および10個の祝祭日期間)のサイクルの数に比例する。
【0133】
【0134】
いくつかの実施形態は、各季節因子Di、Ei、およびHk,iをAで除算することによって、期間ごとの新しいくりこみ季節因子を導出できる。
【0135】
【0136】
平日季節因子および週末季節因子のくりこみの後、1という季節因子は、平日因子および週末因子に共通の基準レベルを表すはずである。
【0137】
D.平滑化スプラインフィット
上述したように、いくつかの実施形態は、複数の期間にわたって平滑化スプラインをフィットさせて、1つの期間のサイクル間(たとえば、2つの平日期間の間)または2つの隣接する期間のサイクル間(たとえば、平日期間と週末との間)の遷移を平滑にしてもよ
い。具体的には、スプラインをフィットさせることには、1つ以上の期間の季節指数を連結してこれらの期間の間の遷移を円滑にすることが必要になり得る。
【0138】
一般に、月曜日から火曜日、火曜日から水曜日、水曜日から木曜日、および木曜日から金曜日への遷移において平日サイクルを繰り返す時など、特定の実施形態(たとえば、フィルタ)が期間Aiの1つサイクルの終わりに到達し、期間Aiの新しいサイクルを開始する時、このような実施形態は、季節指数Aiの3つのシーケンスを連結し、平滑化スプラインを全体シーケンスの端から端までフィットさせることができる。次に、いくつかの実施形態は、平滑化後のシーケンスの中間セグメントを取って、新しい平滑化後の季節指数Aiを表してもよい。
【0139】
金曜日から土曜日に遷移する時など、特定の実施形態(たとえば、フィルタ)が期間Aiの1つのサイクルの終わりに到達し、隣接する期間Biの新しいサイクルを開始する時、いくつかの実施形態は、季節指数Aiの1つのシーケンスと、季節指数Biの1シーケンスと、期間Biに続く期間の季節指数Ciのシーケンスとを連結して、平滑化スプラインを全体シーケンスの端から端までフィットさせてもよい。次に、いくつかの実施形態は、平滑化後のシーケンスの中間セグメントを取って、新しい平滑化後の季節指数Biを表してもよい。また、いくつかの実施形態は、平滑化後のシーケンスの第1セグメントを取って、平滑化後の季節指数Aiを表してもよい。
【0140】
日曜日から月曜日に遷移する時など、特定の実施形態(たとえば、フィルタ)が期間Biの1つのサイクルの終わりに到達し、隣接する期間Ciの新しいサイクルを開始するとき、いくつかの実施形態は、期間Biに先行する期間の季節指数Aiの1つのシーケンスと、季節指数Biの1つのシーケンスと、季節指数Ciの1つのシーケンスとを連結して、平滑化スプラインを全体シーケンスの端から端までフィットさせることができる。次に、いくつかの実施形態は、平滑化後のシーケンスの中間セグメントを取って、新しい平滑化後の季節指数Biを表してもよい。また、いくつかの実施形態は、平滑化後のシーケンスの第3セグメントを取って、新しい平滑化後の季節指数Ciを表してもよい。
【0141】
クラウドサービスに関して、週末および祝祭日の間の負荷サイクルは、平日の間の負荷サイクルとは異なる場合が多い。従来の季節トレンド把握による解決法では、通常、季節指数の1つの期間だけが表されるだろう。週末の季節指数を通常の平日の季節指数と分けるために、このような従来の解決法は、期間の範囲をまる1週間、または、まる1か月に延ばすことに応じて異なるだろう。これに加えて、このような従来の解決法は、祝祭日を別々に扱うだろう。
【0142】
ヒープをため込んでいるスタックトレースを特定するためのステップに戻ると、平日季節因子を平滑化するために、いくつかの実施形態は、平日因子の3つのシーケンスを連結することによって、季節因子の配列を構成することができる。たとえば、いくつかの実施形態は、下記のRプログラミング言語のコードを実行することによって、当該配列を生成してもよい。
【0143】
factors <- c(smoothedWeekdaySeasonalFactor,
smoothedWeekdaySeasonalFactor,
smoothedWeekdaySeasonalFactor)
次に、いくつかの実施形態は、スプラインを適用して平日因子の配列を平滑化してもよい。たとえば、いくつかの実施形態は、0.3という平滑化パラメータを用いてR言語のsmooth.spline関数を呼び出して、当該因子を平滑化してもよい。
【0144】
extendedWeekdayIndices <- 1:(3 * 96)
f <- smooth.spline(extendedWeekdayIndices, factors, spar = 0.3)
次に、いくつかの実施形態は、配列内の中間シーケンス(すなわち、中間の96個の平日因子)を、平滑化後の平日因子として指定してもよい。たとえば、いくつかの実施形態は、下記のRプログラミング言語のコードを実行することによって、当該平滑化後の平日因子を取得してもよい。
【0145】
sandwichWeekdayIndices <- (96 + 1):(96 * 2)
smoothedWeekdaySeasonalFactor <- predict(f, sandwichWeekdayIndices)$y
平日因子を平滑化する方法と同様のやり方で、いくつかの実施形態は、スプラインを適用して週末因子を平滑化してもよい。具体的には、いくつかの実施形態は、平日因子の2つのシーケンスの間に週末因子のシーケンスを連結することによって、季節因子の配列を構成することができる。たとえば、いくつかの実施形態は、下記のRプログラミング言語のコードを実行することによって、この配列を生成してもよい。
【0146】
factors <- c(smoothedWeekdaySeasonalFactor,
smoothedWeekendSeasonalFactor,
smoothedWeekdaySeasonalFactor)
次に、いくつかの実施形態は、スプラインを適用して平日因子と週末因子との配列を平滑化してもよい。たとえば、いくつかの実施形態は、0.3という平滑化パラメータを用いてR言語のsmooth.spline関数を呼び出して、これらの因子を平滑化してもよい。
【0147】
extendedWeekendIndices <- 1:(2 * 96 + 192)
f <- smooth.spline(extendedWeekendIndices, factors, spar = 0.3)
次に、いくつかの実施形態は、配列内の中間シーケンス(すなわち、週末因子である、配列内の中間の192個の季節因子)を、平滑化後の週末因子として指定してもよい。たとえば、いくつかの実施形態は、下記のRプログラミング言語のコードを実行することによって、平滑化後の週末因子を取得してもよい。
【0148】
sandwichWeekendIndices <- (96 + 1):(96 + 192)
smoothedWeekendSeasonalFactor <- predict(f, sandwichWeekendIndices)$y
なお、いくつかの実施形態は、平日の間に観測された季節パターンを週末の間に観測された季節パターンから切り離すために、96個の平日季節指数と192個の週末季節指数とを別々に表してもよい。いくつかの実施形態では、ヒープ使用量統計データの時系列を逐次フィルタリングするには、ヒープ使用量の測定値のための指数フィルタと、季節因子のための指数フィルタと、線形トレンドのための指数フィルタと、加速トレンドのための指数フィルタと、残差のための指数フィルタとを含む、指数フィルタの5つのセットが必要になり得る。
【0149】
上述したように、標本の正確さを確実にするために、不規則な間隔で発生するフルガベージコレクション(GC)サイクルの間に、ヒープ割当てが測定されてもよい。ヒープ使用量が特に高い状況では、絶え間ないガベージコレクションにより、標本抽出間隔は、気まぐれにゼロに近くなってしまうだろう。予測には変化率の推定が必要であるので、この不規則な間隔が気まぐれにゼロに近づくと、変化率は、平均および標準偏差が未定義であるコーシー分布の確率変数になる可能性がある。したがって、いくつかの実施形態は、ホルトの2重指数フィルタ、ウィンタースの3重指数フィルタ、ライトの不規則な間隔のための拡張、ハンザックの時間近接間隔の調整因子、外れ値の検出および外れ値のカットオフの適応型スケーリングの適応を伴うクリッピングを採用して、フルGCに関連付けて決定された統計データの季節トレンドを決定するためにコーシー分布問題を克服してもよい。いくつかの実施形態では、この指数フィルタの5つのセットを時系列に対して逐次適用
して、平日因子および週末因子を推定することができる。
【0150】
【0151】
各期間の終わりの後、いくつかの実施形態は、スプラインを適用して季節因子を平滑化してもよい。たとえば、別の平日期間に先行する平日期間の終わりに到達(すなわち、月曜日から火曜日に、火曜日から水曜日に、水曜日から木曜日に、または木曜日から金曜日に遷移)した場合、いくつかの実施形態は、平日因子の3つのシーケンスを連結することによって、季節因子の配列を構成することができる。たとえば、いくつかの実施形態は、下記のRプログラミング言語のコードを実行することによって、当該配列を生成してもよい。
【0152】
factors <- c(smoothedWeekdaySeasonalFactor,
smoothedWeekdaySeasonalFactor,
smoothedWeekdaySeasonalFactor)
次に、いくつかの実施形態は、スプラインを適用して平日因子の配列を平滑化してもよい。たとえば、いくつかの実施形態は、0.3という平滑化パラメータを用いてR言語のsmooth.spline関数を呼び出して、当該因子を平滑化してもよい。
【0153】
extendedWeekdayIndices <- 1:(3 * 96)
f <- smooth.spline(extendedWeekdayIndices, factors, spar = 0.3)
次に、いくつかの実施形態は、配列内の中間シーケンス(すなわち、中間の96個の平日因子)を、平滑化後の平日因子として指定してもよい。たとえば、いくつかの実施形態は、下記のRプログラミング言語のコードを実行することによって、当該平滑化後の平日因子を取得してもよい。
【0154】
sandwichWeekdayIndices <- (96 + 1):(96 * 2)
smoothedWeekdaySeasonalFactor <- predict(f, sandwichWeekdayIndices)$y
別の場合では、週末期間に先行する平日期間の終わりに到達(すなわち、金曜日から土曜日に遷移)した場合、いくつかの実施形態は、週末季節因子のシーケンスを平日季節因子の2つのシーケンスの間に連結することによって、季節因子の配列を構成できる。たとえば、いくつかの実施形態は、下記のRプログラミング言語のコードを実行することによって、当該配列を生成してもよい。
【0155】
factors <- c(smoothedWeekdaySeasonalFactor,
smoothedWeekendSeasonalFactor,
smoothedWeekdaySeasonalFactor)
次に、いくつかの実施形態は、スプラインを適用して平日因子および週末因子の配列を平滑化してもよい。たとえば、いくつかの実施形態は、0.3という平滑化パラメータを用いてR言語のsmooth.spline関数を呼び出して、当該因子を平滑化しても
よい。
【0156】
extendedWeekendIndices <- 1:(2 * 96 + 192)
f <- smooth.spline(extendedWeekendIndices, factors, spar = 0.3)
次に、いくつかの実施形態は、配列内の左側シーケンス(すなわち、平日因子である、配列内の最初の96個の季節因子)を、平滑化後の平日因子として指定してもよい。たとえば、いくつかの実施形態は、下記のRプログラミング言語のコードを実行することによって、平滑化後の平日因子を取得してもよい。
【0157】
leftsideWeekendIndices <- 1:96
smoothedWeekdaySeasonalFactor <- predict(f, leftsideWeekendIndices)$y
別の場合では、週末期間の終わりに到達(すなわち、日曜日から月曜日に遷移)した場合、いくつかの実施形態は、週末季節因子のシーケンスを平日季節因子の2つのシーケンスの間に連結することによって、季節因子の配列を構成することができる。たとえば、いくつかの実施形態下記のRプログラミング言語のコードを実行することによって、当該配列を生成してもよい。
【0158】
factors <- c(smoothedWeekdaySeasonalFactor,
smoothedWeekendSeasonalFactor,
smoothedWeekdaySeasonalFactor)
次に、いくつかの実施形態は、スプラインを適用して平日因子および週末因子の配列を平滑化してもよい。たとえば、いくつかの実施形態は、0.3という平滑化パラメータを用いてR言語のsmooth.spline関数を呼び出して、当該因子を平滑化してもよい。
【0159】
extendedWeekendIndices <- 1:(2 * 96 + 192)
f <- smooth.spline(extendedWeekendIndices, factors, spar = 0.3)
次に、いくつかの実施形態は、配列内の中間シーケンス(すなわち、週末因子である、配列内の中間の192個の季節因子)を、平滑化後の週末因子として指定してもよい。たとえば、いくつかの実施形態は、下記のRプログラミング言語のコードを実行することによって、平滑化後の週末因子を取得してもよい。
【0160】
sandwichWeekendIndices <- (96 + 1):(96 + 192)
smoothedWeekendSeasonalFactor <- predict(f, sandwichWeekendIndices)$y
また、いくつかの実施形態は、配列内の右側シーケンス(すなわち、平日因子である、配列内の最後の96個の季節因子)を、平滑化後の平日因子として指定してもよい。たとえば、いくつかの実施形態は、下記のRプログラミング言語のコードを実行することによって、平滑化後の平日因子を取得してもよい。
【0161】
rightsideWeekendIndices <- (96 + 192+ 1):( 2 * 96 + 192)
smoothedWeekdaySeasonalFactor <- predict(f, rightsideWeekendIndices)$y
なお、いくつかの実施形態は、シーケンシャルフィルタが(1)期間の1つのサイクルの終わりに到達して、同じ期間の新しいサイクルを開始する(たとえば、シーケンシャルフィルタが月曜日の終わりに到達する)、または、(2)期間の1つのサイクルの終わりに到達して、隣接する期間の新しいサイクルを開始する(たとえば、シーケンシャルフィルタが金曜日の終わりに到達する)たびに、上述のくりこみおよび平滑化スプラインフィットを実行してもよい。
【0162】
E.季節サイクルの検定
いくつかの実施形態は、データセットの1つ以上の候補期間に季節サイクルが存在する
かどうかを検定して、この期間の季節指数の別のシーケンスが表されるべきかどうかを判断できる。一般に、データセットが特定の期間の季節サイクルを示しているかどうかを判断するために、いくつかの実施形態は、下記のステップを実行してもよい。
【0163】
Qが1つの期間における季節指数の数を示し、Pが1つの期間にあるサイクルの数を示し、Kが1つの期間のサイクル中にある間隔の数を示し、K=P×Qが成り立つとする。
【0164】
いくつかの実施形態は、1つの期間のサイクルの各間隔における平均測定値を算出できる。そうするために、いくつかの実施形態は、これらの間隔を0から(K-1)まで列挙し、以下の式を用いて、期間の各間隔の平均測定値を算出してもよい。
【0165】
【0166】
次に、いくつかの実施形態は、この期間の各サイクルの平均測定値を算出できる。そうするために、いくつかの実施形態は、この期間のサイクルを0から(P-1)まで列挙し、以下の式を用いて、期間の各サイクルの平均測定値を算出してもよい。
【0167】
【0168】
次に、いくつかの実施形態は、帰無仮説検定を適用して、期間に季節サイクルが存在するかどうかを見つけることができる。この点については、検定される帰無仮説は、直近のサイクル「u」の季節指数と先行のサイクル「v」の季節指数との間の相関係数ru,vがゼロであるという想定に対応してもよい。具体的には、いくつかの実施形態は、下記の式を用いて、相関係数ru,vを決定してもよい。
【0169】
【0170】
いくつかの実施形態は、様々な手法を採用して、相関係数ru,vがサイクル「u」と「v」との間に共通の季節サイクルがあることを、有意水準を上回って示すのに十分な大きさであるかどうかを判断してもよい。たとえば、いくつかの実施形態は、スチューデントのt検定、順列検定、またはフィッシャー変換を採用してもよい。
【0171】
仮説を検定するために、いくつかの実施形態は、1つ以上の検定統計量を定義してもよい。検定統計量は、パラメータを変数とする関数であってもよい。この場合、相関係数ru,vが検定される。下記の検定統計量tは、自由度が「n-2」のスチューデントのt分布を有し、ru,vを変数とする関数である。いくつかの実施形態は、帰無仮説ru,v=0を定義する。これは、1つの期間のサイクル間で季節指数が相関関係にないことを想定する。いくつかの実施形態は、対立仮説を受け入れることによって、帰無仮説(すなわち、ru,v=0)を棄却するための証拠を探してもよい。
【0172】
【0173】
F(t)が、確率分布を示すとする。有意水準が0.1であるとすると、F(t)=0.9が成り立つような確率変数tの値をt0.9,(n-2)が示すとする。対立仮説は、偏った条件である。
【0174】
【0175】
この条件が真である場合、対立仮説は採択される。これは、年のサイクル「u」と「v」との間に共通の季節サイクルがあることを示す。直近のサイクルとそれより前のサイクルとの間に共通する季節サイクルがある場合、いくつかの実施形態は、サイクルの季節指数ごとの季節因子の計算に取りかかってもよい。いくつかの実施形態は、上記式を適用して、後述するように、ソフトウェア実行環境によるヒープ使用量の年間季節サイクルの存在を検出してもよい。
【0176】
F.ヒープ使用量の年間季節サイクルの検出
ソフトウェア実行環境の複数年のヒープ使用量統計データを解析する際、いくつかの実施形態は、それぞれ異なる時間尺度で2つ以上の季節トレンドを検出してもよい。たとえば、このような実施形態は、ヒープ使用量統計データの複数年分の時系列、年ごとの季節トレンド、および1日の季節トレンドを検出してもよい。1年の季節トレンド、および1日の季節トレンドは、多季節トレンドに重ねられる。したがって、いくつかの実施形態は、1年の季節トレンドを解析するために適切な時間尺度を取り入れてもよい。この時間尺度は、1年に対応する期間と、1か月に対応する間隔とを有する。このように、1年という期間が12個の1か月という長さの間隔に分割されてもよい。
【0177】
データセットが年間季節サイクルを示すかどうかを判断するために、いくつかの実施形態は、まず、データセットに含まれる月次指数の乗法因子を決定してもよい。
【0178】
具体的な場合では、Pが、データセットにある年の数(すなわち、1年間のサイクル数)を示すとする。これに加えて、Qが、データセットにある月の数(すなわち、サイクル数内の間隔の数)を示すとする。したがって、Q=12×Pが成り立つ。Kが、データセットにある平日または週末の数を示すとする。これらの平日または週末の列挙を表すために、指数kの範囲は、0から(K-1)までとする。Nkがk番目の平日または週末における標本の数を示すとする。下記の式を用いて、いくつかの実施形態は、下記の式を適用して、データセットに含まれる各平日または週末の平均ヒープ使用量を算出できる。
【0179】
【0180】
いくつかの実施形態は、関数Hを次のように定義できる。H:(年×整数)→指数。これは、年の指数と、その年のある平日または週末の指数に対応する整数とを含む順次対を対応付ける。下記の式を用いて、次に、いくつかの実施形態は、毎年の平均ヒープ使用量を、その年の平日または週末の平均ヒープ使用量から算出してもよい。
【0181】
【0182】
いくつかの実施形態は、関数Gを次のように定義できる。G:(月×整数)→指数。これは、月の指数と、その月のある平日または週末の指数に対応する整数とを含む順次対を対応付ける。下記の式を用いて、いくつかの実施形態は、期間の各月間隔の平均ヒープ使用量を、その月の平日または週末の平均ヒープ使用量から算出してもよい。
【0183】
【0184】
月次指数の乗法因子を判断した後、いくつかの実施形態は、帰無仮説検定を適用して、年間季節サイクルがあるかどうかを見つけることができる。この点については、検定される帰無仮説は、直近の年「u」の月次指数とその前の年「v」の月次指数との間の相関係数ru,vがゼロであるという想定に対応してもよい。具体的には、いくつかの実施形態は、下記の式を用いて、相関係数ru,vを決定してもよい。
【0185】
【0186】
いくつかの実施形態は、様々な手法を採用して、相関係数ru,vが年「u」と「v」との間に共通の季節サイクルがあることを、有意水準を上回って示すのに十分な大きさであるかどうかを判断してもよい。たとえば、いくつかの実施形態は、スチューデントのt検定、順列検定、またはフィッシャー変換を採用してもよい。
【0187】
帰無仮説が真(すなわち、ru,v=0)である場合、下記の検定統計量tは、自由度が「n-2」のスチューデントのt分布を有する。
【0188】
【0189】
F(t)が、確率分布を示すとする。有意水準が0.1であるとすると、F(t)=0.9が成り立つような確率変数tの値をt0.9,(n-2)が示すとする。対立仮説は、偏った条件である。
【0190】
【0191】
対立仮説を採択する条件では、年「u」と「v」との間に共通の季節サイクルがあることが示される。
【0192】
G.年間ヒープ使用量が高い季節の決定
直近の年とそれより前の年との間に共通の季節サイクルがあると判断された場合、いくつかの実施形態は、下記の式を採用することによって、月次季節指数0~11によって列挙された月ごとの季節因子を計算できる。
【0193】
【0194】
なお、上記再帰法には、未束縛変数sが必要である。未束縛変数sは、繋がりを断つために使用され得る。いくつかの実施形態では、デフォルトで、s=1である。
【0195】
特定の実施形態では、季節指数の閉包Vは、年間ヒープ使用量が高い季節を分類する。閾値Tは、季節因子の範囲の85パーセントなど、パーセントに設定され得る。たとえば、1年という期間における12個の月々の季節指数の季節因子は、下記の表の通りであるとする。
【0196】
【0197】
乗法季節因子の範囲は、(1.34-0.76)であり、0.58である。したがって、季節因子の範囲の85パーセントは、(0.76+0.85×0.58)であり、1.253である。この85パーセントを閾値Tに与えると、T=1.25である。その結果、このような実施形態は、5月、6月、および7月を、年間ヒープ使用量が高い季節として分類するだろう。
【0198】
いくつかの実施形態は、1年という期間の直近のサイクルにまたがるデータセットのセグメントを選択できる。たとえば、2013年、2014年、2015年、および2016年というサイクルの中から、このような実施形態は、2015年~2016年を含んだデータのセグメントを選択してもよい。選択されたデータセグメントは、年間ヒープ使用量が高い季節内の2週間分以上のヒープ使用量統計データにまたがり得る。たとえば、季節因子が下記の表の通りである場合、データセグメントは、2015年11月、2015年12月、および2016年1月から選択することができる。
【0199】
【0200】
H.フィルタ定数および時間帯オフセットを求めるための回帰
いくつかの実施形態は、時間帯オフセットの推定を含めることができる。時間帯オフセットが利用できない場合、いくつかの実施形態は、データセットのセグメントに対して非線形回帰を行って時間帯オフセットを推定し、この時間帯オフセットを用いてデータをフィルタリングすることができる。時間帯オフセットの推定を提供することによって、いくつかの実施形態は、期間の間の遷移における季節指数の推定を向上させることができる。
【0201】
具体的には、いくつかの実施形態は、measureFilterConstant α、rateFilterConstant β、accelerationFilterConstant κ、seasonalFactorFilterConstant
γ、errorResidualFilterConstant δ、およびtimeZoneOffset tzというフィルタ定数(すなわち、独立変数である回帰パラメータ)を用いて非線形回帰を行い、1ステップ予測の残差の平均二乗誤差(MSE)および/または平均絶対偏差(MAD)を最小化できる。いくつかの実施形態では、タイムスタンプは、回帰において、時間帯オフセットtzだけずらされてもよい。いくつかの実施形態は、最適化ルーチン(たとえば、Rプログラミング言語が提供する最適ルーチン)を用いて、非線形多変量回帰を適用してもよい。いくつかの実施形態は、このような実施形
態が採用する下記の式に示すα、β、κ、γ、δ、およびtzの最適値を用いて、平日季節因子および週末季節因子を導出してもよい。
【0202】
【0203】
いくつかの実施形態は、期間のサイクル間または2つの隣接する期間の間の遷移ができるだけ正確になるように、時間帯オフセットを回帰パラメータとして含む。
【0204】
I.相関度合いによるスレッドのクラスのランク付け
年間ヒープ使用量が高い季節が決定されると、いくつかの実施形態は、最近(たとえば、直近)の年間ヒープ使用量が高い季節に含まれる日ごと/週ごとの季節サイクルを表す平日因子/週末因子を算出および/または取得してもよい。なお、データセットのこのセグメントにおける(すなわち、年間ヒープ使用量が高い季節の間の)日ごと/週ごとの季節サイクルは、ほか(すなわち、年間ヒープ使用量が高い季節以外)の時よりも顕著であるだろう。したがって、1つ以上のスレッドのクラスのヒープ使用量における季節トレンドと強度統計データにおける季節トレンドとの相関度合いの判断は、データセットのこのセグメントに基づき得る。言い換えると、相関分析のために、いくつかの実施形態は、直近の年間ヒープ使用量が高い季節に含まれる間隔と同じ間隔を用いて、様々なスレッドのクラスの季節トレンドを導出できる。
【0205】
なお、特定のスレッドのクラスの強度統計データの季節トレンドを決定するために、いくつかの実施形態は、上述したような、ヒープ使用量における季節トレンドを決定するために使用された手法を採用してもよい。すなわち、スレッド強度統計データおよびヒープ使用量統計データの季節トレンド把握には、平日期間および週末期間に同じ数の季節指数(たとえば、1つの平日期間に対して96個の季節指数、1つの週末期間に対して192個の季節指数)を使用することが必要になってもよい。
【0206】
1つ以上のスレッドのクラスのヒープ使用量の季節トレンドおよび強度統計データの季節トレンドが決定されると、次に、いくつかの実施形態は、1つ以上のスレッドのクラスの各々について、スレッドのクラスのヒープ使用量の季節トレンドと強度統計データの季節トレンドとの相関度合いを計算してもよい。具体的には、96個の季節因子または192個の季節因子のシーケンスについての相関度合いが計算されてもよい。なお、季節トレンド間の相関度合いを計算することは、ヒープ使用量測定値のシーケンスとスレッド強度測定値のシーケンスとの相関度合いを計算することよりも効率的であろう。なぜならば、測定値のシーケンスの方がかなり長いと思われるからである。
【0207】
Hが、ヒープ使用量のN個の季節因子のシーケンスを示すとする。Tが、スレッドのクラスのスレッド強度のN個の季節因子のシーケンスを示すとする。季節因子のこの2つのシーケンスの相関係数は、下記に定義する相関係数(H,T)によって得られる。
【0208】
【0209】
いくつかの実施形態は、直近の年間ヒープ使用量が高い季節に含まれるヒープ使用量統計データの回帰を実施することによって、ヒープ使用量の平日季節因子および週末季節因子を導出してもよい。データセットのこのセグメントの時間間隔を、(t1,t2)で示す。スレッドのクラスの強度統計データの季節因子とヒープ使用量の季節因子との相関を解析するために、いくつかの実施形態は、スレッドのクラスに関連するSeasonalTrendInfoに含まれる季節因子時系列における同じ時間間隔(t1,t2)から、季節因子を得ることができる。具体的には、季節因子時系列は、関連するSeasonalTrendingInfoオブジェクトに含まれるsmoothedWeekdaySeasonalFactorメンバ変数およびsmoothedWeekendSeasonalFactorメンバ変数に格納され得る。
【0210】
いくつかの実施形態は、スレッドのクラスのすべてのThreadClassificationInfoオブジェクトを反復し、ThreadClassificationInfoオブジェクトの各々に含まれるSegmentInfoオブジェクトを再帰的に横断して、ThreadClassificationInfoオブジェクトおよびSegmentInfoオブジェクト内に含まれるSeasonalTrendInfoオブジェクトを収集できる。上記の式を用いてスレッドのクラスの各々とヒープ使用量との相関係数(H,T)を計算する際、いくつかの実施形態は、SeasonalTrendInfoオブジェクトの各々に含まれる平日因子または週末因子を取り出すことができる。スレッドのクラスごとの相関度合いが算出されると、いくつかの実施形態は、スレッドのクラスをヒープ使用量季節トレンドとの相関度合いによってランク付けしてもよい。次に、最高位にランク付けされたスレッドのクラスが、ヒープをため込んでいるスレッドのクラスとして分類されてもよい。次に、いくつかの実施形態は、ヒープをため込んでいるスレッドのクラスに関連するコードおよびスタックトレースを解析して、手動または自動で修正および/または向上させることがきる非効率なメモリ使用量を特定してもよい。
【0211】
なお、いくつかの実施形態を拡張して、平日期間および週末期間以外の期間(たとえば、四半期末の期間)に基づいて相関係数を決定することができる。
【0212】
図9は、いくつかの実施形態に係る、ソフトウェア実行環境内の高いヒープ使用量の一因となっていると思われるコードを特定するためのプロセスのフローチャート900であ
る。いくつかの実施形態では、フローチャート900に示すプロセスは、1つ以上のプロセッサを有するコンピュータシステム(たとえば、
図17のコンピュータシステム1700)によって実施されてもよい。1つ以上のプロセッサが、コンピュータ読み取り可能な媒体に格納されたコンピュータコードに基づいてステップを実行できる。
図9に説明するステップは、その他のステップの有無を問わず、任意の順序で実行できる。
【0213】
フローチャート900は、ステップ902から始まる。ステップ902において、実施形態は、1つ以上のプロセスによるヒープ使用量が閾値を上回っている時間の長さを判断する。当該時間の長さは、年間ヒープ使用量が高い季節に対応してもよく、閾値は、1つ以上の期間(たとえば、平日期間および週末期間)全体に対する、間隔(たとえば、15分間隔)に割り当てられた季節因子の範囲の割合に対応してもよい。いくつかの実施形態では、閾値は、割合を選ぶことによって設定され得る。割合が選ばれると、閾値は、季節因子の範囲と割合との積と最小季節因子の和によって表されてもよい。たとえば、選んだ割合が85パーセントであり、最小季節因子が0.76であり、最大季節因子が1.34である場合、閾値は、(0.76+0.85×(1.34-0.76))によって表され得、1.253である。その結果、1.25を上回る乗法季節因子を有する間隔はいずれも、ヒープ使用量が閾値を上回っている時間の長さの一部であると判断されるだろう。
【0214】
ステップ904において、実施形態は、当該時間の長さの間の1つ以上のプロセスのヒープ情報を決定する。ヒープ情報は、この時間の長さの間の異なる時点においてソフトウェア実行環境内で1つ以上のプロセスが使用しているヒープメモリの量に対応してもよい。たとえば、ヒープ情報は、不規則な間隔(たとえば、フルGCの間)でソフトウェア実行環境から得られるヒープ使用量の測定値に基づいてもよい。これに加えて、ソフトウェア実行環境は、1台以上の仮想マシン(たとえば、JVM)を含む本番環境に対応してもよく、1つ以上のプロセスは、1つ以上のクラウドサービスをサポートし得る。
【0215】
ステップ906において、実施形態は、当該時間の長さの間の1つ以上のプロセスのスレッド情報を決定する。いくつかの実施形態では、スレッド情報は、解析されたスレッドダンプから判断された1つ以上のスレッドのクラスの各々について、複数の間隔の各々のスレッド強度季節因子を含んでもよい。
【0216】
いくつかの実施形態では、ヒープ情報は、複数の間隔の各々のヒープ使用量季節因子を含んでもよい。具体的には、この時間の長さは、第1長さを有する第1期間(たとえば、平日期間)の1つ以上のサイクルと、第2長さを有する第2期間(たとえば、週末期間)の1つ以上のサイクルとをまたがってもよい。各期間は、複数の間隔に分割されてもよい。たとえば、平日期間は、96個の15分間隔に分割されてもよく、週末期間は、192個の15分間隔に分割されてもよい。
【0217】
なお、複数の間隔の各々は、期間のうちの1つの期間の特定の季節(すなわち、季節指数)に対応付けられてもよい。季節指数ごとに、いくつかの実施形態は、ヒープ使用量季節因子を決定し、特定されたスレッドのクラスごとに、スレッド強度季節因子を決定してもよい。これによって、各間隔は、1つのヒープ使用量季節因子と複数のスレッド強度季節因子(スレッドのクラスごとに1つ)とに関連付けられる。たとえば、3つの異なるスレッドのクラスが発見されたと想定すると、96個のヒープ使用量季節因子と288個のスレッド強度季節因子(3つのスレッドのクラスの各々について96個のスレッド強度季節因子)とを平日期間が有してもよく、週末期間は、192個のヒープ使用量季節因子と576個のスレッド強度季節因子とを有してもよい。
【0218】
ステップ908において、実施形態は、ヒープ情報をスレッド情報と相関させて、閾値を上回るヒープ使用量に対応する1つ以上のプロセスの1行以上のコードを特定する。ヒ
ープ情報をスレッド情報と相関させるステップについては、
図10を参照して以下にさらに詳細に説明する。
【0219】
ステップ910において、1行以上のコードを特定することに応答して、実施形態は、当該1行以上のコードに関連する1つ以上のアクションを開始する。たとえば、実施形態は、関係者またはコード最適化ツールに送られる、1行以上のコードに関連するアラートを生成してもよい。これに応答して、特定されたコードの行は、調査および/または最適化されてもよい。これに代えて、いくつかの実施形態は、この1行以上のコードを最適化して、ヒープメモリをより効率良く利用してもよい。
【0220】
図10は、いくつかの実施形態に係る、様々なスレッドのクラスと高いヒープ使用量との相関度合いを算出するためのプロセスのフローチャート1000である。いくつかの実施形態では、フローチャート1000に示すプロセスは、1つ以上のプロセッサを有するコンピュータシステム(たとえば、
図17のコンピュータシステム1700)によって実施されてもよい。1つ以上のプロセッサが、コンピュータ読み取り可能な媒体に格納されたコンピュータコードに基づいてステップを実行できる。
図10に説明するステップは、その他のステップの有無を問わず、任意の順序で実行できる。
【0221】
フローチャート1000は、ステップ1002から始まる。ステップ1002において、実施形態は、1つ以上のプロセスの1つ以上のスレッドダンプを取得する。上述したように、制御システムが、定期的に、ソフトウェア実行環境に、ソフトウェア実行環境内で実行中の1つ以上のプロセスが生成したスレッドの1つ以上のスタックトレースを含むスレッドダンプを出力させてもよい。
【0222】
ステップ1004において、実施形態は、1つ以上のスレッドダンプから1つ以上のスレッドを受信し、受信したスレッドに対応するスタックトレースに基づいて当該受信したスレッドの各々を分類することによって、1つ以上のスレッドのクラスを取得する。スレッドダンプのすべてが受信されて処理されると、実施形態は、ステップ1006~ステップ1016において1つ以上のスレッドのクラスの各々を解析してスレッドのクラスの各々と高いヒープ使用量との相関度合いを判定してもよい。
【0223】
判断1006において、実施形態は、1つ以上のスレッドのクラスの中に別のスレッドのクラスがあるかどうかを判断し、高いヒープ使用量との相関度合いを判断する。当該別のスレッドのクラスがある場合、実施形態は、ステップ1008に進んでもよい。ない場合、実施形態は、ステップ1018に進んでもよい。
【0224】
任意ステップ1008において、実施形態は、複数の間隔のヒープ使用量季節因子の平均を算出する。ステップ1010において、実施形態は、スレッドのクラスおよび複数の間隔のスレッド強度季節因子の平均を算出する。任意ステップ1012において、実施形態は、複数の間隔のヒープ使用量季節因子の分散を算出する。ステップ1014において、実施形態は、スレッドのクラスおよび複数の間隔のスレッド強度季節因子の分散を算出する。ステップ1016において、実施形態は、スレッドのクラスと閾値を上回るヒープ使用量との相関度合いを算出する。
【0225】
ステップ1018において、実施形態は、1つ以上のスレッドのクラスから、閾値を上回るヒープ使用量に対する相関度合いが最も高い所与のスレッドのクラスを選択する。具体的には、スレッドのクラスごとの相関度合いが算出されると、いくつかの実施形態は、スレッドのクラスをヒープ使用量季節トレンドとの相関度合いによってランク付けしてもよい。次に、最高位にランク付けされたスレッドのクラスが、当該所与のスレッドのクラスとして選択されてもよい。
【0226】
ステップ1020において、実施形態は、当該所与のスレッドのクラスに基づいて、高いヒープ使用量の大きな一因と思われる1行以上のコードを特定する。具体的には、次に、いくつかの実施形態は、スタックトレースが指定するファイル名および行を解析して、ヒープをため込んでいるスレッドのクラスに関連するコードの行を特定してもよい。なお、当該所与のスレッドのクラスに属する1つ以上のプロセスの各スレッドが、当該1行以上のコードを実行する。
【0227】
VI.予測の際の弱外生性および分散の不均一性の克服
上述したように、標本の正確さを確実にするために、不規則な間隔で発生するフルガベージコレクション(GC)サイクルの間にヒープ割当てを測定してもよい。ヒープ使用量が特に高い状況では、絶え間ないガベージコレクションにより、標本抽出間隔は、気まぐれにゼロに近づいてしまうだろう。その結果、ヒープ割当ての測定に基づく時系列データは、弱外生性および分散の不均一性を示すだろう。弱外生性では、残差を生成するプロセスが、フルGC標本の時間間隔を生成するプロセスに多少依存する。分散の不均一性では、残差の分散が、時間を通じて一定でない。
【0228】
従来、線形トレンドの常最小二乗回帰を生成することは、外生的かつ等分散的なプロセスによって予測変数および応答変数が生成されることを想定する。しかしながら、フルGC中に測定された値に基づくデータセットに関して、予測変数(すなわち、不規則な間隔)および応答変数(すなわち、フルGC中に測定されたヒープ使用量)は、独立していない。なぜならば、ヒープ使用量が増加すると、フルGCが出力される頻度も増加するからである。いくつかの実施形態は、ロバスト回帰法および耐性回帰法を用いてデータセットの弱外生性および分散の不均一性を克服してもよい。
【0229】
特定の実施形態は、ロバスト最小二乗回帰を利用して、このようなデータセットにおいて示される弱外生性および分散の不均一性を克服してもよい。具体的には、いくつかの実施形態は、(1)測定値の時系列を、季節変動が除去された測定成分(すなわち、季節変動が除去された成分)と季節因子成分(すなわち、季節エフェクタ)とに分解し、(2)季節変動が除去された測定成分にロバスト線形回帰を適用し、(3)季節因子成分に平滑化スプライン・フィルタを適用し、(4)線形回帰線および平滑化後の季節因子を、季節線形トレンドモデルに再構成してもよい。
【0230】
最小刈込み二乗法(LTS:Least-Trimmed Squares)推定量は、外れ値の影響を受け
ないロバスト回帰法である。N個の標本のセットを考えると、LTS推定量は、標本のうち最大二乗残差に対応する50%を外れ値としてトリムすることによって、最小二乗残差方50%の和を最小化する。LTS推定量は、N個すべての標本の常最小二乗回帰の反復を1回実行して残差をソートして、最小N/2の残差(すなわち、トリム標本)を選択する。次に、LTS推定量は、当該トリム標本を更新することによって反復的に回帰を再実行して、二乗残差の平均を下げる。しかしながら、後述する特定の実施形態と比較して、LTSアルゴリズムの時間計算量は、比較的高くなるだろう。
【0231】
汎用型重み付き最小二乗法(WLS:Weighted Least-Squares)推定量は、各標本の二乗誤差残差を、標本の分散に反比例する重みによって乗算するロバスト回帰法である。WLS推定量を採用するかどうかは、データの事前知識によって決定される重みによって決まり得る。たとえば、事前知識は、(1)異なる標本点を測定するために使用される異なる道具の正確さ、(2)同じ時刻に対応する重複した測定値間の分散、または、(3)最近接グループの測定値間の分散、を指定してもよい。事前知識によって重みを決定できなかった場合、WLS推定量は、常最小二乗回帰を1回反復して残差を推定し、残差の逆数を重みとして使用して回帰を反復的に再実行し、線形モデルの安定した推定を出力しても
よい。しかしながら、後述する特定の実施形態と比較して、WLSアルゴリズムの時間計算量は、比較的高い。
【0232】
【0233】
【0234】
次に、いくつかの実施形態は、下記の式を用いて、季節変動が除去された生(raw)増
加率を求めてもよい。
【0235】
【0236】
次に、いくつかの実施形態は、式を用いて、移動平均を更新してもよい。
【0237】
【0238】
いくつかの実施形態は、レートフィルタパラメータを用いてデータ点をトリムする。データ点のトリムは、標本点の密度を全時間領域にわたって一様にするのに役立つため、線形回帰アルゴリズムのロバストネスが向上する。フルGCサイクル中のソフトウェア実行環境におけるヒープ使用量の測定値を表すデータ点に関して、互いに近接するデータ点は、フルGCがより頻繁に実行される、ヒープ使用量がより高い時期(たとえば、負荷スパイクの間)に対応するだろう。
【0239】
いくつかの実施形態は、レートフィルタパラメータを閾値と比較して、レートフィルタパラメータが閾値よりも小さい場合、ロバスト線形回帰から対応するデータ点を除外する(すなわち、トリムする)。いくつかの実施形態は、レートフィルタパラメータの中央値または平均を閾値として使用できる。具体的には、互いに近接するデータ点は、負荷の急増または外れ値を表している可能性があるため、いくつかの実施形態は、このようなデータ点をトリムすることができる。その結果、いくつかの実施形態は、時間軸に沿ってデータ点の密度を一様にすることにより、弱外生性状態を緩和してもよい。これによって、不規則な時間間隔と残差との相関が低くなる。
【0240】
【0241】
いくつかの実施形態は、下記の式を用いて、予測測定値の誤差残差を生成してもよい。
【0242】
【0243】
下記の例示的なコード(Rプログラミング言語で書かれた)は、標本のトリムサブセットおよび標本の重みがどのように計算され得るかを示す。下記の例示的なコードに示すように、いくつかの実施形態は、R関数「rlm」を用いてもよい。R関数「rlm」によって、特定の実施形態は、重み付き最小二乗回帰を生成するための標本のトリムサブセットおよび標本の重みを指定することが可能になる。なお、例示的なコードにおけるrateFilterParameter、seasonalFactor、absoluteErrorResidual、measure、および時間ベクトルは、同じ時間領域を有する時系列である。
【0244】
【0245】
【0246】
【0247】
ヒープ使用量の外れ値および短期急増の線形回帰に対する影響を低減するために、いくつかの実施形態は、データ点の密度を一様にする手法を、ずれている標本値に対してより小さい重みを割り当てる手法と組み合わせてもよい。そうすることで、いくつかの実施形態は、線形回帰のロバストネスを高めることができるだろう。これによって、(たとえば、ヒープ使用量における)長期トレンドをとらえることが容易になるだろう。なお、これらの2つの手法を合わせて利用することによって、線形回帰線をデータによりよくフィットさせることができ、一般に回帰を何度か反復することを必要とする従来のLTS推定量またはWLS推定量よりも効率がよくなるだろう。
【0248】
回帰のロバストネスをさらに向上させるために、いくつかの実施形態は、さらに、遷移状態を特定して、遷移状態にある標本点を取り除き、外れ値(たとえば、メモリリーク、メモリ不足イベント、または、非常に高い増加率に遭遇しているソフトウェア実行環境に対応するデータセグメント)であるランツーラン(run-to-run)セグメントを取り除いて
もよい。
【0249】
図12は、本番環境におけるヒープ使用量を求めるための異なる線形回帰法によって導出された3つのトレンドグラフを示す図である。青色のトレンド線1205は、各標本点に等しい重みを割り当てる標準的な線形回帰アルゴリズムによって導出することができる。茶色のトレンド線1210は、従来のロバスト回帰アルゴリズムによって導出することができる。赤線1215は、上記の本実施形態が提供する回帰を表し、茶色のトレンド線の近くに位置する。
【0250】
図13は、従来の回帰法がどのように誤った結果をもたらすのかを例示する追加グラフを示す図である。グラフに示すように、従来の回帰法を表す茶色のトレンド線1305は、密度が高い標本点の2つの集落にほぼ合っている。対照的に、赤線1215は、標本点における傾向を正確に追跡し、ソフトウェア実行環境におけるヒープ使用量の長期予測ができている。
【0251】
図14は、いくつかの実施形態に係る、信号の予測を生成するためのプロセスのフローチャート1400である。いくつかの実施形態では、フローチャート1400に示すプロセスは、1つ以上のプロセッサを有するコンピュータシステム(たとえば、
図17のコンピュータシステム1700)によって実施されてもよい。1つ以上のプロセッサが、コンピュータ読み取り可能な媒体に格納されたコンピュータコードに基づいてステップを実行できる。
図14に説明するステップは、その他のステップの有無を問わず、任意の順序で実行できる。
【0252】
フローチャート1400は、ステップ1402から始まる。ステップ1402において、実施形態は、タイムスパンの間に標本抽出された複数の測定値を含む信号を、1つ以上のプロセスが実行中の環境から受信する。いくつかの実施形態では、この複数の測定値が、1つ以上の実行中のプロセスを含むソフトウェア実行環境(たとえば、本番環境)内のヒープ使用量を監視中の制御システムによって測定されたヒープ使用量であってもよい。
【0253】
ステップ1404において、実施形態は、信号から、季節変動が除去された成分および季節エフェクタを取り出す(ステップ1404)。いくつかの実施形態では、季節エフェクタは、データセットに割り当てられた期間の間隔ごとに特定された季節因子に対応してもよい。いくつかの実施形態では、季節変動が除去された成分は、季節因子を当該信号に適用することによって得られてもよい。
【0254】
ステップ1406において、実施形態は、1つ以上のスプライン関数を季節エフェクタに適用して第1モデルを生成する。この点については、いくつかの実施形態は、標本の近接群の合成積を表す期待値から大きくはずれた標本値に、比較的小さい重みを与えてもよい。
【0255】
ステップ1408において、実施形態は、季節変動が除去された成分に線形回帰法を適用して第2モデルを生成してもよい。具体的には、高いヒープ使用の間に経験する比較的短い間隔を補償するために、いくつかの実施形態は、短い間隔の間に抽出された標本に比較的小さい重みを与えるようにフィルタパラメータを調整してもよい。いくつかの実施形態は、レートフィルタパラメータを用いて、データセットに含まれるデータ点をトリムしてもよい。データ点のトリムは、標本点の密度を全時間領域にわたって一様にするのに役立つため、線形回帰アルゴリズムのロバストネスが向上する。
【0256】
ステップ1410において、実施形態は、第1モデルおよび第2モデルに基づいて、信号の予測を生成する。いくつかの実施形態では、信号の予測は、ステップ1406および
1408において説明した手法を用いて作られた回帰線に対応してもよい。具体的には、生成された予測は、信号によりよくフィットするだろう。
【0257】
ステップ1412において、実施形態は、当該予測の少なくとも一部に基づいて、この環境に関連する1つ以上のアクションを開始する。たとえば、ヒープ使用量が将来増えると予測が示す場合、いくつかの実施形態は、追加リソース(たとえば、メモリ、RAM)をソフトウェア実行環境に割り当ててもよい。
【0258】
図15は、実施形態を実現するための分散システム1500の略図である。図示した実施形態において、分散システム1500は、1つ以上のクライアントコンピューティングデバイス1502、1504、1506、および1508を備える。1つ以上のクライアントコンピューティングデバイス1502、1504、1506、および1508は、1つ以上のネットワーク(複数可)1510で、ウェブブラウザ、プロプライエタリ・クライアント(たとえば、Oracle Forms)などのクライアントアプリケーションを実行および操作するように構成される。サーバ1512は、ネットワーク1510を介して、クライアントコンピューティングデバイス1502、1504、1506、および1508と通信可能に接続されてもよい。
【0259】
様々な実施形態において、サーバ1512は、1つ以上のサービスまたはソフトウェアアプリケーションを実行するようになされてもよい。特定の実施形態では、サーバ1512は、非仮想環境および仮想環境を含み得るその他のサービスまたはソフトウェアアプリケーションも提供してもよい。いくつかの実施形態では、これらのサービスは、クライアントコンピューティングデバイス1502、1504、1506、および/または1508のユーザに対して、ウェブベースのサービスもしくはクラウドサービスとして提供されてもよく、または、SaaS(Software as a Service)モデル下で提供されてもよい。
クライアントコンピューティングデバイス1502、1504、1506、および/または1508を操作するユーザは、1つ以上のクライアントアプリケーションを利用してサーバ1512とやり取りして、これらの構成要素が提供するサービスを利用できる。
【0260】
図15に示す構成では、システム1500のソフトウェアコンポーネント1518、1520、および1522がサーバ1512上に実装されたものとして示される。その他の実施形態では、システム1500の構成要素のうちの1つ以上および/またはこれらの構成要素が提供するサービスのうちの1つ以上も、クライアントコンピューティングデバイス1502、1504、1506、および/または1508のうちの1つ以上によって実現されてもよい。次に、クライアントコンピューティングデバイスを操作しているユーザは、1つ以上のクライアントアプリケーションを利用して、これらの構成要素が提供するサービスを使用してもよい。これらの構成要素は、ハードウェア、ファームウェア、ソフトウェア、またはそれらの組合せで実現されてもよい。様々な異なるシステム構成が可能であり、これらは、分散システム1500とは異なってもよいことを理解されたい。よって、
図15に示す実施形態は、実施例のシステムを実現するための分散システムの一例であって、限定を意図したものではない。
【0261】
クライアントコンピューティングデバイス1502、1504、1506、および/または1508は、様々な種類のコンピューティングシステムを含んでもよい。たとえば、クライアントコンピューティングデバイスは、Microsoft Windows Mobile(登録商標)などのソフトウェアおよび/またはiOS、Windows Phone、Android、BlackBerry 10、Palm OSなどのいろいろなモバイルオペレーティングシステムを実行する手のひらサイズのポータブルデバイス(たとえば、iPhone(登録商標)、携帯電話、iPad(登録商標)、コンピューティングタブレット、PDA(Personal Digital Assistant))またはウェアラブルデバ
イス(たとえば、Google Glass(登録商標)ヘッドマウントディスプレイ)を含んでもよい。デバイスは、様々なインターネット関連アプリ、電子メール、ショートメッセージサービス(SMS)アプリケーションなど、様々なアプリケーションをサポート
してもよく、様々な他の通信プロトコルを使用してもよい。また、クライアントコンピューティングデバイスは、例として、様々なバージョンのMicrosoft Windows(登録商標)、Apple Macintosh(登録商標)、および/またはLinux(登録商標)オペレーティングシステムを実行するパーソナルコンピュータおよび/またはラップトップコンピュータを含む、汎用パーソナルコンピュータを含んでもよい。クライアントコンピューティングデバイスは、これらに限定されないが、たとえば、Google Chrome OSなどいろいろなGNU/Linuxオペレーティングシステムを含む各種市販のUNIX(登録商標)またはUNIXに似たオペレーティングシステムを実行するワークステーションコンピュータであり得る。また、クライアントコンピューティングデバイスは、シン・クライアントコンピュータ、インターネット対応のゲーミングシステム(たとえば、Kinect(登録商標)ジェスチャ入力装置付きまたは無しのMicrosoft Xboxのゲーミングコンソール)、および/またはパーソナルメッセージングデバイスなど、ネットワーク(複数可)1510で通信可能な電子機器を含んでもよい。
【0262】
図15の分散システム1500は、4台のクライアントコンピューティングデバイスとともに示されているが、任意の数のクライアントコンピューティングデバイスがサポートされてもよい。センサ付きデバイスなど、他のデバイスがサーバ1512と対話を行ってもよい。
【0263】
分散システム1500におけるネットワーク(複数可)1510は、これらに限定されないが、TCP/IP(Transmission Control Protocol/Internet Protocol)、SNA
(Systems Network Architecture)、IPX(Internet Packet Exchange)、AppleTalkなどを含む利用可能なプロトコルを使用したデータ通信をサポートできる、当業者にとってなじみのある任意の種類のネットワークであってもよい。単に一例として、ネットワーク(複数可)1510は、LAN(Local Area Network)、Ethernet(登録商標)に基づいたネットワーク、トークンリング、ワイドエリアネットワーク、インターネット、VPN(Virtual Private Network)、イントラネット、エクストラネット
、PSTN(Public Switched Telephone Network)、赤外線ネットワーク、ワイヤレス
ネットワーク(たとえば、IEEE(Institute of Electrical and Electronics)80
2.11スイートのプロトコル、Bluetooth(登録商標)、および/またはその他のワイヤレスプロトコルのうちのいずれかの下で動作するネットワーク)、および/もしくはこれらの任意の組合せを含む仮想ネットワーク、ならびに/または他のネットワークであり得る。
【0264】
サーバ1512は、1つ以上の汎用コンピュータ、専用サーバコンピュータ(一例として、PC(Personal Computer)サーバ、UNIX(登録商標)サーバ、ミッドレンジ・
サーバ、メインフレーム・コンピュータ、ラックマウント式サーバなどを含む)、サーバファーム、サーバ・クラスタ、またはその他の適切な配置および/もしくは組合せから構成されてもよい。サーバ1512は、仮想オペレーティングシステムを実行している1つ以上の仮想マシン、または仮想化を必要とする他のコンピューティングアーキテクチャを含み得る。論理記憶装置の1つ以上のフレキシブルプールを仮想化して、サーバ用の仮想記憶装置を維持することができる。仮想ネットワークは、SDN(Software-Defined Networking)を用いて、サーバ1512によって制御され得る。様々な実施形態では、サー
バ1512は、上記の開示において説明した1つ以上のサービスまたはソフトウェアアプリケーションを実行するようになされてもよい。たとえば、サーバ1512は、本開示の実施形態に従って、上述した処理を行うためのサーバに対応してもよい。
【0265】
サーバ1512は、上述のオペレーティングシステムのいずれか、および任意の市販のサーバオペレーティングシステムを実行してもよい。また、サーバ1512は、HTTP(Hypertext Transport Protocol)サーバ、FTP(File Transfer Protocol)サーバ、CGI(Common Gateway Interface)サーバ、JAVA(登録商標)サーバ、データベースサーバなどを含む、各種の追加のサーバアプリケーションおよび/またはミッドティア・アプリケーションを実行してもよい。例示的なデータベースサーバとして、Oracle、Microsoft、Sybase、IBM(International Business Machines)
などが販売するデータベースサーバが挙げられるが、これらに限定されない。
【0266】
いくつかの実装形態では、サーバ1512は、クライアントコンピューティングデバイス1502、1504、1506、および1508のユーザから受信したデータフィードおよび/またはイベント更新を分析するおよび1つにまとめるための1つ以上のアプリケーションを含んでもよい。例として、データフィードおよび/またはイベント更新は、Twitter(登録商標)フィード、Facebook(登録商標)更新、または1つ以上のサードパーティ情報ソースおよび連続したデータストリームから受信されるリアルタイム更新を含んでもよいが、これらに限定されない。データフィードおよび/またはイベント更新は、センサーデータアプリケーション、チッカー(financial ticker)、ネットワークパフォーマンス測定ツール(たとえば、ネットワーク監視およびトラフィック管理アプリケーション)、クリックストリーム分析ツール、自動車交通量監視などに関するリアルタイムイベントを含み得る。また、サーバ1512は、クライアントコンピューティングデバイス1502、1504、1506、および1508の1つ以上の表示装置を介してデータフィードおよび/またはリアルタイムイベントを表示するための1つ以上のアプリケーションを含んでもよい。
【0267】
また、分散システム1500は、1つ以上のデータベース1514および1516を含んでもよい。これらのデータベースは、ユーザインタラクション情報、使用パターン情報、適合規則情報、および本開示の実施形態が使用するその他の情報などの情報を格納するためのメカニズムを提供してもよい。データベース1514および1516は、いろいろな場所に存在してもよい。一例として、データベース1514および1516のうちの1つ以上は、サーバ1512にローカルな(および/または存在する)非一時的な記憶媒体上に存在してもよい。これに代えて、データベース1514および1516は、サーバ1512から遠隔の場所に存在し、ネットワークベースの接続または専用の接続を通してサーバ1512と通信していてもよい。一組の実施形態において、データベース1514および1516は、SAN(Storage-Area Network)に存在してもよい。同様に、サーバ1512に起因する機能を実行するための必要なファイルは、いずれも、サーバ1512上のローカルな場所および/またはサーバ1512から遠隔の場所に適宜格納されてもよい。一組の実施形態において、データベース1514および1516は、Oracleが提供するデータベースなど、SQLフォーマットのコマンドに応答してデータを格納、更新、および取り出すようになされたリレーショナルデータベースを含んでもよい。
【0268】
いくつかの実施形態では、クラウド環境は、1つ以上のサービスを提供してもよい。
図16は、本開示の実施形態に係る、クラウドサービスとしてサービスが提供され得るシステム環境1600の1つ以上のコンポーネントの簡略ブロック図である。
図16に示す実施形態において、システム環境1600は、1つ以上のクライアントコンピューティングデバイス1604、1606、および1608を含む。1つ以上のクライアントコンピューティングデバイス1604、1606、および1608は、ユーザによって、クラウドサービスを提供するクラウドインフラストラクチャシステム1602と対話するために使用されもよい。クラウドインフラストラクチャシステム1602は、サーバ1612に関して上述したものを含み得る1つ以上のコンピュータおよび/またはサーバを備えてもよ
い。
【0269】
図16に示すクラウドインフラストラクチャシステム1602が、図示された構成要素以外の構成要素を有し得ることを理解されたい。さらに、
図16に示す実施形態は、本開示の実施形態を組み込み得るクラウドインフラストラクチャシステムの一例に過ぎない。他のいくつかの実施形態において、クラウドインフラストラクチャシステム1602は、図に示すコンポーネントよりも多いまたは少ない数のコンポーネントを有してもよく、2つ以上のコンポーネントを組み合わせてもよく、またはコンポーネントの構成または配置が異なっていてもよい。
【0270】
クライアントコンピューティングデバイス1604、1606、および1608は、上述したものと同様のデバイスであってもよい。クライアントコンピューティングデバイス1604、1606、および160は、ウェブブラウザ、プロプライエタリ・クライアントアプリケーション(たとえば、Oracle Forms)、または他のアプリケーションなど、クライアントアプリケーションを操作するように構成されてもよい。クライアントアプリケーションは、クライアントコンピューティングデバイスのユーザによって、クラウドインフラストラクチャシステム1602と対話を行ってクラウドインフラストラクチャシステム1602が提供するサービスを利用するために使用されてもよい。例示的なシステム環境1600は、3つのクライアントコンピューティングデバイスとともに示されているが、任意の数のクライアントコンピューティングデバイスがサポートされてもよい。センサ付きデバイスなど、他のデバイスなどがクラウドインフラストラクチャシステム1602と対話を行ってもよい。
【0271】
ネットワーク(複数可)1610は、クライアントコンピューティングデバイス1604、1606、および1608とクラウドインフラストラクチャシステム1602との間のデータの通信およびやり取りを容易にしてもよい。各ネットワークは、ネットワーク(複数可)1610に関して上述したプロトコルを含む各種市販のプロトコルのいずれかを用いたデータ通信をサポートできる、当業者にとってなじみのある任意の種類のネットワークであってもよい。
【0272】
特定の実施形態では、クラウドインフラストラクチャシステム1602が提供するサービスは、クラウドインフラストラクチャシステムのユーザが要求すれば利用可能になるサービスのホストを含んでもよい。これらに限定されないが、オンラインのデータストレージおよびバックアップソリューション、ウェブベースの電子メールサービス、ホストされたオフィススイートドキュメント連携サービス、データベース処理、管理されたテクニカルサポートサービスなどを含む様々な他のサービスが提供されてもよい。クラウドインフラストラクチャシステムが提供するサービスは、動的にスケール変更してそのユーザのニーズを満たすことができる。
【0273】
特定の実施形態では、クラウドインフラストラクチャシステム1602が提供するサービスを具体的にインスタンス化したものは、本明細書において、「サービスインスタンス」と称される場合がある。一般に、インターネットなどの通信ネットワークを介してユーザが利用できるようになる、クラウドサービスプロバイダのシステムからのいずれのサービスも、「クラウドサービス」と称される。通常、パブリッククラウド環境では、クラウドサービスプロバイダのシステムを構成するサーバおよびシステムは、顧客所有のオンプレミス・サーバおよびシステムとは異なる。たとえば、クラウドサービスプロバイダのシステムは、アプリケーションをホストしてもよく、ユーザは、インターネットなどの通信ネットワークを介して、要求に基づいてアプリケーションを注文および使用すればよい。
【0274】
いくつかの例において、コンピュータネットワークのクラウドインフラストラクチャに
おけるサービスは、ストレージ、ホストされたデータベース、ホストされたウェブサーバ、ソフトウェアアプリケーションへの保護されたコンピュータネットワークアクセス、もしくはクラウドベンダーがユーザに提供するその他のサービス、または、当技術分野で周知の上記以外のその他のサービスを含んでもよい。たとえば、サービスは、インターネットを通した、クラウド上のリモートストレージへのパスワード保護されたアクセスを含み得る。別の例として、サービスは、ネットワークで結ばれた開発者が私的に利用するための、ウェブサービスベースのホストされたリレーショナルデータベースおよびスクリプト言語のミドルウェアエンジンを含み得る。別の例として、サービスは、クラウドベンダーのウェブサイト上にホストされた電子メールソフトウェア・アプリケーションへのアクセスを含み得る。
【0275】
特定の実施形態では、クラウドインフラストラクチャシステム1602は、顧客にセルフサービスで、サブスクリプション方式で、伸縮自在にスケーラブルに、確実に、かつ高い可用性を有するセキュアな方法で届けられるアプリケーションのスイート、ミドルウェア、およびデータベースサービス提供物を含んでもよい。このようなクラウドインフラストラクチャシステムの例が、本願の譲受人が提供するオラクルパブリッククラウド(Oracle Public Cloud)である。
【0276】
また、クラウドインフラストラクチャシステム1602は、「ビッグデータ」に関する演算および分析サービスを提供してもよい。用語「ビッグデータ」は、一般に、大量のデータを可視化する、トレンドを検出する、および/またはこのデータとやり取りするためにアナリストおよび研究者によって格納および操作され得る、極めて大きなデータセットを指す。このビッグデータおよび関連アプリケーションは、多くのレベルおよび異なる規模で、インフラストラクチャシステムによってホストおよび/または操作され得る。このようなデータを提示するために、またはこのデータに対する外力またはデータが表すものをシミュレーションするために、並列にリンクされた何十、何百、または何千ものプロセッサがこのデータに作用し得る。これらのデータセットは、データベースにおいて、または構造化モデルに応じて編成された構造化データのような構造化データ、および/または非構造化データ(たとえば、Eメール、画像、データBLOB(binary large objects)、ウェブページ、複雑なイベント処理)を必要とし得る。より多くの(または、より少ない)コンピューティングリソースを比較的素早く目標に集めるための実施形態の機能を活用することによって、企業、政府関係機関、研究機関、私人、同じ意見を持った個人同士のグループもしくは組織、または他のエンティティからの要求に基づいて、大きなデータセットに対してタスクを実行するために、クラウドインフラストラクチャシステムをより役立てることができる。
【0277】
様々な実施形態において、クラウドインフラストラクチャシステム1602は、クラウドインフラストラクチャシステム1602が提供するサービスへの顧客のサブスクリプションを自動的にプロビジョニング、管理、および追跡するようになされてもよい。クラウドインフラストラクチャシステム1602は、それぞれ異なるデプロイメントモデルを介してクラウドサービスを提供してもよい。たとえば、サービスは、クラウドサービス(たとえば、オラクルコーポレーション所有)を販売する組織がクラウドインフラストラクチャシステム1602を所有し、このサービスが一般大衆またはそれぞれ異なる産業企業に利用可能になる、パブリッククラウドモデル下で提供されてもよい。別の例として、クラウドインフラストラクチャシステム1602が1つの組織のためだけに動かされ、クラウドインフラストラクチャシステム1602が組織内の1つ以上のエンティティ用のサービスを提供し得るプライベートクラウドモデル下で、サービスが提供されてもよい。また、クラウドサービスは、クラウドインフラストラクチャシステム1602およびクラウドインフラストラクチャシステム1602が提供するサービスが関連コミュニティ内のいくつかの組織によって共有されるコミュニティクラウドモデル下で提供されてもよい。クラウ
ドサービスは、2つ以上の異なるモデルの組み合せであるハイブリッドクラウドモデル下で提供されてもよい。
【0278】
いくつかの実施形態では、クラウドインフラストラクチャシステム1602が提供するサービスは、SaaS(Software as a Service)カテゴリ、PaaS(Platform as a Service)カテゴリ、IaaS(Infrastructure as a Service)カテゴリ下で提供される
1つ以上のサービス、またはハイブリッドサービスを含むその他のカテゴリのサービスを含んでもよい。顧客は、サブスクリプションの注文によって、クラウドインフラストラクチャシステム1602が提供する1つ以上のサービスを注文してもよい。次に、クラウドインフラストラクチャシステム1602は、処理を実行して、顧客のサブスクリプションの注文にあるサービスを提供する。
【0279】
いくつかの実施形態では、クラウドインフラストラクチャシステム1602が提供するサービスは、アプリケーションサービス、プラットフォームサービス、およびインフラストラクチャサービスを含んでもよいが、これらに限定されない。いくつかの例において、アプリケーションサービスは、SaaSサービスを介してクラウドインフラストラクチャシステムによって提供されてもよい。SaaSプラットフォームは、SaaSカテゴリに該当するクラウドサービスを提供するように構成されてもよい。たとえば、SaaSプラットフォームは、オンデマンドアプリケーションのスイートを構築して統合開発/デプロイメントプラットフォームに届けるための機能を提供してもよい。SaaSプラットフォームは、SaaSサービスを提供するための基礎となるソフトウェアおよびインフラストラクチャを管理および制御してもよい。SaaSプラットフォームが提供するサービスを利用することによって、顧客は、クラウドインフラストラクチャシステム上で実行されるアプリケーションを利用できる。顧客は、アプリケーションサービスを、ライセンスおよびサポートを別に購入する必要なしに、入手できる。様々な異なるSaaSサービスが提供されてもよい。例として、大きな組織のための販売実績管理、企業統合、および事業の柔軟性に対するソリューションを提供するサービスなどが挙げられるが、これに限定されない。
【0280】
いくつかの実施形態では、プラットフォームサービスは、PaaSプラットフォームを介してクラウドインフラストラクチャシステム1602によって提供されてもよい。PaaSプラットフォームは、PaaSカテゴリに該当するクラウドサービスを提供するように構成されてもよい。プラットフォームサービスとして、存在するアプリケーションを組織(Oracleなど)が共有の共通アーキテクチャ上に1つにまとめることを可能にするサービス、およびプラットフォームが提供する共有サービスを活用する新しいアプリケーションを作る機能などが挙げられるが、これらに限定されない。PaaSプラットフォームは、PaaSサービスを提供するための基礎となるソフトウェアおよびインフラストラクチャを管理および制御してもよい。顧客は、クラウドインフラストラクチャシステム1602が提供するPaaSサービスを、ライセンスおよびサポートを別に購入する必要なしに、入手できる。プラットフォームサービスとして、JCS(Oracle Java Cloud Service)、DBCS(Oracle Database Cloud Service)、およびその他が挙げられるが、これらに限定されない。
【0281】
PaaSプラットフォームが提供するサービスを利用することによって、顧客は、クラウドインフラストラクチャシステムがサポートするプログラミング言語およびツールを採用することができ、また、デブロイされたサービスを管理することができる。いくつかの実施形態では、クラウドインフラストラクチャシステムが提供するプラットフォームサービスは、データベース・クラウドサービス、ミドルウェアクラウドサービス(たとえば、Oracle Fusion Middlewareサービス)、およびJavaクラウドサービスを含んでもよい。一実施形態において、データベース・クラウドサービスは、
組織がデータベースリソースをプールすることと、データベース・クラウドの形でDatabase as a Serviceを顧客に提供することとを可能にする共有サービスデプロイメントモデルをサポートしてもよい。クラウドインフラストラクチャシステムにおいて、ミドルウェアクラウドサービスは、顧客が様々なビジネスアプリケーションを開発およびデプロイするためのプラットフォームを提供してもよく、Javaクラウドサービスは、顧客がJavaアプリケーションをデプロイするためのプラットフォームを提供してもよい。
【0282】
クラウドインフラストラクチャシステムでは、IaaSプラットフォームによって様々な異なるインフラストラクチャサービスが提供されてもよい。インフラストラクチャサービスによって、ストレージ、ネットワークなど基礎となるコンピューティングリソース、および、SaaSプラットフォームおよびPaaSプラットフォームが提供するサービスを利用している顧客のためのその他の基本的なコンピューティングリソースの管理および制御が容易になる。
【0283】
また、特定の実施形態では、クラウドインフラストラクチャシステム1602は、クラウドインフラストラクチャシステムの顧客に様々なサービスを提供するために使用されるリソースを提供するためのインフラストラクチャ・リソース1630を含んでもよい。一実施形態において、インフラストラクチャ・リソース1630は、PaaSプラットフォームおよびSaaSプラットフォームが提供するサービスおよびその他のリソースを実行するための、サーバなどのハードウェアと、ストレージと、ネットワーキング・リソースとを予め統合した最適な組合せを含んでもよい。
【0284】
いくつかの実施形態では、クラウドインフラストラクチャシステム1602におけるリソースは、複数のユーザによって共有され、要求に応じて動的に再割り当てされてもよい。これに加えて、リソースは、それぞれ異なるタイムゾーンのユーザに割り当てられてもよい。たとえば、クラウドインフラストラクチャシステム1602は、第1のタイムゾーンにいる第1セットのユーザがクラウドインフラストラクチャシステムのリソースを指定された時間数利用することを可能にした後、異なるタイムゾーンに位置する別のセットのユーザに同じリソースを再割り当てすることを可能にし、リソースの利用が最大限に活用できるようになる。
【0285】
特定の実施形態では、クラウドインフラストラクチャシステム1602によるサービスの提供を可能にするための、クラウドインフラストラクチャシステム1602のそれぞれ異なる構成要素またはモジュールによって共有されるいくつかの内部共有サービス1632が提供されてもよい。これらの内部共有サービスは、セキュリティ/素性サービス、統合サービス、企業リポジトリサービス、企業マネージャサービス、ウイルススキャン/ホワイトリストサービス、可用性の高いバックアップ/リカバリサービス、クラウドサポートを可能にするためのサービス、Eメールサービス、通知サービス、ファイル転送サービスなどを含み得るが、これらに限定されない。
【0286】
特定の実施形態では、クラウドインフラストラクチャシステム1602は、クラウドインフラストラクチャシステムにおけるクラウドサービス(たとえば、SaaSサービス、PaaSサービス、およびIaaSサービス)の包括的な管理を提供してもよい。一実施形態において、クラウド管理機能は、クラウドインフラストラクチャシステム1602が受信した顧客のサブスクリプションなどをプロビジョニング、管理、および追跡するための機能などを含んでもよい。
【0287】
一実施形態において、
図16に示すように、クラウド管理機能は、オーダー管理モジュール1620、オーダーオーケストレーションモジュール1622、オーダープロビジョ
ニングモジュール1624、オーダー管理/監視モジュール1626、および素性管理モジュール1628など、1つ以上のモジュールによって提供されてもよい。これらのモジュールは、1つ以上のコンピュータおよび/またはサーバを含んでもよく、または、これらを使用して提供されてもよい。1つ以上のコンピュータおよび/またはサーバは、汎用コンピュータ、専用サーバコンピュータ、サーバファーム、サーバ・クラスタ、またはその他の適切な配置および/もしくは組合せであり得る。
【0288】
例示的な動作では、ステップ1634において、クライアントコンピューティングデバイス1604、1606、または1608などのクライアントデバイスを使用している顧客は、クラウドインフラストラクチャシステム1602が提供する1つ以上のサービスを要求し、クラウドインフラストラクチャシステム1602が提供する1つ以上のサービスのサブスクリプションを注文することによって、クラウドインフラストラクチャシステム1602と対話してもよい。特定の実施形態において、顧客は、クラウドユーザインタフェース(UI:User Interface)1612、クラウドUI1614、および/またはクラウドUI1616などのクラウドUIにアクセスし、これらのUIを介してサブスクリプションの注文を行ってもよい。顧客が注文をすることに応答してクラウドインフラストラクチャシステム1602が受信するオーダー情報は、この顧客を特定する情報、および、クラウドインフラストラクチャシステム1602が提供する、顧客がサブスクリプションをする目的の1つ以上のサービスを含んでもよい。
【0289】
ステップ1636において、顧客から受けたオーダー情報を、オーダーデータベース1618に格納してもよい。これが、新しいオーダーである場合、オーダーについての新しい記録を作成してもよい。一実施形態において、オーダーデータベース1618は、クラウドインフラストラクチャシステム1618によって操作され、他のシステム要素と共に操作されるいくつかのデータベースのうちの1つであり得る。
【0290】
ステップ1638において、オーダー情報がオーダー管理モジュール1620に転送されてもよい。オーダー管理モジュール1620は、注文の確認、確認後の注文の登録など、注文に関する課金機能および会計機能を実行するように構成されてもよい。
【0291】
ステップ1640において、注文に関する情報がオーダーオーケストレーションモジュール1622に伝送されてもよい。オーダーオーケストレーションモジュール1622は、顧客が行った注文に関するサービスおよびリソースのプロビジョニングをオーケストレーションするように構成される。場合によっては、オーダーオーケストレーションモジュール1622は、オーダープロビジョニングモジュール1624のサービスをプロビジョニングのために使用してもよい。特定の実施形態において、オーダーオーケストレーションモジュール1622は、各オーダーに対応付けられたビジネスプロセスの管理を可能にし、ビジネスロジックを適用して、オーダーがプロビジョニングに取り掛かるべきかどうかを判断する。
【0292】
図16に表した実施形態に示すように、ステップ1642において、新しいサブスクリプションの注文を受けると、オーダーオーケストレーションモジュール1622は、サブスクリプションの注文を満たすために必要なリソースを割り当て、かつ、リソースを構成する要求を、オーダープロビジョニングモジュール1624に送信する。オーダープロビジョニングモジュール1624は、顧客が申し込んだサービスのためのリソースの割り当てを有効にする。オーダープロビジョニングモジュール1624は、クラウドインフラストラクチャシステム1600が提供するクラウドサービスと、要求されたサービスを提供するためのリソースをプロビジョニングするために使用される物理実施層との間に抽象度を設ける。これによって、サービスおよびリソースがオンザフライで実際にプロビジョニングされたかどうか、または予めプロビジョニングされて要求された場合にのみ割り当て
られたかどうかなどの実装の詳細からオーダーオーケストレーションモジュール1622を切り離すことが可能になる。
【0293】
ステップ1644において、サービスおよびリソースがプロビジョニングされると、要求されたサービスが使える用意が整ったことを示す通知がサブスクリプションをしている顧客に送られてもよい。ある場合において、要求されたサービスを顧客が使用し始めることを可能にする情報(たとえば、リンク)が、顧客に送られてもよい。
【0294】
ステップ1646において、顧客のサブスクリプションの注文が、オーダー管理/監視モジュール1626よって管理および追跡されてもよい。場合によっては、オーダー管理/監視モジュール1626は、顧客のサブスクリプションしているサービスの使用に関する使用統計データを収集するように構成されてもよい。たとえば、使用されたストレージの量、転送されたデータの量、ユーザの数、ならびにシステムの稼働時間およびシステムの休止時間などについての統計データが収集されてもよい。
【0295】
特定の実施形態において、クラウドインフラストラクチャシステム1600は、素性管理モジュール1628を備えてもよい。素性管理モジュール1628は、クラウドインフラストラクチャシステム1600におけるアクセス管理およびアクセス認可サービスなどの素性サービスを提供するように構成される。いくつかの実施形態では、素性管理モジュール1628は、クラウドインフラストラクチャシステム1602が提供するサービスを利用したい顧客についての情報を制御/管理してもよい。このような情報は、このような顧客の素性を認証する情報、および、様々なシステムリソース(たとえば、ファイル、ディレクトリ、アプリケーション、通信ポート、メモリセグメントなど)に対してそれらの顧客がどのような操作を行うことが承認されているのかを記述する情報を含み得る。また、素性管理モジュール1628は、各顧客についての記述情報の管理、およびその記述情報が誰によってどのようにアクセスおよび変更され得るかについての管理を含んでもよい。
【0296】
図17は、本開示の実施形態を実施するために使用され得る例示的なコンピュータシステム1700を示す図である。いくつかの実施形態では、コンピュータシステム1700は、上述した様々なサーバおよびコンピュータシステムのうちのいずれかを実現するために使用されてもよい。
図17に示すように、コンピュータシステム1700は、バス・サブシステム1702を介していくつかの周辺サブシステムと通信する処理装置1704を含んだ様々なサブシステムを含む。これらの周辺サブシステムは、処理高速化装置1706と、I/Oサブシステム1708と、ストレージサブシステム1718と、通信サブシステム1724とを含んでもよい。ストレージサブシステム1718は、有形のコンピュータ読み取り可能な記憶媒体1722と、システムメモリ1710とを含んでもよい。
【0297】
バス・サブシステム1702は、コンピュータシステム1700の様々な構成要素およびサブシステムを互いに意図した通りに通信させるためのメカニズムを提供する。バス・サブシステム1702は、1つのバスとして図示されているが、バス・サブシステムの別の実施形態は、複数のバスを利用してもよい。バス・サブシステム1702は、各種のバスアーキテクチャを使用するメモリバスまたはメモリコントローラ、周辺バス、およびローカルバスを含むいくつかの種類のバス構造のうちのいずれかであってもよい。たとえば、このようなアーキテクチャは、ISA(Industry Standard Architecture)バス、MCA(Micro Channel Architecture)バス、EISA(Enhanced ISA)バス、VESA(Video Electronics Standards Association)ローカルバス、およびPCI(Peripheral Component Interconnect)バスを含んでもよく、これらは、IEEE P1386.1標準規格に準拠して製造されるMezzanineバスなどとして実現され得る。
【0298】
処理サブシステム1704は、コンピュータシステム1700の動作を制御し、1つ以上の処理装置1732、1734などを備えてもよい。処理装置は、シングルコア・プロセッサまたはマルチコア・プロセッサを含む1つ以上のプロセッサ、プロセッサの1つ以上のコア、またはそれらの組合せを含んでもよい。いくつかの実施形態では、処理サブシステム1704は、グラフィックスプロセッサ、デジタル・シグナル・プロセッサ(DSP)など、1つ以上の専用コプロセッサを含み得る。いくつかの実施形態では、処理サブシステム1704の処理装置の一部またはすべては、特定用途向け集積回路(ASIC)、またはフィールド・プログラマブル・ゲート・アレイ(FPGA)など、カスタム回路を使用して実現され得る。
【0299】
いくつかの実施形態では、処理サブシステム1704に含まれる処理装置は、システムメモリ1710に、または、コンピュータ読み取り可能な記憶媒体1722上に格納された命令を実行できる。様々な実施形態において、処理装置は、いろいろなプログラムまたはコード命令を実行し、複数の同時に動作しているプログラムまたはプロセスを維持できる。いつでも、実行されるプログラムコードの一部またはすべては、システムメモリ1710に、および/または、1つ以上の記憶装置上を可能性として含むコンピュータ読み取り可能な記憶媒体1722上に存在し得る。適したプログラミングを通して、処理サブシステム1704は、様々な機能を提供できる。
【0300】
特定の実施形態において、カスタマイズされた処理を実行するための、または、コンピュータシステム1700によって実行される全体的な処理を高速化させるために処理サブシステム1704によって実行される処理のうちのいくつかの負荷を軽減させるための処理高速化装置1706が提供されてもよい。
【0301】
I/Oサブシステム1708は、コンピュータシステム1700に情報を入力するためのデバイスおよびメカニズムならびに/またはコンピュータシステム1700を介して情報を出力するためのデバイスおよびメカニズムを含んでもよい。一般に、用語「入力装置」の使用は、コンピュータシステム1700に情報を入力するためのあらゆる種類のデバイスおよびメカニズムを含む意図がある。ユーザインタフェース入力装置は、たとえば、キーボード、マウスもしくはトラックボールなどのポインティングデバイス、タッチパッドもしくはディスプレイに組み込まれたタッチスクリーン、スクロールホイール、クリックホイール、ダイヤル、ボタン、スイッチ、キーパッド、ボイスコマンド認識システムを有する音声入力装置、マイクロホン、および他の種類の入力装置を含んでもよい。また、ユーザインタフェース入力装置は、ユーザが入力装置を制御およびそれとやり取りすることを可能にするMicrosoft Kinect(登録商標)モーションセンサ、Microsoft Xbox(登録商標)360ゲームコントローラ、ジェスチャコマンドおよび音声コマンドを用いた入力を受け付けるためのインタフェースを提供するデバイスなど、動き検知デバイスおよび/またはジェスチャ認識デバイスを含んでもよい。また、ユーザインタフェース入力装置は、ユーザの目の行動(たとえば、写真を撮影しているおよび/またはメニュー選択を行っている間の「まばたき」)を検出し、目の仕草(eye gesture)を入力装置(たとえば、Google Glass(登録商標))への入力とし
て変形させるGoogle Glass(登録商標)まばたき検出装置などのアイジェスチャ認識デバイスを含んでもよい。これに加えて、ユーザインタフェース入力装置は、ユーザがボイスコマンドによって音声認識システム(たとえば、Siri(登録商標)ナビゲータ)とやり取りすることを可能にする音声認識検知デバイスを含んでもよい。
【0302】
ユーザインタフェース入力装置のその他の例として、3次元(3D)マウス、ジョイスティックもしくはポインティングスティック、ゲームパッドおよびグラフィックタブレット、ならびに、スピーカ、デジタルカメラ、デジタルカムコーダー、ポータブルメディアプレーヤ、ウェブカム、イメージスキャナ、指紋スキャナ、バーコードリーダ3Dスキャ
ナ、3Dプリンタ、レーザー測距器、および視線追跡装置などのオーディオ/ビジュアル装置が挙げられるが、これらに限定されない。これに加えて、ユーザインタフェース入力装置は、たとえば、コンピュータ断層撮影法、磁気共鳴画像、陽電子放出断層撮影装置、超音波検査デバイスなど、医用画像入力装置を含んでもよい。また、ユーザインタフェース入力装置は、たとえば、MIDIキーボード、デジタル楽器などのオーディオ入力装置を含んでもよい。
【0303】
ユーザインタフェース出力装置は、表示サブシステム、インジケーターライト、または音声出力装置などの非視覚的表示装置などを含んでもよい。表示サブシステムは、ブラウン管(CRT)、液晶ディスプレイ(LCD)またはプラズマディスプレイを使用するものなどのフラットパネル表示装置、投影装置、タッチスクリーンなどであってもよい。一般に、用語「出力装置」の使用は、コンピュータシステム1700からユーザまたは他のコンピュータに情報を出力するためのあらゆる種類のデバイスおよびメカニズムを含むことを意図する。たとえば、ユーザインタフェース出力装置は、モニタ、プリンタ、スピーカ、ヘッドホン、自動車ナビゲーションシステム、作図装置、音声出力装置、およびモデムなど、文字、図形、および音声/映像情報を視覚的に伝えるいろいろな表示装置を含み得るが、これらに限定されない。
【0304】
ストレージサブシステム1718は、コンピュータシステム1700が使用する情報を格納するためのリポジトリまたはデータストアを提供する。ストレージサブシステム1718は、いくつかの実施形態の機能を提供する基本プログラミング構成およびデータ構成を格納するための有形の非一時的なコンピュータ読み取り可能な記憶媒体を提供する。処理サブシステム1704によって実行されると上述の機能を提供するソフトウェア(プログラム、コードモジュール、命令)がストレージサブシステム1718に格納されてもよい。ソフトウェアは、処理サブシステム1704の1つ以上の処理装置によって実行されてもよい。また、ストレージサブシステム1718は、本開示に従って使用されるデータを格納するためのリポジトリを提供してもよい。
【0305】
ストレージサブシステム1718は、揮発性メモリ素子および不揮発性メモリ素子を含む、1つ以上の非一時的なメモリ素子を含んでもよい。
図17に示すように、ストレージサブシステム1718は、システムメモリ1710と、コンピュータ読み取り可能な記憶媒体1722とを備える。システムメモリ1710は、プログラムを実行中に命令およびデータを格納するための揮発性のメインRAM(Random Access Memory)、および、固定の命令が格納される不揮発性ROM(Read Only Memory)またはフラッシュメモリを含む、いくつかのメモリを含んでもよい。いくつかの実装形態において、起動中などで、コンピュータシステム1700内の要素間で情報を転送することを助ける基本ルーチンを含んだBIOS(Basic Input/Output System)は、通常、ROMに格納されてもよい。RA
Mは、通常、処理サブシステム1704が現在操作および実行していているデータおよび/またはプログラムモジュールを含む。いくつかの実装形態において、システムメモリ1710は、SRAM(Static Random Access Memory)またはDRAM(Dynamic Random Access Memory)など、複数の異なる種類のメモリを含んでもよい。
【0306】
一例として、限定ではないが、
図17に示すように、システムメモリ1710は、クライアントアプリケーション、ウェブブラウザ、ミッドティア・アプリケーション、リレーショナルデータベース管理システム(RDBMS:Relational Database Management Systems)などを含み得るアプリケーションプログラム1712と、プログラムデータ1714と、オペレーティングシステム1716とを格納してもよい。一例として、オペレーティングシステム1716は、様々なバージョンのMicrosoft Windows(登録商標)、Apple Macintosh(登録商標)、および/もしくはLinuxオペレーティングシステム、いろいろな市販のUNIX(登録商標)もしくはUNIX
に似たオペレーティングシステム(いろいろなGNU/Linuxオペレーティングシステム、Google Chrome(登録商標)OSなどを含むが、これらに限定されない)、ならびに/またはiOS、Windows(登録商標)Phone、Android(登録商標)OS、BlackBerry(登録商標)10OS、およびPalm(登録商標)OSオペレーティングシステムなど、モバイルオペレーティングシステムを含んでもよい。
【0307】
コンピュータ読み取り可能な記憶媒体1722は、いくつかの実施形態の機能を提供するプログラミング構成およびデータ構成を格納してもよい。処理サブシステム1704によって実行されると上述した機能をプロセッサに提供するソフトウェア(プログラム、コードモジュール、命令)がストレージサブシステム1718に格納されてもよい。一例として、コンピュータ読み取り可能な記憶媒体1722は、ハードディスクドライブなどの不揮発性メモリ、磁気ディスクドライブ、CD ROM、DVD、Blu-Ray(登録商標)ディスクなどの光ディスクドライブまたは他の光学媒体を含んでもよい。コンピュータ読み取り可能な記憶媒体1722は、Zip(登録商標)ドライブ、フラッシュメモリーカード、USB(Universal Serial Bus)フラッシュドライブ、SD(Secure Digital)カード、DVDディスク、デジタルビデオテープなどを含んでもよいが、これらに限定されない。また、コンピュータ読み取り可能な記憶媒体1722は、フラッシュメモリベースのSSD(Solid-State Drives)、エンタープライズフラッシュドライブ、ソリッドステートROMなど、不揮発性メモリに基づくSSD(Solid-State Drives)と、ソリッドステートRAM、動的RAM、静的RAM、DRAMベースのSSDなど、揮発性メモリに基づくSSDと、MRAM(Magnetoresistive RAM)SSDと、DRAMとフラッシュメモリベースのSSDとの組合せを使用するハイブリッドSSDとを含んでもよい。コンピュータ読み取り可能な媒体1722は、コンピュータ読み取り可能な命令、データ構造、プログラムモジュール、およびその他のコンピュータシステム1700用データの不揮発性ストレージを提供してもよい。
【0308】
また、特定の実施形態において、ストレージサブシステム1700は、コンピュータ読み取り可能な記憶媒体1722にさらに接続できるコンピュータ読み取り可能な記憶媒体リーダ1720を含んでもよい。あるいは、システムメモリ1710と合わせて、または、必要に応じてシステムメモリ1710と組み合わせて、コンピュータ読み取り可能な記憶媒体1722は、遠隔の記憶装置、ローカル記憶装置、固定記憶装置、および/またはリム―バブル記憶装置、ならびにコンピュータ読み取り可能な情報を格納するための記憶媒体を包括的に表してもよい。
【0309】
特定の実施形態において、コンピュータシステム1700は、1台以上の仮想マシンを実行するためのサポートを提供してもよい。コンピュータシステム1700は、仮想マシンの構成および管理を容易にするためのハイパーバイザなどのプログラムを実行してもよい。各仮想マシンには、メモリ、コンピュータ(たとえば、プロセッサ、コア)、I/O、およびネットワーキング・リソースが割り当てられてもよい。各仮想マシンは、通常、それ自体のオペレーティングシステムを実行する。このオペレーティングシステムは、コンピュータシステム1700が実行する他の仮想マシンによって実行されるオペレーティングシステムと同じまたは異なってもよい。よって、コンピュータシステム1700によって複数のオペレーティングシステムが同時に実行される可能性がある。各仮想マシンは、一般に、その他の仮想マシンとは別に実行される。
【0310】
通信サブシステム1724は、他のコンピュータシステムおよびネットワークへのインタフェースを提供する。通信サブシステム1724は、コンピュータシステム1700からデータを受信し、コンピュータシステム1700から他のシステムにデータを送信するためのインタフェースとして機能する。たとえば、通信サブシステム1724は、1つ以
上のクライアントコンピューティングデバイスと情報を送受信するためにコンピュータシステム1700がインターネットを介してクライアントコンピューティングデバイスとの通信チャネルを確立することを可能にしてもよい。
【0311】
通信サブシステム1724は、有線通信プロトコルおよび/またはワイヤレス通信プロトコルをサポートしてもよい。たとえば、特定の実施形態において、通信サブシステム1724は、(たとえば、携帯電話技術、3G、4G、もしくはEDGE(Enhanced Data Rates For Global Evolution)などの次世代データネットワークテクノロジー、WiFi(IEEE802.11ファミリー標準規格)、他の移動体通信技術、またはそれらの任意の組合せを使用する)ワイヤレス音声ネットワークもしくは/またはデータネットワークにアクセスするためのRF(Radio Frequency)トランシーバコンポーネント、GPS
(Global Positioning System)レシーバコンポーネント、および/または他の構成要素
を含み得る。いくつかの実施形態では、通信サブシステム1724は、ワイヤレスインタフェースに加えて、またはワイヤレスインタフェースの代わりに、有線ネットワーク接続性(たとえば、Ethernet)を提供できる。
【0312】
通信サブシステム1724は、データを様々な形で送受信できる。たとえば、いくつかの実施形態では、通信サブシステム1724は、構造化および/または非構造化データフィード1726、イベントストリーム1728、イベント更新1730などの形で入力通信文を受信してもよい。たとえば、通信サブシステム1724は、Twitter(登録商標)フィード、Facebook(登録商標)更新、Rich Site Summary(RSS)フィードなどのウェブフィード、および/または1つ以上のサードパーティ情報ソースからのリアルタイム更新など、ソーシャルメディアネットワークおよび/またはその他のコミュニケーションサービスのユーザからのデータフィード1726をリアルタイムで受信(または送信)するように構成されてもよい。
【0313】
特定の実施形態では、通信サブシステム1724は、連続したデータストリームの形でデータを受信するように構成されてもよい。連続したデータストリームは、リアルタイムイベントのイベントストリーム1728および/またはイベント更新1730を含んでもよく、実際に明確な終端がない連続ストリームまた無限ストリームであってもよい。連続データを生成するアプリケーションとして、たとえば、センサーデータアプリケーション、チッカー、ネットワークパフォーマンス測定ツール(たとえば、ネットワーク監視およびトラフィック管理アプリケーション)、クリックストリーム分析ツール、自動車交通量監視などが挙げられてもよい。
【0314】
また、通信サブシステム1724は、コンピュータシステム1700に接続された1つ以上のストリーミングデータソースコンピュータと通信中であり得る1つ以上のデータベースに、構造化および/または非構造化データフィード1726、イベントストリーム1728、イベント更新1730などを出力するように構成されてもよい。
【0315】
コンピュータシステム1700は、手のひらサイズのポータブルデバイス(たとえば、iPhone(登録商標)携帯電話、iPad(登録商標)コンピューティングタブレット、PDA)、ウェアラブルデバイス(たとえば、Google Glass(登録商標)ヘッドマウントディスプレイ)、パーソナルコンピュータ、ワークステーション、メインフレーム、キオスク、サーバラック、またはその他のデータ処理システムを含む、様々な種類のうちの1つであり得る。
【0316】
変わり続けるというコンピュータおよびネットワークの性質のため、
図17に示すコンピュータシステム1700の説明は、具体例にすぎない。
図17に示すシステムよりも多いまたは少ない構成要素を有する多くの他の構成が可能である。本明細書に記載の開示お
よび教示に基づいて、当業者は、様々な実施形態を実現するための他のやり方および/または方法が分かるだろう。
【0317】
具体的な本開示の実施形態を説明したが、様々な変更例、代替例、代替的な構成、および均等物も本開示の範囲内に包含される。変更例は、開示された特徴の適切な組合せのいずれも含む。本開示の実施形態は、ある特定のデータ処理環境内の動作に制限されず、複数のデータ処理環境内で自由に動作することができる。これに加えて、特定の一連のトランザクションおよびステップを使用して本開示の実施形態を説明したが、本開示の範囲が記載の一連のトランザクションおよびステップに限られないことは、当業者に明らかであるはずである。上述の実施形態の様々な特徴および態様は、個々にまたは共同で使用されてもよい。
【0318】
さらに、ハードウェアとソフトウェアとの特定の組合せを使用して本開示の実施形態を説明したが、ハードウェアとソフトウェアとの他の組合せも、本開示の範囲内であることを認識されたい。本開示の実施形態は、ハードウェアのみ、もしくは、ソフトウェアのみで実現されてもよく、またはそれらの組合せを使用して実現されてもよい。本明細書に記載の様々なプロセスは、同じプロセッサまたは任意の組合せのそれぞれ異なるプロセッサ上で実現できる。よって、コンポーネントまたはモジュールが特定の動作を実行するように構成されると説明されている箇所では、このような構成は、たとえば、この動作を実行するように電子回路を設計することによって、この動作を実行するようにプログラム可能な電子回路(マイクロプロセッサなど)をプログラムすることによって、またはそれらの任意の組合せによって達成できる。プロセスは、プロセス間通信のための従来技術を含むいろいろな技術を使用して通信できるが、これに限定されず、それぞれ異なるペアプロセスは、異なる技術を使用してもよく、プロセスの同じペアは、異なる技術を別々のタイミングで使用してもよい。
【0319】
明細書および図面は、厳密ではなく、一例にすぎないと適宜みなされるべきである。しかしながら、添付の特許請求の範囲に記載のより広義の趣旨および範囲から逸脱することなく、追加、減算、削除、および他の変更ならびに変形がそれらに対してなされてもよいということは明白であろう。したがって、具体的な実施形態を説明したが、これらは限定を意図しない。様々な変更例および均等物は、添付の特許請求の範囲内である。
【手続補正書】
【提出日】2023-01-20
【手続補正1】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項1】
コンピュータにより実現される方法であって、
前記方法は、1つ以上のコンピュータシステムによって実行され、
時間の長さの間の1つ以上のプロセスのヒープ情報を決定するステップを含み、前記ヒープ情報は、前記時間の長さにおける複数の間隔の各々の第1季節のヒープ使用量情報および第1の季節因子を含み、前記方法は、さらに、
前記時間の長さの間の前記1つ以上のプロセスのスレッド情報を決定するステップを含み、前記スレッド情報は、前記時間の長さにおける前記複数の間隔の各々の第2季節の第2の季節因子を含み、前記方法は、さらに、
前記ヒープ情報を前記スレッド情報に相関させて、閾値を上回るヒープ使用量に対応する前記1つ以上のプロセスの1つ以上のコード部分を特定するステップと、
前記1つ以上のコード部分を特定したことに応答して、前記1つ以上のコード部分に関連する1つ以上のアクションを開始するステップとを含む、方法。
【請求項2】
前記時間の長さは、前記1つ以上のプロセスによるヒープ使用量が前記閾値を上回っているときに相当し、前記ヒープ使用量は、前記ヒープ使用量情報によって表される、請求項1に記載の方法。
【請求項3】
前記閾値は、前記複数の間隔の各々についてのヒープ使用量季節因子の範囲の所定の割合に少なくとも一部基づく、請求項2に記載の方法。
【請求項4】
前記ヒープ使用量は、前記時間の長さの間に前記1つ以上のプロセスによって使用されるヒープメモリの量に対応する、請求項2または3に記載の方法。
【請求項5】
前記時間の長さは、第1長さを有する第1期間と、第2長さを有する第2期間とにまたがり、
前記第1長さを有する前記第1期間は、第1種別の前記第1の季節因子および第2種別の前記第2の季節因子に各々が関連する第1の複数の季節に分割され、
前記第2長さを有する前記第2期間は、第3種別の前記第1の季節因子および第4種別の前記第2の季節因子に各々が関連する第2の複数の季節に分割され、
前記複数の間隔の各々は、前記第1の複数の季節のうちの1つまたは前記第2の複数の季節のうちの1つに対応付けられ、
前記複数の間隔の各々について、前記第1の季節因子は、前記間隔が対応付けられる前記第1の複数の季節のうちの1つまたは前記第2の複数の季節のうちの1つに関連し、
前記複数の間隔の各々について、前記第2の季節因子は、前記間隔が対応付けられる前記第1の複数の季節のうちの1つまたは前記第2の複数の季節のうちの1つに関連する、請求項1~4のいずれか1項に記載の方法。
【請求項6】
前記第1種別の前記第1の季節因子は、
前記第1の複数の季節の各々について、前記第1の複数の季節のうち前記第1季節の平均ヒープ使用量および前記第1長さを有する期間の平均ヒープ使用量に少なくとも一部基づいて、前記第1種別のヒープ使用量季節因子を決定すること、ならびに、
前記第1種別の前記ヒープ使用量季節因子、および第1スプライン関数に少なくとも一部基づいて、前記第1種別の前記第1の季節因子を取得すること、に少なくとも一部基づいて決定され、
前記第2種別の前記第2の季節因子は、
前記第2の複数の季節の各々について、前記第2の複数の季節のうち前記第1季節の平均ヒープ使用量および前記第2長さを有する期間の平均ヒープ使用量に少なくとも一部基づいて、前記第2種別のヒープ使用量季節因子を決定すること、ならびに、
前記第2種別の前記ヒープ使用量季節因子、および第2スプライン関数に少なくとも一部基づいて、前記第2種別の前記第2の季節因子を取得すること、に少なくとも一部基づいて決定される、請求項5に記載の方法。
【請求項7】
前記第2期間は、前記第1期間の直後に続く期間であり、
前記第1期間は、複数の第1ヒープ使用量季節因子および複数の第1スレッド強度季節因子に関連し、
前記第2期間は、複数の第2ヒープ使用量季節因子および複数の第2スレッド強度季節因子に関連し、
前記方法は、さらに、
前記複数の第1ヒープ使用量季節因子と、前記複数の第2ヒープ使用量季節因子とを連結することに少なくとも一部基づいて、ヒープ使用量季節因子のシーケンスを形成するステップと、
前記複数の第1スレッド強度季節因子と、前記複数の第2スレッド強度季節因子とを連結することに少なくとも一部基づいて、スレッド強度季節因子のシーケンスを形成するステップと、
前記ヒープ使用量季節因子のシーケンスに対して第1の平滑化スプラインフィットを実行し、前記ヒープ情報に含める平滑化後のヒープ使用量季節因子のシーケンスを生成するステップと、
前記スレッド強度季節因子のシーケンスに対して第2の平滑化スプラインフィットを実行し、前記スレッド情報に含める平滑化後のスレッド強度季節因子のシーケンスを生成するステップとを含み、
前記ヒープ情報と前記スレッド情報との前記相関は、前記平滑化後のヒープ使用量季節因子のシーケンス、および前記平滑化後のスレッド強度季節因子のシーケンスに少なくとも一部基づく、請求項5に記載の方法。
【請求項8】
前記第1期間は、平日に関連し、前記第2期間は、週末または祝祭日の少なくとも1つに関連する、請求項7に記載の方法。
【請求項9】
前記スレッド情報を決定するステップは、1つ以上のスレッドのクラスを決定するステップを含み、前記スレッド情報は、前記1つ以上のスレッドのクラスの各々について、前記複数の間隔の各々のスレッド強度情報およびスレッド強度季節因子を含む、請求項1~8のいずれか1項に記載の方法。
【請求項10】
前記ヒープ情報を前記スレッド情報に相関させるステップは、
前記複数の間隔の前記第1の季節因子ならびに前記スレッドのクラスおよび前記複数の間隔の前記第2の季節因子に少なくとも一部基づいて、前記1つ以上のスレッドのクラスの各々について、前記スレッドのクラスと前記1つ以上のプロセスによるヒープ使用量との相関度合いを決定するステップと、
前記相関度合いに少なくとも一部基づいて、前記1つ以上のスレッドのクラスをランク付けするステップと、
前記ランク付けに少なくとも一部基づいてスレッドのクラスを選択するステップと、
選択した前記スレッドのクラスに少なくとも一部基づいて、前記1つ以上のコード部分を特定するステップとを含む、請求項9に記載の方法。
【請求項11】
前記スレッドのクラスと前記1つ以上のプロセスによるヒープ使用量との前記相関度合いは、前記時間の長さにおける前記複数の間隔の各々の前記第1の季節因子および前記第2の季節因子のそれぞれの平均および/または分散の少なくとも一部基づいて、決定される、請求項10に記載の方法。
【請求項12】
前記1つ以上のスレッドのクラスを決定するステップは、
前記1つ以上のプロセスの1つ以上のスレッドダンプを取得するステップを含み、前記スレッドダンプの各々は、それぞれ異なる時間に対応し、前記1つ以上のスレッドのクラスを決定するステップは、さらに、
前記1つ以上のスレッドダンプの1つ以上のスレッドの各々について、前記スレッドに対応するスタックトレースに少なくとも一部基づいて前記スレッドを分類するステップを含み、前記スタックトレースは、前記スレッドダンプが出力されたときに前記スレッドが実行したコードを示す、請求項9~11のいずれか1項に記載の方法。
【請求項13】
前記スタックトレースに少なくとも一部基づいて前記スレッドを分類するステップは、
前記スタックトレースに含まれるスタックフレームの組合せに対応する第1のスレッドのクラスが存在するかどうかを判断するステップと、
前記スタックトレースに含まれるスタックフレームの組合せに対応する前記スレッドのクラスが存在するかどうかに基づいて、前記スタックトレースに含まれるスタックフレームの組合せに対応する第2のスレッドのクラスを作成することまたは前記スレッドを前記第1のスレッドのクラスに分類すること、のうち一方を行うステップとを含む、請求項12に記載の方法。
【請求項14】
前記1つ以上のアクションは、
前記1つ以上のコード部分に関連するアラートを生成すること、または、
使用されるヒープメモリの量を減らすまたは前記ヒープメモリの使用期間を減らすために前記1つ以上のコード部分を修正することに少なくとも一部基づいて、前記1つ以上のコード部分を最適化すること、のうち少なくとも一方を含む、請求項1~13のいずれか1項に記載の方法。
【請求項15】
1つ以上のプロセッサと、
前記1つ以上のプロセッサにアクセス可能なメモリとを備え、前記メモリは、1つ以上の命令を格納し、前記1つ以上の命令は、前記1つ以上のプロセッサによって実行されると、前記1つ以上のプロセッサに、
時間の長さの間の1つ以上のプロセスのヒープ情報を決定させ、前記ヒープ情報は、前記時間の長さにおける複数の間隔の各々の第1季節のヒープ使用量情報および第1の季節因子を含み、前記1つ以上のプロセッサに、さらに、
前記時間の長さの間の前記1つ以上のプロセスのスレッド情報を決定させ、前記スレッド情報は、前記時間の長さにおける前記複数の間隔の各々の第2季節の第2の季節因子を含み、前記1つ以上のプロセッサに、さらに、
前記ヒープ情報を前記スレッド情報に相関させて、閾値を上回るヒープ使用量に対応する前記1つ以上のプロセスの1つ以上のコード部分を特定させ、
前記1つ以上のコード部分を特定したことに応答して、前記1つ以上のコード部分に関連する1つ以上のアクションを開始させる、システム。
【請求項16】
請求項1~14のいずれか1項に記載の方法を1つ以上のプロセッサに実行させるためのコンピュータ読み取り可能なプログラム。
【外国語明細書】