(57)【特許請求の範囲】
【請求項１】
マルチコアCPUを持つシステム、マルチCPUで実現される計算機システム上で、ソフトウェアトレーサを用いてトレースを実施するトレースシステムにおいて、上記システムの動作しているプロセスのCPU使用率、メモリ使用量、動作しているCPU情報をOSの機能を用いてリソース監視機構が周期的に計測し、計測した結果をメモリ上に記録及び保持し、その計測した結果を元に最低のCPU使用率で動作しているCPUを特定し、そのCPUで動作しているプロセスを前記計測した結果を元に他のCPUで他全てのCPUの使用率が100%を超えずに動作させる様にプロセスの動作するCPUの再割り当てをスケジューリングし、システム制御機構がOSの提供するプロセスの動作するCPUの切り替え機能を使い、前記スケジューリングの結果を元に動作するCPUを切り替えることにより、CPU使用率がゼロになるCPUコアを作り出し、そのCPUコア上でトレーサを動作させるトレース統合制御機構を持つことを特徴とするトレースシステム。
【請求項２】
請求項1記載のトレースシステムにおいて、トレーサが動作する以外のCPU使用率の差がCPU間で最小となる様に、動作するプロセスのスケジューリングを実施することを特徴とするトレースシステム。
【請求項３】
請求項1記載のトレースシステムにおいて、リソース監視機構が保持するCPU若しくはCPUコア毎の平均処理使用率と、最大使用率を用い、最大使用率と平均使用率の差がユーザが定義した負荷の値より小さいCPU若しくはCPUコアとトレーサと同時に動作させることを特徴とするトレースシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のCPUやCPUコアを持つ計算機システムにて使用される、プログラム動作履歴（トレース）の収集方法に関するものである。
【背景技術】
【０００２】
計算機システムにおけるトレースデータ収集は、システムの動作履歴を取得することを目的とし、トレース対象が実行されるタイミングで、トレースに必要な内容、例えば実行内容や関連情報、時刻等を取得し、記録するものである。しかし、システムの負荷に比例し、トレースの負荷が高くなり、システムに対し副作用を与えるという問題が有った。その様な問題に対し、従来、計算機システムのCPU負荷量が高い場合や、トランザクションの流量が多い場合、その量を監視し、その量の変動に対応して収集するトレース量を段階的に増減可能にする方法が検討されている。特開平9-6652では、予め負荷量・トランザクション量に対応したトレース収集範囲を変更出来る切り替え手段と、トレース収集範囲の設定を記憶する記憶手段と、前記負荷・トランザクション量監視手段を持ち、前記監視結果を元に、切り替え手段を用いてトレース収集範囲を切り替え、負荷が高い時は、重要な情報を少量取得し、負荷が低い時は大量の情報を取得することで、システム負荷が高い際も、システムに与える影響を少なくし、トレースの連続性を保つ技術を提案している。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平９―６６５２
【発明の概要】
【発明が解決しようとする課題】
【０００４】
上記従来技術は、負荷の状態を監視し、その状態に合わせてトレース範囲を設定した内容に変更することで、負荷の増減に対応しているが、シングルＣＰＵ,シングルコアでの動作を前提としており、マルチコアシステムや、マルチCPUシステム上で、そのまま適用すると、効率が悪化する。例えば、いくつかのCPUコアを持ったシステムにおいて、一つのコアにおける負荷が急激に上昇した場合、システム全体としては、まだCPUリソースに余裕があったとしても、従来発明では、収集するトレース量を減らしてしまう。また、全くトレース取得範囲の設定が不適切で有る場合、最小限のトレースを実施しても、トレースによる負荷が発生し、システムの処理時間遅延等が発生する。
【課題を解決するための手段】
【０００５】
本発明は、マルチコアCPUや、複数のCPUを持つ計算機システム上で、ソフトウェアトレーサを使用する場合において、システムにかかっている負荷をリソース監視機構を用いて監視し、トレース統合制御機構が、負荷情報を元に、CPUコアをトレース専用に、若しくはトレースを取得するのに十分なリソースを確保出来る様、プロセスのCPU割り当てスケジュールを作成した後、システム制御機構を用いてプロセスの割り当てを実行し、トレース統合制御機構がトレーサの実行・停止制御を行う。
【発明の効果】
【０００６】
従来のトレース方式では、マルチコア、マルチCPU上で実行すると、一部のコアの負荷が増大し、他のコアのリソースが余っていても、トレース量が減ることや、トレースの取得範囲の設定が不適切な場合、最小限のトレースを実施していても、負荷が増大するという課題があった。それに対し、本発明は、マルチコア、マルチCPUでも全ての負荷を監視し、負荷を考慮してトレーサ以外のプロセスを、トレーサが動作するコア以外に割り当て、そののちトレーサを専用、若しくは負荷変動の低いプロセスのみと動作させることで、システムに対する副作用を軽減し、安定したトレースを実施する。また、トレース統合制御機構が、プロセスの移動スケジュールを実施する際に、コア間の負荷を平均化し、平均的にリソースを余らせることで、アプリの負荷が高騰しても、トレーサの停止時間を短くすることが出来る。
【図面の簡単な説明】
【０００７】
【図１】本発明の実施形態の全体構成の一例を示す図
【図２】トレーサの制御処理シーケンスの一例を示す図
【図３】負荷情報管理テーブルの一例を示す図
【図４】個別計測結果の一例を示す図
【図５】監視対象別負荷測定の処理シーケンスの一例を示す図
【図６】負荷情報取得の処理シーケンスの一例を示す図
【図７】スケジュール設定処理シーケンスの一例を示す図
【図８】負荷順リストの一例を示す図
【図９】制御情報の一例を示す図
【図１０】制御リストの一例を示す図
【図１１】本発明の第２の実施形態の全体構成の一例を示す図
【発明を実施するための形態】
【実施例１】
【０００８】
まず、本発明の第1の実施形態を説明する。
図１は、本発明によるトレース収集機能を備える計算機システムの構成図である。複数のコア102、103、1041、105から成るマルチコアCPU101と、システム制御機構114と、トレーサ115と、リソース監視機構116を含み、マルチコアCPU101を含む計算機を制御するOS106と、補助記憶装置109に記録された、後述する各種制御・監視プログラムや、システム上で動作する各種プログラム、後述する各種テーブル等をシステム動作時に展開しておくメモリ107と、メモリ107に対し、データの読み書きの制御を行うメモリコントローラ108と、各種プログラムや、後述する各種テーブル等を保存しておく補助記憶装置109と、補助記憶装置へのデータの読み書きの制御を行うI/Oコントローラ110と、CPU101とメモリ107や補助記憶装置109とのデータの受け渡しに使用するシステムバス111と、CPU101の各コア102,103,104,105の、各コアの負荷（使用率）や、バス111等の負荷情報を、後述するトレース統合制御機構115からの制御により収集し、記録するリソース監視機構112と、本システムの制御対象であり、システムの情報を収集するためのトレーサ113と、トレーサによる悪影響を軽減するために、リソース監視機構が収集した負荷情報を元に、プログラム（プロセス）の動作するCPUの割り当て変更スケジューリングを実施するシステム制御機構114と、リソース監視機構112,トレーサ113,システム制御機構114の統合的な制御を実施するトレース統合制御機構115からなる。
【０００９】
図2は、図1で示した本システムのトレース統合制御機構115が実施する、トレーサの制御処理シーケンスである。本処理は、トレーサ統合制御機構開始後、OSのタイマ機能等を使用して周期単位で実行される。開始後、まずステップS201に進み、監視対象別負荷測定処理が実行される。本処理では、リソース監視機構112を用い、負荷情報管理テーブル300に記載されている監視対象について、同じく記載されている監視手法304を用いて、監視対象の負荷を計測し、負荷情報管理テーブル300の内容を更新し、ステップS202スケジュール設定処理に進む。本処理の詳細は、別途図5を用いて説明する。ステップS202のスケジュール設定処理では、システム制御機構114を使い、取得した負荷情報と、プロセスの挙動情報を元に、動作中のシステムのCPUリソースの空き状態を調べ、トレーサ専用にCPUを割り当ててもシステムが十分動作するか評価し、動作可能と判定した場合は、開ける対象のCPU上で動作しているプロセスの、別CPUへの再配置するスケジューリングを実施し、スケジュール内容を図10で示す制御リスト1000として記録する。本ステップの詳細な説明は、図7を用いて別途説明する。本ステップ修了後、ステップS203に進む。ステップS203では、S202で実施されたスケジュール設定処理の結果を元に、n-1個のCPUで、システム上で動作するトレーサ以外のプロセスが動作可能か判定し、動作可能ならばステップS204に、不可能ならばステップS208に遷移する。ステップS204では、既にトレーサが動作しているかどうかを制御情報900のトレーサ動作状態カラムを参照し、判定する。トレーサが動作中の場合は、そのまま処理を終了する。トレーサが停止中の場合には、ステップS205に進む。ステップS205では、OS等が提供する機能、例えばLinuxではtasksetを使用し、制御リスト1000を参照し、動作中のプロセスをバインドするＣＰＵを変更する。変更修了後、ステップS206に進む。ステップS206トレーサ起動処理では、図１で示すトレーサ113を起動し、ステップS207に進む。ステップS207では、制御情報900のトレーサ動作状態906を、停止中から動作中に変更し、変更修了後、処理を終了する。ステップS208では、ステップS204と同様に、既にトレーサが動作しているかどうかを制御情報900のトレーサ動作状態906を参照し、判定する。トレーサが動作中の場合は、ステップS209に進む。トレーサが停止中の場合には、そのまま処理シーケンスを終了する。ステップS209トレーサ停止処理では、図１で示すトレーサ113を停止し、ステップS210に進む。ステップS210では、制御情報900のトレーサ動作状態９０６を、停止中から動作中に変更し、処理を終了する。
【００１０】
図3は、負荷情報管理テーブルの例である。本例では、CPUの負荷を監視対象にした場合を例にして説明する。負荷情報管理テーブル300は、監視順番と、監視対象数を記録するレコードである監視番号301と、監視対象のカテゴリを記録するレコードである監視対象302と、監視対象の詳細を記録するレコードである監視対象詳細303と、監視対象を監視する具体的手法や、手法を実装したプログラム等を記録するレコードである監視手法304と、リソース監視機構112によって取得したリソース負荷を記録するレコードである負荷305と、リソース統合制御機構115が、システム負荷の割り当て調整を実施する際に、一時的に情報を記録するレコードである予想負荷306からなる。本テーブルは、システム使用前は、補助記憶装置109に記録されており、本発明実行開始時等にメモリ上に展開する等の使い方を一般的にする。
【００１１】
図4は、個別計測結果の例である。本例では、CPUの負荷を監視対象にした場合を例にして説明する。図１に示す、本システム上で動作する全てのプロセスのIDを記録するレコードであるPID401と、PID毎に記録する内容について記録するレコードである監視対象402と、時間毎の負荷情報や、統計解析後の情報等を記録するレコードである負荷403からなる。監視対象402の例としては、各プロセスが与えるCPU負荷を記録するカラム項目であるCPU負荷404と、各プロセスが動作するCPUやCPUコアの名称を記録するカラム項目である動作CPU405と、各プロセスが使用するメモリ量を記録するカラム項目である使用メモリ406から成る。負荷403の例としては、単位時間毎の監視内容を記録するレコード計測値が、計測時間分存在する。また、先計測値の平均値を記録するレコードである平均408と、各項目の最大値を記録するレコードである最大値409からなる。本テーブルも図3同様、システム使用前は、補助記憶装置109に記録されており、本発明実行開始時等にメモリ上に展開する等の使い方を一般的にする。
【００１２】
図5は、図2の監視対象別負荷測定S201処理の詳細を表すシーケンス図である。ステップS501では、負荷情報管理テーブル300の情報を読み込み、ステップS502に遷移する。ステップS502では、ステップS501で取得した情報を元に、監視対象の有無を判断する。無い場合は、処理を終了する。有る場合、ステップS503に進む。ステップS503では、負荷情報管理テーブル300の情報を元に、監視対象の情報、監視手法を読み込み、ステップS504に進む。ステップS504では、ローカル変数iの初期化を行い、ステップS505に進む。ステップS505では、iの値が監視番号の最大値以下か判定する。最大値以下の場合、ステップS506に進む。それ以外の場合には、処理を終了する。ステップS506では、ステップS503で読み込んだ、負荷情報管理テーブル300 の監視手法情報と、監視対象の情報を元に、監視対象から負荷情報を取得する。一般的な例をあげると、Linuxのシステム等における/procファイルシステム以下にあるCPUの負荷情報や、プロセス単位で保有される/proc/[pid]/statの実行時間の情報等を取得する。これら情報を取得の後、ステップS507に進む。ステップS507では、ステップS506で取得した情報を、負荷情報管理テーブル300や、個別計測結果400に記録し、ステップS508に進む。ステップS508では、ローカル変数iをインクリメントし、ステップS505へ進む。
【００１３】
図6は図5のステップS506負荷情報取得の処理例を表わすシーケンス図である。開始後、まずステップS601に進み、/proc/[pid]/statの情報等を、OSの機能等を利用して取得する。例えば、Linuxが動作するシステムで/proc/[pid]/statの項目processor等を参照し、情報を取得、個別計測結果400のPID情報並びに動作CPU情報を更新する。個別計測結果更新後、ステップS602に進む。ステップS602では、プロセスカウント用のローカル変数を設定し、ステップS603に進む。ステップS603では、ローカル変数jが個別計測結果のPIDの最大値以下かどうかを判定する。判定以下の場合はステップS604に進み、そうでない場合は、処理を終了する。ステップS604ではPID=jが、チェックしているシステム上で動作しているかどうかをチェックする。動作している場合はステップS605に進み、動作していない場合は、ステップS607に進む。ステップS605では、プロセスが動作しているCPUが現在評価中のCPUで動作しているプロセスか否かチェックする。現在評価中のCPUで動作している場合は、ステップS606に進み、そうでない場合は、ステップS607に進む。ステップS606では、個別計測結果400に記録されている情報を参照し、負荷情報管理テーブル300の負荷305を更新してステップS607に進む。ステップS607では、ローカル変数をインクリメントしてステップS603に進む。
【００１４】
図７は、図2ステップS202のスケジュール設定処理例を表すシーケンス図である。本シーケンスでは、トレーサによる副作用を軽減するために、CPUコア等の未使用領域を作成するための、プロセス割り当てスケジューリングを実施する。開始後、まずステップS701に進み、負荷情報管理テーブル300の情報を参考に、最も負荷の低いCPU,また、次に負荷の低いCPUを引き当て、制御情報900に登録し、ステップS702にすすむ。ステップS702では、負荷情報管理テーブル700にある、負荷最低なCPU以外のすべてのCPUに対し、ステップS703を実行するために、最小負荷以外のCPUのループに当てはまるかの判定を実施と、ループ実行のためのローカル変数iの更新を実施する。ローカル変数iの値が、負荷情報管理テーブルの監視番号範囲内かつ、最も負荷が低いCPUの監視番号以外の際は、ステップS703に進み、それ以外の場合はステップS704に進む。ステップS703では、余剰CPUリソースという変数に対し、チェック対象のCPUiの余剰CPUリソース（100-CPUiの負荷）を追加する処理を実施する。この処理を、最小の負荷で動作していたCPU以外で実施し、その和を撮ることで、プロセス移動先のCPUがどの程度受け入れられるかを算出する。ステップS704では、負荷最小以外のCPUの空きの総和が、負荷最小のCPUの使用率より大きいか、小さいかを判定する。空きの総和が大きい場合は、負荷最小のCPUで動作していたプロセスの割り付けを、他のCPUにするためのスケジュール処理を実施するため、ステップS705に進む。空きの総和が小さい場合は、そのまま処理を終了する。ステップS705では、個別計測結果400の情報を元に、CPU毎に、プロセス負荷をキーにして、降順にソートを実施し、負荷順リスト800を作成し、ステップS706に進む。ここで、ソートアルゴリズムは何を使用しても構わない。ステップS706では、制御情報900の情報を参照し、ローカル変数iとjにそれぞれ、負荷最小であるCPUの名称、2番目に負荷が低いCPUの名称を割り当て、ステップS707に遷移する。ステップS707では、ローカル変数kに1を代入し、初期化を実施し、ステップS708へ進む。ステップS708では、負荷最小のCPUの負荷k番目のプロセスが有るか無いかの判定を実施する。負荷k番目のプロセスが有る場合は、ステップS709に進み、無い場合は、終了する。ステップS709では、2番目に負荷の低いCPUに、負荷最小のCPUで動作する負荷ｋ番目のプロセスが移動可能か判定する。具体的には、CPUｊ（2番目に負荷が大きいCPU）の負荷＋移動するプロセスｋの負荷を足したものが、100％を超えないか判定する。超えない場合、ステップS710に進み、超える場合は終了する。ステップS710では、制御リスト1000に対し、対象プロセスとしてiのｋ番目のプロセスIDを書きこみ、制御リストの移動前のCPUカラムにiを,移動先のCPUカラムにjを登録し、ステップS711に進む。ステップS711では、負荷情報管理テーブル300の予想負荷のCPU jの予想負荷に、iのｋ番目の負荷を追加し、ステップS712に進む、ステップS712では、負荷情報管理テーブルの情報を参照に、2番目に負荷が少ないCPUを求め、jを更新し、ステップS713に進む。ステップS713では、ｋの値をインクリメントしてS708に戻る。
【００１５】
図８は負荷順リストの例である。本例は、CPUの負荷を監視対象にした場合を例にして説明する。監視対象の区別や、管理に使用するレコードである監視番号801と、監視対象のカテゴリを記録するレコードである監視対象802と、監視対象の詳細を記録するレコードである監視対象詳細803と、負荷測定後、監視対象の負荷要因をキーに、降順に並べたリストから構成される順序804から成る。
【００１６】
図９は、制御情報の例である。本例は、CPUの負荷を監視対象にした場合を例にして説明する。本システムの運用上、一時的に記録する項目を記録するレコードである記録項目901と、記録項目に該当する内容を記録するレコードである記録内容902からなる。また、本例の場合は、以下の様な内容が、記録項目901に登録される。負荷最小のCPU名称を記録するカラム負荷最小のCPU903と、2番目に負荷が低いCPUの名称を記録するカラム2番目に負荷が低いCPU904と、余剰CPUリソースの量を記録すカラム余剰CPUリソース905と、トレーサが動作しているか、停止しているかの状態を表すカラムトレーサ動作状態906からなる。
【００１７】
図１０は、制御リストの例である。本例は、CPUの負荷を監視対象にした場合を例にして説明する。制御する順番を記録するカラムである制御順序1001と、制御を実施する対象であるプロセスの番号を記録するカラムである対象プロセス1002と、制御対象のプロセスがそれまで動作していたCPU名称を記録するカラムである移動前CPU1003と、制御対象のプロセスを移動させる先のCPU名称を記録する移動先CPU名称1004からなる。
【実施例２】
【００１８】
実施例1では、マルチコアのCPUの使用率を例に説明したが、同様にメモリリソースを監視して、トレーサの制御を実施しても構わない。例えばOSがLinuxの場合は、実施例１と同様にメモリサイズの情報を取得することが可能であり、メモリのサイズをトリガーにトレーサの起動終了・停止が可能である。
【実施例３】
【００１９】
図11に示すように、リソース監視装置1112や、システム制御装置1113はハードウェア等で実装され、OSに含まれなくても構わない。
【実施例４】
【００２０】
図１のリソース監視機構112,トレーサ113,システム制御機構114は、OSの内部に含まれていない、OS上で動作するアプリケーションとして実装されていても構わない。また、トレース統合制御機構115は、OSの機能として実装されていても構わない。
【実施例５】
【００２１】
図7で示したスケジューリングアルゴリズムは、一般的なスケジューリングアルゴリズムを実装しても構わない。例えば、動的計画法等の最適化アルゴリズムを採用して、負荷の最適化をしてプロセスを配分してもよい。また、図7では、負荷最小のCPUから、次に負荷の低いCPUに対し、負荷の大きいプロセスから移動させ、移動の都度2番目に負荷の低いCPUをさがし、処理を継続することで、トレーサを動作させるCPU以外の負荷を平均化させる様にしているが、個別計測結果400の項目の一つである平均408と、最大値409を利用し、平均と最大値の差を評価し、差がユーザの定義した値より小さい物とならば、トレーサを共存可能とすることで、更にトレーサの停止する期間を短縮しても構わない。
【産業上の利用可能性】
【００２２】
本発明は、複数のCPUやCPUコアを持つ計算機システムにおいて、プログラム動作履歴（トレース）を収集するトレースシステムとして利用される。
【符号の説明】
【００２３】
101…CPU
102、103、104、105…コア
106…OS
107…メモリ
108…メモリコントローラ
109…補助記憶装置
110…I/Oコントローラ
111…システムバス
112…リソース監視機構
113…トレーサ
114…システム制御機構
115…トレース統合制御機構
116…リソース監視機構
【図１】
0005470177.tif 000002
【図２】
0005470177.tif 000003
【図３】
0005470177.tif 000004
【図４】
0005470177.tif 000005
【図５】
0005470177.tif 000006
【図６】
0005470177.tif 000007
【図７】
0005470177.tif 000008
【図８】
0005470177.tif 000009
【図９】
0005470177.tif 000010
【図１０】
0005470177.tif 000011
【図１１】
0005470177.tif 000012