図面 (/)

技術 資源使用量集計プログラム、資源使用量集計方法及び資源使用量集計装置

出願人 富士通株式会社
発明者 秋元秀行安島雄一郎三浦健一岡本高幸安達知也住元真司
出願日 2013年1月31日 (6年5ヶ月経過) 出願番号 2013-016970
公開日 2014年8月21日 (4年10ヶ月経過) 公開番号 2014-149606
状態 拒絶査定
技術分野 ストアードプログラム デバッグ/監視
主要キーワード 有効要素 割り当て関数 ディスク記憶領域 分別情報 C言語 呼び出し履歴 局所データ フック関数
関連する未来課題
重要な関連分野

この項目の情報は公開日時点(2014年8月21日)のものです。
また、この項目は機械的に抽出しているため、正しく解析できていない場合があります

図面 (20)

課題

コンピュータプログラムを実行する際に使用する資源について、コンピュータがプログラムを実行する単位であるプロセスより小さなライブラリなどの処理単位で使用量を集計すること。

解決手段

メモリ割当開放置換部120がメモリ割当・開放部130の呼び出しをフックする。そして、メモリ割当・開放置換部120は、動的に使用されるメモリ量の集計に必要な情報を生成してログファイル300に書き込むとともに、メモリ割当・開放部130を呼び出してメモリ割り当てや開放を行う。そして、集計処理部200が、ログファイル300を読み込んで動的ライブラリ毎、関数毎又はスレッド毎に、動的に使用されるメモリ量を集計する。

概要

背景

近年、コンピュータプログラムは利便性や機能向上のために複雑・巨大化している。このため、プログラムをゼロから全て開発することは不可能に近く、汎用的に使用されるプログラムはライブラリ化が進んでいる。すなわち、ソフトウェア開発者は、複雑・巨大なプログラムをライブラリを使用することで効率よく開発することができる。

プログラム及びライブラリの開発では、メモリなどのハードウェア資源を有効に活用するために、ハードウェア資源の使用量を意識したプログラミングが必要である。そこで、ハードウェア資源の使用量に関する情報を提供する技術が開発されている。

例えば、多くのオペレーティングシステムは、システム全体のメモリ使用量プロセス単位のメモリ使用量を測定・表示する事が可能である。ここで、使用メモリにはOSメモリ、プログラムメモリバッファメモリキャッシュメモリ共有メモリなどがあり、一部のコマンドや集計では、使用メモリの一部を個別に表示することが可能である。

また、複数のサブシステムで共通に使用されるシステム共通領域サブシステム毎の使用量を記録するメモリ使用情報テーブルを設け、メモリ使用情報テーブルの内容を出力可能とする技術が開示されている(例えば、特許文献1参照。)。また、メモリ・プールから使用することのできるメモリのサイズに基づきメモリ使用状況プロファイルを生成し、生成したメモリ使用状況プロファイルを用いて、メモリ不足例外が発生するおそれがあるか否かを予測する技術が開示されている(例えば、特許文献2参照。)。また、不測にメモリ割り当てが不可能な状態に陥ることを防ぐために、アプリケーションプログラムからメモリ領域の使用状況を確認できるようにする技術が開示されている(例えば、特許文献3参照。)。

概要

コンピュータがプログラムを実行する際に使用する資源について、コンピュータがプログラムを実行する単位であるプロセスより小さなライブラリなどの処理単位で使用量を集計すること。メモリ割当開放置換部120がメモリ割当・開放部130の呼び出しをフックする。そして、メモリ割当・開放置換部120は、動的に使用されるメモリ量の集計に必要な情報を生成してログファイル300に書き込むとともに、メモリ割当・開放部130を呼び出してメモリ割り当てや開放を行う。そして、集計処理部200が、ログファイル300を読み込んで動的ライブラリ毎、関数毎又はスレッド毎に、動的に使用されるメモリ量を集計する。

目的

本発明は、1つの側面では、ハードウェア資源の使用量削減に有用な情報をソフトウェア開発者に提供する

効果

実績

技術文献被引用数
1件
牽制数
0件

この技術が所属する分野

ライセンス契約や譲渡などの可能性がある特許掲載中! 開放特許随時追加・更新中 詳しくはこちら

請求項1

コンピュータに、前記コンピュータがプログラムを実行する際に使用する資源について、前記コンピュータが前記プログラムを実行する処理単位であるプロセスより小さな処理単位で、前記資源の使用量を集計させ、集計した前記資源の使用量を前記処理単位で出力させることを特徴とする資源使用量集計プログラム

請求項2

前記資源の使用量の集計は、前記コンピュータに、前記資源の割り当てを要求する割り当て関数の呼び出しを、集計に必要な処理を行わせるとともに、前記割り当て関数を呼び出すフック割り当て関数の実行によりフックさせ、前記資源の開放を要求する開放関数の呼び出しを、集計に必要な処理を行わせるとともに、前記解放関数を呼び出すフック開放関数の実行によりフックさせることを特徴とする請求項1記載の資源使用量集計プログラム。

請求項3

前記資源の使用量の集計は、前記コンピュータに、前記プログラムを実行させるとともに、前記フック割り当て関数及びフック開放関数が集計に必要な情報をそれぞれログ情報として出力させ、前記プログラムの実行後に前記ログ情報を用いて前記資源の使用量を集計させることを特徴とする請求項2記載の資源使用量集計プログラム。

請求項4

前記資源の使用量の集計は、前記コンピュータに、前記フック割り当て関数及び前記フック開放関数が前記プログラムの実行中に、前記資源の使用量を集計させることを特徴とする請求項2記載の資源使用量集計プログラム。

請求項5

前記処理単位は、動的ライブラリ、動的ライブラリに含まれる関数又はスレッドであることを特徴とする請求項1〜4のいずれか1項に記載の資源使用量集計プログラム。

請求項6

前記処理単位は、動的ライブラリの各呼び出し又は動的ライブラリに含まれる関数の各呼び出しであることを特徴とする請求項1〜4のいずれか1項に記載の資源使用量集計プログラム。

請求項7

前記集計する処理は、前記コンピュータに、前記プログラムの実行時間を所定の時間間隔で分割させ、各時間間隔における前記資源の使用量を集計させることを特徴とする請求項1〜4のいずれか1項に記載の資源使用量集計プログラム。

請求項8

コンピュータが、前記コンピュータがプログラムを実行する際に使用する資源について、前記コンピュータが前記プログラムを実行する処理単位であるプロセスより小さな処理単位で、前記資源の使用量を集計し、集計した前記資源の使用量を前記処理単位で出力することを特徴とする資源使用量集計方法

請求項9

プログラムを実行する際に使用する資源について、前記プログラムを実行する処理単位であるプロセスより小さな処理単位で、前記資源の使用量を集計する集計部と、前記集計部が集計した前記資源の使用量を前記処理単位で出力する出力部を有することを特徴とする資源使用量集計装置

技術分野

0001

本発明は、資源使用量集計プログラム、資源使用量集計方法及び資源使用量集計装置に関する。

背景技術

0002

近年、コンピュータプログラムは利便性や機能向上のために複雑・巨大化している。このため、プログラムをゼロから全て開発することは不可能に近く、汎用的に使用されるプログラムはライブラリ化が進んでいる。すなわち、ソフトウェア開発者は、複雑・巨大なプログラムをライブラリを使用することで効率よく開発することができる。

0003

プログラム及びライブラリの開発では、メモリなどのハードウェア資源を有効に活用するために、ハードウェア資源の使用量を意識したプログラミングが必要である。そこで、ハードウェア資源の使用量に関する情報を提供する技術が開発されている。

0004

例えば、多くのオペレーティングシステムは、システム全体のメモリ使用量プロセス単位のメモリ使用量を測定・表示する事が可能である。ここで、使用メモリにはOSメモリ、プログラムメモリバッファメモリキャッシュメモリ共有メモリなどがあり、一部のコマンドや集計では、使用メモリの一部を個別に表示することが可能である。

0005

また、複数のサブシステムで共通に使用されるシステム共通領域サブシステム毎の使用量を記録するメモリ使用情報テーブルを設け、メモリ使用情報テーブルの内容を出力可能とする技術が開示されている(例えば、特許文献1参照。)。また、メモリ・プールから使用することのできるメモリのサイズに基づきメモリ使用状況プロファイルを生成し、生成したメモリ使用状況プロファイルを用いて、メモリ不足例外が発生するおそれがあるか否かを予測する技術が開示されている(例えば、特許文献2参照。)。また、不測にメモリ割り当てが不可能な状態に陥ることを防ぐために、アプリケーションプログラムからメモリ領域の使用状況を確認できるようにする技術が開示されている(例えば、特許文献3参照。)。

先行技術

0006

特開平1−33642号公報
特開2007−157131号公報
特開2001−265650号公報

発明が解決しようとする課題

0007

しかしながら、ライブラリの開発においては、ライブラリ単体ではプログラムとして動作しないため、ライブラリを呼び出すテストプログラム等を使用して試験や評価が行われており、ライブラリ単体のハードウェア資源使用量を把握することは困難である。また、ライブラリ以外の開発においても、ソフトウェア開発者がライブラリ毎のハードウェア資源使用量を把握することは困難である。例えば、ソフトウェア開発者は、システム全体や、テストプログラムに対応するプロセス単位でメモリ使用量を把握することはできるが、ライブラリ単位のメモリ使用量を把握することはできない。

0008

ソースプログラムの全てが公開され、再コンパイル可能な状況であれば、ソースプログラムに改編を加えることでメモリ使用量をライブラリ毎に分類して集計することは不可能ではない。例えば、動的メモリの割り当て・開放関数周辺にメモリ使用ライブラリ・関数名を確認するための改変をソースプログラムに加えることにより、集計は可能となる。しかしながら、多数の動的メモリ割り当て・開放関数が存在する場合には、ソースプログラムをもれなく改変するためには、多くの労力を要する。また、ライブラリ・関数名の誤り修正漏れなどがあると正しいメモリ使用量を求めることはできない。また、商用のプログラムやライブラリが含まれる場合には、ソースプログラムは通常公開されていないため、ソフトウェア開発者はソースプログラムを改変することはできず、事実上測定・集計ができない。

0009

本発明は、1つの側面では、ハードウェア資源の使用量削減に有用な情報をソフトウェア開発者に提供することを目的とする。

課題を解決するための手段

0010

本願の開示する資源使用量集計プログラムは、1つの態様において、コンピュータに、前記コンピュータがプログラムを実行する際に使用する資源について、プロセスより小さな処理単位で、前記資源の使用量を集計させる。ここで、プロセスは、コンピュータがプログラムを実行する処理単位である。そして、前記資源使用量集計プログラムは、コンピュータに、集計した前記資源の使用量を前記処理単位で出力させる。

発明の効果

0011

1実施態様によれば、ソフトウェア開発者は、ハードウェア資源の使用量削減に有用な情報を得ることができる。

図面の簡単な説明

0012

図1Aは、プログラムと動的ライブラリの標準的な呼び出し関係を説明するための図である。
図1Bは、フックライブラリを用いる場合のプログラムと動的ライブラリの呼び出し関係を説明するための図である。
図2は、実施例1に係るメモリ使用量集計装置の機能構成を示す図である。
図3は、スタック情報の一例を示す図である。
図4は、ログファイルの一例を示す図である。
図5は、集計情報記憶部が動的ライブラリ毎に記憶する項目の一例を示す図である。
図6は、malloc_hookの処理手順を示すフローチャートである。
図7は、free_hookの処理手順を示すフローチャートである。
図8は、集計処理部による集計処理の処理手順を示すフローチャートである。
図9は、集計処理部によるライブラリ呼び出し毎の集計処理の処理手順を示すフローチャートである。
図10は、集計処理部による一定時間間隔毎の集計処理の処理手順を示すフローチャートである。
図11は、実施例2に係るメモリ使用量集計装置の機能構成を示す図である。
図12は、サイズテーブルの一例を示す図である。
図13は、メモリ使用量集計装置による集計処理と結果表示処理の概要を説明するための図である。
図14は、malloc_hookの処理手順を示すフローチャートである。
図15は、realloc_hookの処理手順を示すフローチャートである。
図16は、free_hookの処理手順を示すフローチャートである。
図17は、メモリ使用量集計部による集計処理の処理手順を示すフローチャートである。
図18は、種々のシグナル検出によるプログラム終了時に集計結果の出力を行うことができる方法を説明するための図である。
図19は、本実施例に係るメモリ使用量集計プログラムを実行するコンピュータの構成を示す機能ブロック図である。

0013

以下に、本願の開示する資源使用量集計プログラム、資源使用量集計方法及び資源使用量集計装置の実施例を図面に基づいて詳細に説明する。なお、実施例1では、オフラインでメモリ使用量を集計する場合について説明し、実施例2では、オンラインでメモリ使用量を集計する場合について説明する。ここで、オフラインとは、動的メモリ割り当て・開放に関するスタック情報をログファイルとして出力し、被測定プログラムの終了後、ログファイルを基に解析を実施して結果を表示する方法である。一方、オンラインとは、被測定プログラムを実行中に、逐次集計処理を実施し、被測定プログラムの終了と同時に集計結果を表示する方法である。また、これらの実施例は開示の技術を限定するものではない。

0014

まず、本願で使用する用語について説明する。
プログラム:コンピュータに対する命令(処理)を記述したもの。システムプログラム、アプリケーションプログラムに分類されることもあるが、本願ではアプリケーションプログラムを指す。

0015

プロセス:コンピュータがプログラムを実行する場合の実行単位であって、OSが管理するプログラムの実行単位。1つのプロセス内で複数の実行単位(スレッド)が割り当てられ、実行権スケジューリングされるが、実行プログラムの単位やリソースは一つである。プログラムはソースコード補助記憶装置ハードディスクドライブ等)に保存された状態をも指すがプロセスはコンピュータ上で実行され稼働しているプログラムを指す。

0016

動的メモリ:プログラム実行中にデータを保存するメモリ領域を動的に割り当てる方式、割り当てられたメモリを言う。プログラムは、メモリが必要になった場合に割り当て(allocate)を要求し、不要になった場合に開放(deallocate,free,release)することができる。OSは要求に応じてヒープ領域から要求されたサイズの未使用のメモリ領域を割り当てる。

0017

malloc系関数:動的メモリの割り当て、開放を行う際にプログラムが呼び出す関数。
void* malloc(size_t size):sizeで指定されたメモリを動的に割り当て、その先頭アドレスを返す。size_tはsize型を示し、void*はポインタ型を示す。
void* realloc(void* ptr, size_t size):ptrで示す動的メモリを開放し、sizeで指定されたメモリを動的に割り当て、その先頭アドレスを返す。拡大・縮小前のメモリ内容は新しい領域にコピーされる。領域拡大の場合、拡大部分のメモリ内容は不定
void free(void* ptr):ptrで示す動的メモリを開放する。
void* memalign(size_t alignment,size_t size):sizeで指定されたメモリを動的に割り当て、その先頭アドレスを返す。先頭アドレスはalignmentの倍数になっている。alignmentは2のべき乗でなくてはならない。

0018

次に、本願の背景技術について説明する。Linux(登録商標)/C言語では一般的に下記の4つのメモリ領域がある。本願のメモリ使用量集計は4.ヒープ領域(動的メモリ)が対象である。
1.プログラム領域:プログラムコードが置かれる領域
2.スタティック領域:外部変数静的変数が置かれる領域
3.スタック領域:自動変数、関数の引数戻り値などが置かれる領域(数十MB)
4.ヒープ領域: 動的メモリ割り当て・開放関数により使用される領域(数GB)

0019

また、現代のコンピュータの多くはプログラム内蔵方式かつ一時情報をスタックに格納するスタックベースのコンピュータとなっている。スタックベースのコンピュータは、関数を呼び出すたびに実行中の関数の情報をスタック(コールスタック)に格納する。スタックは、スタックフレームから構成され、その構造はアーキテクチャに依存するが、以下の情報を格納する。
リターンアドレス
局所データ
・受け渡される引数
・その他

0020

また、ある特定の関数においてスタック情報を解析することにより、特定の関数に至るまでの関数の呼び出し履歴やその引数の情報等を得ることができる。この履歴情報には、関数が格納されているプログラム名や動的ライブラリ名も含まれている。ここで、動的ライブラリとは、ライブラリを呼び出すプログラムにライブラリのコードが結合されることなく、プログラムの実行時に呼び出されて実行されるライブラリである。

0021

また、複数の動的ライブラリに同名の関数シンボルが存在する場合、リンカは、最初に見つけたシンボルを使用する性質を有する(Linux(登録商標)の場合)。そこで、開発者は、標準関数に含まれる動的メモリ割り当て関数・開放関数を再定義し、かつ標準ライブラリよりも先にリンカに読み込ませる(LD_PRELOAD環境変数を使用する)ことで、標準ライブラリを置き換えることができる。このような手法は、関数のフックと呼ばれ、プログラム開発におけるデバッグ性能改善の為のトレース情報を得るために使用されている。

0022

次に、プログラムと動的ライブラリの呼び出し関係について説明する。図1Aは、プログラムと動的ライブラリの標準的な呼び出し関係を説明するための図であり、図1Bは、フックライブラリを用いる場合のプログラムと動的ライブラリの呼び出し関係を説明するための図である。ここで、フックライブラリとは、ライブラリの呼び出しをフック(横取り)するライブラリである。

0023

図1Aにおいて、ユーザプログラム1は、c標準関数、malloc系関数、MPI(Messaging Passing Interface)関数、その他の関数を呼び出しながら処理を行う。ここで、MPI関数は、並列計算機において計算ノード間通信を行う場合に使用される関数である。

0024

図1Aに示すように、実行コマンド「./user_pg.out」によりユーザプログラム1が実行され、ユーザプログラム1がc標準関数及びmalloc系関数を呼び出すと、動的ライブラリlibc.soの対応する関数が実行される。また、プログラム1がMPI関数を呼び出すと、動的ライブラリlibmpi.soの対応する関数が実行され、プログラム1がその他の関数を呼び出すと、動的ライブラリlibm.soの対応する関数が実行される。

0025

これに対して、図1Bに示すように、フックライブラリlibmallochook.soを用いる場合には、ユーザプログラム1がmalloc系関数を呼び出すと、動的ライブラリlibc.soの代わりにフックライブラリlibmallochook.soの対応する関数が実行される。すなわち、ユーザプログラム1がmalloc系関数を呼び出すと、動的ライブラリlibc.soはフックライブラリlibmallochook.soにフックされる。そして、フックライブラリの関数がメモリ使用量の集計処理を行うとともに動的ライブラリlibc.soの対応する関数を呼び出す。

0026

このように、フックライブラリlibmallochook.soは、malloc系関数の実行を動的ライブラリlibc.soからフックすることによって、メモリ使用量の集計処理を行うことができる。なお、ユーザは、フックライブラリlibmallochook.soの使用を、実行コマンド「LD_PRELOAD=./libmallochook.so ./user_pg.out」により指定することができる。この実行コマンドによりフックライブラリlibmallochook.soが標準ライブラリlibc.soより先に読み込まれ、フックライブラリlibmallochook.soによるフックが行われる。

0027

次に、実施例1に係るメモリ使用量集計装置の機能構成について説明する。図2は、実施例1に係るメモリ使用量集計装置の機能構成を示す図である。図2に示すように、メモリ使用量集計装置10は、被測定部100と、集計処理部200と、ログファイル300とを有する。

0028

なお、メモリ使用量集計装置10は、コンピュータでメモリ使用量集計プログラムが実行されることにより実現される。また、被測定部100は、コンピュータで被測定プログラムが実行されることにより実現され、集計処理部200は、コンピュータで集計処理プログラムが実行されることにより実現される。すなわち、メモリ使用量集計プログラムは、被測定プログラムと集計処理プログラムとを有する。

0029

被測定部100は、メモリ使用量が集計される対象であり、集計に必要な情報をログファイル300に出力する。集計処理部200は、ログファイル300からログ情報を読み込み、メモリ使用量を動的ライブラリ毎、関数毎又はスレッド毎に集計して出力する。なお、メモリ使用量を動的ライブラリ毎、関数毎及びスレッド毎のいずれで行うかは、被測定プログラムが実行される際にパラメータとして指定される。

0030

被測定部100は、アプリ処理部110と、メモリ割当・開放置換部120と、メモリ割当・開放部130とを有する。アプリ処理部110は、メモリ使用量が集計される対象の処理を実行する。

0031

メモリ割当・開放置換部120は、メモリ割当・開放部130の呼び出しをフックする。そして、メモリ割当・開放置換部120は、メモリ使用量集計に必要な情報を生成してログファイル300に出力するとともに、メモリ割当・開放部130を呼び出して、メモリの割り当て及び開放を行う。メモリ割当・開放置換部120は、初期化部121と、メモリ割当・開放量確認部122と、分別情報取得部123と、メモリ割当・開放呼出部124と、ログ情報出力部125とを有する。

0032

初期化部121は、ログ情報を生成しながら行うメモリ割当・開放処理に関する初期化処理を行い、例えば、変数初期設定などを行う。メモリ割当・開放量確認部122は、メモリ割当量の確認及びメモリ開放が行われる領域へのポインタの確認を行う。

0033

分別情報取得部123は、スレッドID毎にメモリ使用量を集計する場合にはスレッドIDを取得し、ライブラリ毎又は関数毎にメモリ使用量を集計する場合にはスタック情報を取得する。動的ライブラリの関数が呼び出されると、動的ライブラリや関数の情報がスタックに積まれる。したがって、malloc系関数が呼び出されたときに、スタック情報を取得することにより、メモリ割当・開放置換部120は、malloc系関数を呼び出した関数の順番に関する情報を取得することができる。

0034

図3は、スタック情報の一例を示す図である。図3では、8個の要素がスタックされている。要素「7」及び要素「6」は、プログラムが実行されると常にスタックされる情報であり、要素「5」がメイン関数の呼び出しを示している。そして、要素「5」から要素「0」に向かって関数func_0、func_a0、func_a1、func_b0、malloc_hookが順次呼ばれている。メインから最初に呼ばれている動的ライブラリの関数は要素「3」のliba.soのfunc_a0であり、最終的にmalloc関数を呼んでいるのはlibb.soのfunc_b0である。なお、図3は、Linux(登録商標)において、backtrace_symbols関数によりスタックの情報がバックトレース翻訳された場合の例を示したものである。

0035

また、動的ライブラリ毎又は関数毎にメモリ使用量を集計する場合、集計処理部200は、メインから最初に呼ばれている動的ライブラリ毎又は関数毎に集計を行うことも、最終的にmalloc系関数を呼んでいる動的ライブラリ毎又は関数毎に集計を行うこともできる。また、集計処理部200は、メインから最初に呼ばれている動的ライブラリ又は関数から、最終的にmalloc系関数を呼んでいる動的ライブラリ又は関数までの全てについて動的ライブラリ毎又は関数毎に集計を行うこともできる。いずれの方法で動的ライブラリ毎又は関数毎に集計を行うかは、被測定プログラムが実行される際にパラメータとして指定される。

0036

メモリ割当・開放呼出部124は、メモリ割当・開放部130を呼び出し、メモリの割り当て及びメモリの開放を行う。ログ情報出力部125は、呼び出されたmalloc系関数毎に関数名、割り当てられた又は開放されたメモリ量、割り当てられた又は開放されたメモリ領域へのポインタをスレッドID又はスタック情報とともにログファイル300に出力する。

0037

図4は、ログファイル300の一例を示す図である。図4に示すように、ログファイル300は、呼び出されたmalloc系関数毎に関数名i、ptri、sizei、スタック情報iを記憶する(1≦i≦n)。ここで、ptriは割り当てられた又は開放されたメモリ領域へのポインタであり、sizeiは割り当てられた又は開放されたメモリ量である。なお、図4は、動的ライブラリ毎又は関数毎にメモリ使用量を集計する場合を示すが、スレッド毎にメモリ量を集計する場合には、スタック情報iの代わりにスレッドIDが記憶される。

0038

図2に戻って、メモリ割当・開放部130は、ヒープ領域からのメモリの割り当て及びヒープ領域へのメモリの開放を行う。なお、メモリ割当・開放置換部120は、図1Bに示したlibmallochook.soに対応し、メモリ割当・開放部130は、図1Bに示したlibc.soに対応する。

0039

集計処理部200は、初期化部210と、ログ情報読出部220と、メモリ使用量集計部230と、集計情報記憶部240と、メモリ使用量表示部250とを有する。初期化部210は、集計処理に関する初期化処理を行い、例えば、変数の初期設定などを行う。ログ情報読出部220は、ログファイル300からログ情報を読み出す。

0040

メモリ使用量集計部230は、ログ情報読出部220により読み出されたログ情報を用いて、動的ライブラリ毎、関数毎又はスレッド毎にメモリ使用量を集計する。

0041

集計情報記憶部240は、メモリ使用量集計部230により集計されるメモリ使用量を記憶する。図5は、集計情報記憶部240が動的ライブラリ毎に記憶する項目の一例を示す図である。図5に示すように、集計情報記憶部240は、動的ライブラリ毎に、ライブラリ名、サイズ、最小値最大値、malloc呼出回数、realloc呼出回数、free呼出回数、memalign呼出回数を記憶する。

0042

ここで、ライブラリ名は、メモリ使用量が集計される動的ライブラリの名前であり、サイズは集計されたメモリ使用量である。割り当てられたメモリ量はサイズに加算され、開放されたメモリ量はサイズから減算される。

0043

最大値は、割り当てと開放が行われる中で、ある時点で割り当てられているメモリ量の最大値であり、最小値は、割り当てと開放が行われる中で、ある時点で割り当てられているメモリ量の最小値である。例えば、全体の処理の中で初期化処理を行う関数では、主にメモリの割り当てが行われるため、他の関数と比較して最大値が正の大きな値となる。一方、全体の処理の中で終了処理を行う関数では、主にメモリの開放が行われるため、他の関数と比較して最小値が負の大きな値となる。

0044

malloc呼出回数はmalloc関数が呼び出された回数であり、realloc呼出回数はrealloc関数が呼び出された回数であり、free呼出回数はfree関数が呼び出された回数であり、memalign呼出回数は、memalign関数が呼び出された回数である。

0045

なお、集計情報記憶部240は、関数毎にメモリ使用量を集計する場合には、ライブラリ名の代わりに関数名を記憶し、スレッド毎にメモリ使用量を集計する場合には、ライブラリ名の代わりにスレッドIDを記憶する。

0046

メモリ使用量表示部250は、集計情報記憶部240が記憶する集計情報を表示装置に出力する。また、メモリ使用量表示部250は、集計情報をプリンタ記憶装置など他の装置に出力することもできる。

0047

次に、メモリ割当・開放置換部120の処理手順について、malloc_hook及びfree_hookを例として説明する。ここで、malloc_hookとは、図1Bに示した動的ライブラリlibmallochook.soのmallocであり、free_hookとは、図1Bに示した動的ライブラリlibmallochook.soのfreeである。

0048

図6は、malloc_hookの処理手順を示すフローチャートである。図6に示すように、malloc_hookは、malloc処理を行う(ステップS1)。すなわち、malloc_hookは、malloc_org(size)を呼び出し、呼び出し結果をptrにセットする。ここで、malloc_orgは、図1Bに示したlibc.soのmallocであり、sizeは割り当てを要求するメモリ量である。

0049

そして、malloc_hookは、ptrがNULLでないかを判定し(ステップS2)、NULLである場合には、処理を終了し、NULLでない場合には、メモリが割り当てられたので、ログ出力処理を行う(ステップS3)。具体的には、malloc_hookは、ログ出力処理として、関数名、ptr、size及びスタック情報をログファイル300に出力する。ここで、関数名は“malloc”であり、スタック情報はbacktrace_symbolsにより翻訳された結果である。そして、malloc_hookは、処理を終了する。

0050

このように、malloc_hookが、mallocの呼び出しをフックして、メモリ使用量の集計に必要な情報をログファイル300に出力することで、集計処理部200は、メモリ使用量を集計することができる。なお、realloc_hook及びmemalign_hookは、ステップS1において、malloc_org(size)の代わりにrealloc_org(prev_ptr,size)及びmemalign_org(size)をそれぞれ呼び出す点を除いて、malloc_hookと同様な処理を行う。

0051

図7は、free_hookの処理手順を示すフローチャートである。図7に示すように、free_hookは、ptrで指定されている開放領域について、ログ出力処理を行う(ステップS11)。具体的には、free_hookは、ログ出力処理として、関数名、ptr及びスタック情報をログファイル300に出力する。ここで、関数名は“free”であり、スタック情報はbacktrace_symbolsにより翻訳された結果である。また、ptrは、free_hookが呼ばれる際に開放領域を指定する引数として与えられる。

0052

そして、free_hookは、free処理を行う(ステップS12)。すなわち、free_hookは、free_org(ptr)を呼び出す。ここで、free_orgは、図1Bに示したlibc.soのfreeである。そして、free_hookは、処理を終了する。

0053

このように、free_hookが、freeの呼び出しをフックして、メモリ使用量の集計に必要な情報をログファイル300に出力することで、集計処理部200は、メモリ使用量を集計することができる。

0054

次に、集計処理部200による集計処理の処理手順について説明する。図8は、集計処理部200による集計処理の処理手順を示すフローチャートである。図8に示すように、集計処理部200は、ログファイル300からログを読み込み、malloc系関数を特定する(ステップS21)。

0055

そして、集計処理部200は、trace[ln]に”.so“を含むか否かを判定する(ステップS22)。ここで、”loop ln=(ntrace-3)…0“と”loop ln“は、2つの”loop ln“で挟まれた処理を、lnを(ntrace-3)から0まで順に変化させて繰り返すループ処理を示す。また、trace[ln]は、図3に示したスタック情報の各要素を示し、ntraceはスタック情報の要素数−1を示す。図3に示した例では、ntrace=7であり、trace[ntrace-3]は要素「4」を示す。すなわち、ステップS22では、集計処理部200は、関数が呼び出された順にスタック情報をサーチしてライブラリ名を見つけるとループから抜ける。

0056

そして、集計処理部200は、見つけたライブラリの名前をlib_nameにセットする(ステップS23)。すなわち、ステップS22及びステップS23により、集計処理部200は、メイン関数から最初に呼び出された動的ライブラリを特定する。

0057

そして、集計処理部200は、特定した動的ライブラリの名前がlib_statに登録されているか否かを判定する(ステップS24)。ここで、lib_statは集計情報記憶部240に対応する構造体であり、lib_stat[idx].libnameは、集計情報記憶部240が記憶するidx番目のライブラリ名を示す。すなわち、集計処理部200は、idxを0からnum_lib−1まで順に変化させて、特定した動的ライブラリの名前が集計情報記憶部240に登録されているかを判定する。ここで、num_libは集計情報記憶部240が記憶する動的ライブラリの数である。

0058

そして、集計処理部200は、特定した動的ライブラリの名前がlib_statに登録されている場合には、ステップS26に進み、特定した動的ライブラリの名前がlib_statに登録されていない場合には、ライブラリ追加を行う(ステップS25)。

0059

具体的には、集計処理部200は、ライブラリ追加処理として、lib_stat[num_lib].libname=lib_nameによりライブラリ名を登録し、lib_stat[num_lib].mem_size=0により集計値を「0」に初期化し、num_lib++によりnum_libに「1」を加える。また、集計処理部200は、lib_stat[num_lib].max_size=0、lib_stat[num_lib].min_size=0により最大値、最小値を「0」に初期化する。なお、mem_size、max_size、min_sizeは、それぞれ図5のサイズ、最大値、最小値に対応する。

0060

そして、集計処理部200は、動的ライブラリが使用するメモリ量を集計する(ステップS26)。具体的には、集計処理部200は、lib_stat[idx].malloc_cnt++により、malloc呼出回数malloc_cntに「1」を加え、lib_stat[idx].mem_size+=sizeにより、割り当てられたメモリ量をサイズmem_sizeに加える。また、集計処理部200は、lib_stat[idx].max_size、lib_stat[idx].min_sizeを必要に応じて更新する。すなわち、ステップS24〜ステップS26により、集計処理部200は、使用メモリ量を動的ライブラリで分類して集計する分類集計処理を行う。

0061

なお、ここでは、特定されたmalloc系関数がmallocである場合を示したが、特定された関数がrealloc、free及びmemalignの場合には、realloc回数、free呼出回数及びmemalign呼出回数がそれぞれ「1」加えられる。また、特定された関数がfreeである場合には、sizeは開放量に「−1」を掛けた値である。

0062

そして、集計処理部200は、全てのログについて処理を終了したか否かを判定し(ステップS27)、全てのログについて処理を終了した場合には、集計処理を終了し、処理を行っていないログがある場合には、ステップS21に戻って、次のmalloc系関数を特定する。

0063

このように、集計処理部200が、被測定プログラムの実行とは別に、ログファイル300を用いてメモリ使用量の集計を行うことによって、メモリ使用量集計装置10は、オフラインでメモリ使用量の集計を行うことができる。

0064

なお、ここでは、集計処理部200は、動的ライブラリ毎にメモリ使用量を集計したが、ライブラリ名の代わりに呼び出された関数名を特定し、ライブラリ名の代わりに関数名を集計情報記憶部240に登録することによって、関数毎にメモリ使用量を集計できる。また、集計処理部200は、ライブラリ名の代わりにスレッドIDを集計情報記憶部240に登録することによって、スレッド毎にメモリ使用量を集計できる。

0065

また、ここでは、集計処理部200は、ステップS22でライブラリを特定する場合に、lnを(ntrace-3)から0まで順に変化させたが、lnを0から(ntrace-3)に順に変化させることによって、malloc系関数を最後に呼び出した動的ライブラリを特定することもできる。すなわち、集計処理部200は、malloc系関数を最後に呼び出したライブラリ毎にメモリ使用量を集計することもできる。さらに、集計処理部200は、1つのmalloc系関数の呼び出し毎に複数の動的ライブラリを特定し、メイン関数の呼び出しからmalloc系関数の呼び出しまでの複数の動的ライブラリについて、メモリ使用量を集計することもできる。

0066

また、ここでは、集計処理部200は、同じ動的ライブラリが複数回呼び出された場合に、複数回の呼び出しで使用した全メモリ量を集計する。しかしながら、動的ライブラリが複数回呼び出された場合に、集計処理部200は、呼び出し毎に使用するメモリ量を集計することもできる。そこで、集計処理部200によるライブラリ呼び出し毎の集計処理の処理手順について説明する。

0067

図9は、集計処理部200によるライブラリ呼び出し毎の集計処理の処理手順を示すフローチャートである。図9に示すように、集計処理部200は、ログファイル300からログを読み込み、malloc系関数を特定する(ステップS31)。

0068

そして、集計処理部200は、lnを(ntrace-3)から0まで順に変化させて、trace[ln]に”.so“を含むか否かを判定する(ステップS32)。すなわち、集計処理部200は、関数が呼び出された順にスタック情報をサーチしてライブラリ名を見つけるとループから抜ける。

0069

そして、集計処理部200は、見つけたライブラリの名前をlib_nameにセットする(ステップS33)。すなわち、ステップS32及びステップS33により、集計処理部200は、メイン関数から最初に呼び出された動的ライブラリを特定する。

0070

そして、集計処理部200は、特定した動的ライブラリの名前が前回のmalloc系関数呼び出しで特定された動的ライブラリの名前last_libnameであるか否かを判定する(ステップS34)。

0071

そして、集計処理部200は、特定した動的ライブラリの名前が前回のmalloc系関数呼び出しで特定された動的ライブラリの名前である場合には、動的ライブラリの名前は登録済みであるので、ステップS36に進む。一方、特定した動的ライブラリの名前が前回のmalloc系関数呼び出しで特定された動的ライブラリの名前でない場合には、ライブラリ追加を行う(ステップS35)。具体的には、集計処理部200は、ライブラリ追加処理として、lib_stat[num_lib].libname=lib_nameによりライブラリ名を登録し、lib_stat[num_lib].mem_size=0により集計値を「0」に初期化し、num_lib++によりnum_libに「1」を加える。また、集計処理部200は、lib_stat[num_lib].max_size=0、lib_stat[num_lib].min_size=0により最大値、最小値を「0」に初期化する。

0072

そして、集計処理部200は、動的ライブラリが使用するメモリ量を集計する(ステップS36)。具体的には、集計処理部200は、lib_stat[idx].malloc_cnt++により、malloc呼出回数malloc_cntに「1」を加え、lib_stat[idx].mem_size+=sizeにより、割り当てられたメモリ量をサイズmem_sizeに加える。また、集計処理部200は、lib_stat[idx].max_size、lib_stat[idx].min_sizeを必要に応じて更新する。すなわち、ステップS34〜ステップS36により、集計処理部200は、各動的ライブラリの呼び出しで分類して使用メモリ量を集計する分類集計処理を行う。

0073

なお、ここでは、特定されたmalloc系関数がmallocである場合を示したが、特定された関数がrealloc、free及びmemalignの場合には、realloc回数、free呼出回数及びmemalign呼出回数がそれぞれ「1」加えられる。また、特定された関数がfreeである場合には、sizeは開放量に「−1」を掛けた値である。

0074

そして、集計処理部200は、全てのログについて処理を終了したか否かを判定し(ステップS37)、全てのログについて処理を終了した場合には、集計処理を終了し、処理を行っていないログがある場合には、ステップS31に戻って、次のmalloc系関数を特定する。

0075

このように、同じ動的ライブラリが複数回呼び出された場合に、集計処理部200は、呼び出し毎に使用するメモリ量を集計することによって、1回の動的ライブラリの呼び出しで使用するメモリ量を求めることができる。

0076

なお、集計処理部200は、メモリ使用量の集計を一定時間間隔毎に行うこともできるそこで、集計処理部200による一定時間間隔毎の集計処理の処理手順について説明する。

0077

図10は、集計処理部200による一定時間間隔毎の集計処理の処理手順を示すフローチャートである。図10に示すように、集計処理部200は、str_num_libを「0」に初期化する(ステップS41)。ここで、str_num_libは、集計情報記憶部240のインデックスidxに関して一定時間間隔毎に設定される検索開始番号を示す。すなわち、集計情報記憶部240は、一定の時間間隔毎に使用される複数のブロックに分割され、検索開始番号の先頭を示す。

0078

そして、集計処理部200は、ログファイル300からログを読み込み、malloc系関数を特定する(ステップS42)。そして、集計処理部200は、trace[ln]に”.so“を含むか否かを判定する(ステップS43)。

0079

そして、集計処理部200は、見つけたライブラリの名前をlib_nameにセットする(ステップS44)。すなわち、ステップS42及びステップS44により、集計処理部200は、メイン関数から最初に呼び出された動的ライブラリを特定する。

0080

そして、集計処理部200は、経過時間がインターバル以上であるか否か、すなわち、一定時間が経過したか否かを判定し(ステップS45)、経過時間がインターバル以上である場合には、一定時間が経過したので、str_num_libにnum_libを設定する(ステップS46)。すなわち、集計処理部200は、集計情報記憶部240の次のブロックの使用を開始する。

0081

そして、集計処理部200は、特定した動的ライブラリの名前がlib_statに登録されているか否かを判定する(ステップS47)。すなわち、集計処理部200は、idxをstr_num_libからnum_lib−1まで順に変化させて、特定した動的ライブラリの名前が集計情報記憶部240の現在のブロックに登録されているかを判定する。ここで、num_libは全ブロックを通じて集計情報記憶部240が記憶するライブラリの数である。

0082

そして、集計処理部200は、特定した動的ライブラリの名前がlib_statの現在のブロックに登録されている場合には、ステップS49に進む。一方、特定した動的ライブラリの名前がlib_statの現在のブロックに登録されていない場合には、集計処理部200は、ライブラリ追加を行う(ステップS48)。具体的には、集計処理部200は、ライブラリ追加処理として、lib_stat[num_lib].libname=lib_nameによりライブラリ名を登録し、lib_stat[num_lib].mem_size=0により集計値を「0」に初期化し、num_lib++によりnum_libに「1」を加える。また、集計処理部200は、lib_stat[num_lib].max_size=0、lib_stat[num_lib].min_size=0により最大値、最小値を「0」に初期化する。

0083

そして、集計処理部200は、動的ライブラリが使用するメモリ量を集計する(ステップS49)。具体的には、集計処理部200は、lib_stat[idx].malloc_cnt++により、malloc呼出回数malloc_cntに「1」を加え、lib_stat[idx].mem_size+=sizeにより、割り当てられたメモリ量をサイズmem_sizeに加える。また、集計処理部200は、lib_stat[idx].max_size、lib_stat[idx].min_sizeを必要に応じて更新する。すなわち、ステップS45〜ステップS49により、集計処理部200は、使用メモリ量をブロック毎に動的ライブラリで分類して集計する分類集計処理を行う。

0084

なお、ここでは、特定されたmalloc系関数がmallocである場合を示したが、特定された関数がrealloc、free及びmemalignの場合には、realloc回数、free呼出回数及びmemalign呼出回数がそれぞれ1加えられる。また、特定された関数がfreeである場合には、sizeは開放量に「−1」を掛けた値である。

0085

そして、集計処理部200は、全てのログについて処理を終了したか否かを判定し(ステップS50)、全てのログについて処理を終了した場合には、集計処理を終了し、処理を行っていないログがある場合には、ステップS42に戻って、次のmalloc系関数を特定する。

0086

このように、集計処理部200が、メモリ使用量の集計を一定時間間隔毎に行うことによって、メモリ使用量集計装置10は、メモリ使用量の時間的推移に関する情報を収集することができる。

0087

上述してきたように、実施例1では、メモリ割当・開放置換部120がメモリ割当・開放部130の呼び出しをフックする。そして、メモリ割当・開放置換部120は、動的に使用されるメモリ量の集計に必要な情報を生成してログファイル300に書き込むとともに、メモリ割当・開放部130を呼び出してメモリ割り当てや開放を行う。そして、集計処理部200が、ログファイル300を読み込んで動的ライブラリ毎、関数毎又はスレッド毎に、動的に使用されるメモリ量をオフラインで集計する。

0088

したがって、動的ライブラリ開発において、開発者は、動的ライブラリを変更することなく、動的に使用されるメモリ量を動的ライブラリ毎、関数毎又はスレッド毎に把握することができ、メモリ使用量の削減に有用な情報を得ることができる。また、開発者が想定していない異常終了が発生しても、そこに至るまでのログが保存済みであるため、その時点までのメモリ使用量の集計が可能である。また、一度の測定結果を基に異なる集計が可能である。

0089

また、実施例1では、集計処理部200は、動的ライブラリの各呼び出し毎又は動的ライブラリに含まれる関数の各呼び出し毎に、動的に使用されるメモリ量を集計することもできる。したがって、動的ライブラリ開発において、開発者は、動的に使用されるメモリ量を動的ライブラリの各呼び出し毎又は関数の各呼び出し毎に把握することができ、省メモリ化に有用な情報を得ることができる。

0090

また、実施例1では、集計処理部200は、動的ライブラリ毎、関数毎又はスレッド毎に、動的に使用されるメモリ量を一定の時間間隔毎に集計することもできる。したがって、動的ライブラリ開発において、開発者は、動的に使用されるメモリ量の時間推移を把握することができ、省メモリ化に有用な情報を得ることができる。

0091

ところで、上記実施例1では、被測定プログラムがログ情報を出力し、集計処理部200がログ情報を用いてオフラインでメモリ使用量を集計する場合について説明した。しかしながら、被測定プログラムを実行しながらオンラインでメモリ使用量を集計することもできる。そこで、実施例2では、被測定プログラムを実行しながらオンラインでメモリ使用量を集計するメモリ使用量集計装置について説明する。

0092

まず、実施例2に係るメモリ使用量集計装置の機能構成について説明する。図11は、実施例2に係るメモリ使用量集計装置の機能構成を示す図である。図11に示すように、メモリ使用量集計装置20は、被測定・集計部400を有する。被測定・集計部400は、コンピュータで被測定プログラムが実行されることにより実現され、メモリ使用量が集計される対象であるとともに、集計処理も行う。すなわち、被測定・集計部400は、集計に必要な情報をログファイル300に出力する代わりに集計処理を行う。

0093

被測定・集計部400は、アプリ処理部110と、メモリ割当・開放置換部420と、集計情報記憶部427と、サイズテーブル429と、メモリ割当・開放部130とを有する。なお、ここでは説明の便宜上、図2に示した各部と同様の役割を果たす機能部については同一符号を付すこととしてその詳細な説明を省略する。

0094

メモリ割当・開放置換部420は、メモリ割当・開放部130の呼び出しをフックする。そして、メモリ割当・開放置換部420は、メモリ使用量集計を行うとともに、メモリ割当・開放部130を呼び出して、メモリの割り当て及び開放を行う。メモリ割当・開放置換部420は、初期化部421と、メモリ割当・開放量確認部122と、分別情報取得部123と、メモリ使用量集計部426と、メモリ割当・開放呼出部124と、メモリ使用量表示部428とを有する。

0095

初期化部421は、メモリ使用量を集計しながら行うメモリ割当・開放処理に関する初期化処理を行い、例えば、変数の初期設定などを行う。メモリ使用量集計部426は、スタック情報や集計情報記憶部427を用いて動的メモリの使用量を集計する。メモリ使用量表示部428は、集計情報記憶部427が記憶する集計情報を表示装置に出力する。また、メモリ使用量表示部428は、集計情報をプリンタや記憶装置など他の装置に出力することもできる。

0096

集計情報記憶部427は、メモリ使用量集計部426により集計されるメモリ使用量を記憶する。なお、集計情報記憶部427は、図2に示した集計情報記憶部240と同様のデータ構造を有する。サイズテーブル429は、動的に割り当てられたメモリ領域のポインタiからサイズiを検索するために用いられる。図12は、サイズテーブル429の一例を示す図である。図12に示すように、サイズテーブル429は、ポインタiとサイズi(1≦i≦n)とを対応付けて記憶する。

0097

次に、メモリ使用量集計装置20による集計処理と結果表示処理の概要について説明する。図13は、メモリ使用量集計装置20による集計処理と結果表示処理の概要を説明するための図である。

0098

図13に示すように、メモリ使用量集計装置20は、被測定プログラムを実行し、malloc系関数や非malloc系関数を呼び出しながら各種処理を行う(ステップS61)。そして、被測定プログラムからmalloc系関数の呼び出しが行われると、malloc系関数の呼び出しがフックされ、補助プログラムとしてのフック関数による処理が行われる。

0099

フック関数は、初期化フラグを用いて初期化済みか否かを判定し(ステップS62)、初期済みでない場合には、初期化処理を行う(ステップS63)。具体的には、フック関数は、atexit関数を用いて、被測定プログラムが正常終了(プログラマが想定した範囲の異常終了を含む)した後に動作させる関数として結果表示関数を登録する。また、フック関数は初期化済みであるか否かを示す初期化フラグを初期化済みに変更する。そして、フック関数は、malloc系関数処理及び集計処理を行う(ステップS64)。

0100

被測定プログラムの処理が終了すると、atexeit関数を用いて登録された結果表示関数が起動される。そして、結果表示関数が集計結果表示を行う(ステップS65)。

0101

このように、被測定プログラムが正常終了した後に結果表示関数を動作させることによって、メモリ使用量集計装置20は、集計結果を表示することができる。なお、被測定プログラムの正常終了と同時に集計結果を表示させるためには、スタックを操作し、メイン関数の終了に伴う戻りアドレスを操作し、集計結果を表示する関数のアドレスに変更すれば良い。そして、集計結果表示関数の終了に伴う戻りアドレスを本来の戻りアドレスに変更すれば良い。

0102

次に、メモリ割当・開放置換部420の処理手順について、malloc_hook、realloc_hook及びfree_hookを例として説明する。図14は、malloc_hookの処理手順を示すフローチャートである。

0103

図14に示すように、malloc_hookは、malloc処理を行う(ステップS81)。すなわち、malloc_hookは、malloc_org(size)を呼び出し、呼び出し結果をptrにセットする。

0104

そして、malloc_hookは、ptrがNULLでないかを判定し(ステップS82)、NULLである場合には、処理を終了し、NULLでない場合には、メモリが割り当てられたので、集計処理を行う(ステップS83)。具体的には、malloc_hookは、集計処理として、メモリ使用量の加算、メモリ使用量の最大・最小の更新及びmalloc呼出回数のインクリメントを行う。

0105

そして、malloc_hookは、ポインタ(ptr)及びサイズ(size)のサイズテーブル429への登録を行う(ステップS84)。そして、malloc_hookは、処理を終了する。

0106

このように、malloc_hookが、mallocの呼び出しをフックして、メモリ使用量の集計処理を行うことで、メモリ使用量集計装置20は、オンラインでメモリ使用量を集計することができる。なお、memalign_hookは、ステップS81において、malloc_org(size)の代わりにmemalign_org(size)をそれぞれ呼び出す点を除いて、malloc_hookと同様な処理を行う。

0107

図15は、realloc_hookの処理手順を示すフローチャートである。図15に示すように、realloc_hookは、prev_ptrがNULLでないかを判定し(ステップS91)、NULLである場合には、prev_sizeに「0」を設定し(ステップS92)、ステップS97に進む。ここで、prev_ptrは、realloc呼び出しにおいて開放領域へのポインタを示す引数であり、prev_sizeは、realloc呼び出しにおいて開放領域のサイズを示す引数である。

0108

一方、prev_ptrがNULLでない場合には、開放領域が指定されているので、realloc_hookは、開放領域のメモリサイズを検索する(ステップS93)。すなわち、realloc_hookは、prev_ptrを検索キーとしてサイズテーブル429を検索する。

0109

そして、realloc_hookは、サイズテーブル429にprev_ptrが有るか否かを判定し(ステップS94)、ない場合には、引数の指定が正しくないので、関数不適切使用メッセージを表示し(ステップS95)、処理を終了する。一方、サイズテーブル429にprev_ptrが有る場合には、realloc_hookは、prev_ptrに対応するサイズを取得し、prev_sizeとする(ステップS96)。

0110

そして、realloc_hookは、realloc処理を行う(ステップS97)。すなわち、realloc_hookは、realloc_org(prev_ptr,size)を呼び出し、呼び出し結果をptrにセットする。

0111

そして、realloc_hookは、ptrがNULLでないかを判定し(ステップS98)、NULLである場合には、処理を終了し、NULLでない場合には、メモリの再割り当てが行われたので、集計処理を行う(ステップS99)。具体的には、realloc_hookは、集計処理として、メモリ使用量の加減算、メモリ使用量の最大・最小の更新及びrealloc呼出回数のインクリメントを行う。

0112

そして、realloc_hookは、サイズテーブル429の更新を行い(ステップS100)、処理を終了する。

0113

このように、realloc_hookが、reallocの呼び出しをフックして、メモリ使用量の集計処理を行うことで、メモリ使用量集計装置20は、オンラインでメモリ使用量を集計することができる。

0114

図16は、free_hookの処理手順を示すフローチャートである。図16に示すように、free_hookは、まず、引数ptrが非NULLであるか確認する(ステップS111)。NULLの場合には、free_hookは、ステップS112にて、sizeに「0」を与え、集計処理(ステップS117)に飛ぶ。ptrが非NULLの場合、free_hookは、開放領域のメモリサイズを検索する(ステップS113)。すなわち、free_hookは、ptrを検索キーとしてサイズテーブル429を検索する。

0115

そして、free_hookは、サイズテーブル429にptrが有るか否かを判定し(ステップS114)、ない場合には、引数の指定が正しくないので、関数不適節メッセージを表示(ステップS115)し、処理を終了する。一方、サイズテーブル429にptrが有る場合には、free_hookは、ptrに対応するサイズを取得後、サイズテーブル429より開放領域の削除を行う(ステップS116)。

0116

その後、free_hookは、集計処理を行う(ステップS117)。具体的には、free_hookは、集計処理として、メモリ使用量の減算、メモリ使用量の最大・最小の更新及びfree呼出回数のインクリメントを行う。そして、free_hookは、free処理を行い(ステップS118)、処理を終了する。

0117

このように、free_hookが、freeの呼び出しをフックして、メモリ使用量の集計処理を行うことで、メモリ使用量集計装置20は、オンラインでメモリ使用量を集計することができる。

0118

次に、メモリ使用量集計部426による集計処理の処理手順について説明する。図17は、メモリ使用量集計部426による集計処理の処理手順を示すフローチャートである。なお、図17に示す集計処理は、図14のステップS84、図15のステップ100、及び、図16のステップS114の処理に対応する。

0119

図17に示すように、メモリ使用量集計部426は、スタック情報をバックトレース翻訳し、有効要素数をntraceに設定する(ステップS121)。そして、メモリ使用量集計部426は、trace[ln]に”.so“を含むか否かを判定する(ステップS122)。

0120

そして、メモリ使用量集計部426は、見つけたライブラリの名前をlib_nameにセットする(ステップS123)。すなわち、ステップS122及びステップS123により、メモリ使用量集計部426は、メイン関数から最初に呼び出された動的ライブラリを特定する。

0121

そして、メモリ使用量集計部426は、特定した動的ライブラリの名前がlib_statに登録されているか否かを判定する(ステップS124)。ここで、lib_statは集計情報記憶部427に対応する構造体であり、lib_stat[idx].libnameは、集計情報記憶部427が記憶するidx番目のライブラリ名を示す。すなわち、メモリ使用量集計部426は、idxを0からnum_lib−1まで順に変化させて、特定した動的ライブラリの名前が集計情報記憶部427に登録されているかを判定する。ここで、num_libは集計情報記憶部427が記憶するライブラリの数である。

0122

そして、メモリ使用量集計部426は、特定した動的ライブラリの名前がlib_statに登録されている場合には、ステップS126に進み、特定した動的ライブラリの名前がlib_statに登録されていない場合には、ライブラリ追加を行う(ステップS125)。具体的には、メモリ使用量集計部426は、ライブラリ追加処理として、lib_stat[num_lib].libname=lib_nameによりライブラリ名を登録し、lib_stat[num_lib].mem_size=0により集計値を「0」に初期化し、num_lib++によりnum_libに「1」を加える。また、メモリ使用量集計部426は、lib_stat[num_lib].max_size=0、lib_stat[num_lib].min_size=0により最大値、最小値を「0」に初期化する。

0123

そして、メモリ使用量集計部426は、動的ライブラリが使用するメモリ量を集計する(ステップS126)。具体的には、メモリ使用量集計部426は、lib_stat[idx].malloc_cnt++により、malloc呼出回数malloc_cntに「1」を加え、lib_stat[idx].mem_size+=sizeにより、割り当てられたメモリ量をサイズmem_sizeに加える。また、メモリ使用量集計部426は、lib_stat[idx].max_size、lib_stat[idx].min_sizeを必要に応じて更新する。

0124

なお、ここでは、malloc系関数がmallocである場合を示したが、関数がrealloc、free及びmemalignの場合には、realloc回数、free呼出回数及びmemalign呼出回数がそれぞれ1加えられる。また、特定された関数がfreeである場合には、sizeは開放量に「−1」を掛けた値である。

0125

このように、メモリ使用量集計部426が、オンラインでメモリ使用量の集計を行うことによって、メモリ使用量集計装置20は、ログファイルを用いることなくメモリ使用量の集計を行うことができる。

0126

なお、ここでは、メモリ使用量集計部426は、動的ライブラリ毎にメモリ使用量を集計したが、ライブラリ名の代わりに呼び出された関数名を特定し、ライブラリ名の代わりに関数名を集計情報記憶部427に登録することによって、関数毎にメモリ使用量を集計できる。また、メモリ使用量集計部426は、ライブラリ名の代わりにスレッドIDを集計情報記憶部427に登録することによって、スレッドにメモリ使用量を集計できる。

0127

また、ここでは、メモリ使用量集計部426は、ステップS122でライブラリを特定する場合に、lnを(ntrace-3)から0まで順に変化させたが、lnを0から(ntrace-3)に順に変化させることによって、malloc系関数を最後に呼び出した動的ライブラリを特定することもできる。すなわち、メモリ使用量集計部426は、malloc系関数を最後に呼び出したライブラリ毎にメモリ使用量を集計することもできる。さらに、メモリ使用量集計部426は、1つのmalloc系関数の呼び出し毎に複数の動的ライブラリを特定し、メイン関数の呼び出しからmalloc系関数の呼び出しまでの複数の動的ライブラリについて、メモリ使用量を集計することもできる。

0128

上述してきたように、実施例2では、メモリ使用量集計装置20は、被測定プログラムの実行中にメモリ使用量の分類集計処理をオンラインで実施し、被測定プログラムの終了と同時に集計結果を表示する。したがって、メモリ使用量集計装置20は、ログファイルを使用する必要がなく、ディスク記憶領域を節約することができる。

0129

なお、実施例2では、メモリ使用量集計装置20は、atexit関数を用いて結果表示関数を登録することにより、被測定プログラムの終了時に集計結果の出力を行った。しかしながら、メモリ使用量集計装置20は、種々のシグナル検出によるプログラム終了(プログラマが想定していない異常終了)時には集計結果の出力を行うことができない。そこで、種々のシグナル検出によるプログラム終了時に集計結果の出力を行うことができる方法について説明する。

0130

図18は、種々のシグナル検出によるプログラム終了時に集計結果の出力を行うことができる方法を説明するための図である。図18に示すように、被測定プログラムとは別の集計プログラムが、親プロセスとしてプロセスフォークを行い(ステップS131)、被測定プログラムを子プロセスとして動作させる。そして、被測定プログラムは、各種処理を行いながら共有メモリ領域に集計結果を書き込む(ステップS132)。そして、共有メモリ領域が集計結果を保持する。

0131

そして、親プロセスは、子プロセスの終了を確認し(ステップS133)、子プロセスの終了時に共有メモリ領域の集計結果を読み込み、集計結果の表示処理を行う(ステップS134)。なお、親プロセスは、共有メモリ領域の代わりに、プロセス間通信を用いて集計情報を得ることもできる。

0132

また、近年では計算処理をより高速で処理を行う目的や、単一ノードのメモリ量を超えるデータを同時に処理することを目的に、分散メモリ型の並列計算機が利用されている。分散メモリ型の並列計算機は、複数の計算機計算ノード)を高速なネットワークで接続したものである。計算ノード間で処理されたデータはネットワークを通して必要に応じて通信・共有化され、結果として分散メモリ型の並列計算機は単一の計算機に比較して高速に処理を行ったり、個別のノードで異なるデータを保存することで巨大なデータ処理を行ったりする。

0133

このような仕組みを提供するシステムソフトとしてMPIが最も広く利用されている。MPIでは、”mpiexec”コマンドにより各計算ノードにおいてプロセスが立ち上がり、その子プロセスとして任意のプログラムによる並列処理が実現されている。

0134

MPIプログラムでは各ノードで動作するプロセスが協調して動作することが不可欠であり、一つの計算ノードのプロセスが終了すると親プロセスである”mpiexec”が全ての計算ノードで実行されている子プロセス(ユーザプログラム)を強制終了させる。これはユーザプログラムからすると想定外の異常終了であり、集計結果を表示することなくMPIプログラムは終了されてしまう。また、図18で説明した方法をとっても、ここで言うユーザプログラムが図18の親プロセスに相当し、親プロセスが異常終了されてしまうため、集計結果は表示されない。このようなケースでは、ソフトウェア開発者は、”mpiexec”コマンドを改良し、図18と同様な仕組みを組み込むことで、集計結果が表示されない問題を解決することができる。

0135

なお、実施例1及び2では、メモリ使用量集計装置について説明したが、メモリ使用量集計装置が有する構成をソフトウェアによって実現することで、同様の機能を有するメモリ使用量集計プログラムを得ることができる。そこで、メモリ使用量集計プログラムを実行するコンピュータについて説明する。

0136

図19は、実施例に係るメモリ使用量集計プログラムを実行するコンピュータの構成を示す機能ブロック図である。図19に示すように、コンピュータ600は、メインメモリ610、CPU(Central Processing Unit)620、LAN(Local Area Network)インタフェース630、HDD(Hard Disk Drive)640、スーパーIO(Input Output)650を有する。また、コンピュータ600は、DVI(Digital Visual Interface)660、ODD(Optical Disk Drive)670を有する。

0137

メインメモリ610は、プログラムやプログラムの実行途中結果などを記憶するメモリである。CPU620は、メインメモリ610からプログラムを読み出して実行する中央処理装置である。CPU620は、メモリコントローラを有するチップセットを含む。

0138

LANインタフェース630は、コンピュータ600をLAN経由で他のコンピュータに接続するためのインタフェースである。HDD640は、プログラムやデータを格納するディスク装置であり、スーパーIO650は、マウスキーボードなどの入力装置を接続するためのインタフェースである。DVI660は、液晶表示装置を接続するインタフェースであり、ODD670は、DVDの読み書きを行う装置である。

0139

LANインタフェース630は、PCIエクスプレスによりCPU620に接続され、HDD640及びODD670は、SATA(Serial Advanced Technology Attachment)によりCPU620に接続される。スーパーIO650は、LPC(Low Pin Count)によりCPU620に接続される。

0140

そして、コンピュータ600において実行されるメモリ使用量集計プログラムは、DVDに記憶され、ODD670によってDVDから読み出されてコンピュータ600にインストールされる。あるいは、メモリ使用量集計プログラムは、LANインタフェース630を介して接続された他のコンピュータシステムデータベースなどに記憶され、これらのデータベースから読み出されてコンピュータ600にインストールされる。そして、インストールされたメモリ使用量集計プログラムは、HDD640に記憶され、メインメモリ610に読み出されてCPU620によって実行される。

0141

なお、実施例1及び2では、ヒープ領域の使用量を集計する場合について説明したが、本発明はこれに限定されるものではなく、スタック領域など他のメモリ領域、不揮発性記憶装置など他のハードウェア資源の使用量を集計する場合にも同様に適用することができる。

0142

以上の実施例1〜2を含む実施形態に関し、さらに以下の付記を開示する。

0143

(付記1)コンピュータに、
前記コンピュータがプログラムを実行する際に使用する資源について、前記コンピュータが前記プログラムを実行する処理単位であるプロセスより小さな処理単位で、前記資源の使用量を集計させ、
集計した前記資源の使用量を前記処理単位で出力させることを特徴とする資源使用量集計プログラム。

0144

(付記2)前記資源の使用量の集計は、
前記コンピュータに、
前記資源の割り当てを要求する割り当て関数の呼び出しを、集計に必要な処理を行わせるとともに、前記割り当て関数を呼び出すフック割り当て関数の実行によりフックさせ、
前記資源の開放を要求する開放関数の呼び出しを、集計に必要な処理を行わせるとともに、前記解放関数を呼び出すフック開放関数の実行によりフックさせることを特徴とする付記1記載の資源使用量集計プログラム。

0145

(付記3)前記資源の使用量の集計は、
前記コンピュータに、
前記プログラムを実行させるとともに、前記フック割り当て関数及びフック開放関数が集計に必要な情報をそれぞれログ情報として出力させ、
前記プログラムの実行後に前記ログ情報を用いて前記資源の使用量を集計させることを特徴とする付記2記載の資源使用量集計プログラム。

0146

(付記4)前記資源の使用量の集計は、
前記コンピュータに、
前記フック割り当て関数及び前記フック開放関数が前記プログラムの実行中に、前記資源の使用量を集計させることを特徴とする付記2記載の資源使用量集計プログラム。

0147

(付記5)前記処理単位は、
動的ライブラリ、動的ライブラリに含まれる関数又はスレッドであることを特徴とする付記1〜4のいずれか1項に記載の資源使用量集計プログラム。

0148

(付記6)前記処理単位は、
動的ライブラリの各呼び出し又は動的ライブラリに含まれる関数の各呼び出しであることを特徴とする付記1〜4のいずれか1項に記載の資源使用量集計プログラム。

0149

(付記7)前記集計する処理は、
前記コンピュータに、
前記プログラムの実行時間を所定の時間間隔で分割させ、
各時間間隔における前記資源の使用量を集計させることを特徴とする付記1〜4のいずれか1項に記載の資源使用量集計プログラム。

0150

(付記8)コンピュータが、
前記コンピュータがプログラムを実行する際に使用する資源について、前記コンピュータが前記プログラムを実行する処理単位であるプロセスより小さな処理単位で、前記資源の使用量を集計し、
集計した前記資源の使用量を前記処理単位で出力することを特徴とする資源使用量集計方法。

0151

(付記9)プログラムを実行する際に使用する資源について、前記プログラムを実行する処理単位であるプロセスより小さな処理単位で、前記資源の使用量を集計する集計部と、
前記集計部が集計した前記資源の使用量を前記処理単位で出力する出力部を有することを特徴とする資源使用量集計装置。

0152

(付記10)メモリと該メモリに接続されたCPUとを有する資源使用量集計装置において、
前記CPUに、
前記コンピュータがプログラムを実行する際に使用する資源について、前記コンピュータが前記プログラムを実行する処理単位であるプロセスより小さな処理単位で、前記資源の使用量を集計させ、
集計した前記資源の使用量を前記処理単位で出力させることを特徴とする資源使用量集計装置。

実施例

0153

(付記11)コンピュータに、
前記コンピュータがプログラムを実行する際に使用する資源について、前記コンピュータが前記プログラムを実行する処理単位であるプロセスより小さな処理単位で、前記資源の使用量を集計させ、
集計した前記資源の使用量を前記処理単位で出力させることを特徴とする資源使用量集計プログラムを記憶したコンピュータ読み取り可能な記憶媒体

0154

1ユーザプログラム
10,20メモリ使用量集計装置
100 被測定部
110アプリ処理部
120,420メモリ割当・開放置換部
121,421初期化部
122 メモリ割当・開放量確認部
123分別情報取得部
124 メモリ割当・開放呼出部
125ログ情報出力部
130 メモリ割当・開放部
200集計処理部
210 初期化部
220 ログ情報読出部
230 メモリ使用量集計部
240,427集計情報記憶部
250,428 メモリ使用量表示部
300ログファイル
400 被測定・集計部
426 メモリ使用量集計部
429サイズテーブル
600コンピュータ
610メインメモリ
620 CPU
630LANインタフェース
640 HDD
650スーパーIO
660DVI
670ODD

ページトップへ

この技術を出願した法人

この技術を発明した人物

ページトップへ

関連する挑戦したい社会課題

関連する公募課題

ページトップへ

おススメ サービス

おススメ astavisionコンテンツ

新着 最近 公開された関連が強い技術

この 技術と関連性が強い技術

関連性が強い 技術一覧

この 技術と関連性が強い人物

関連性が強い人物一覧

この 技術と関連する社会課題

関連する挑戦したい社会課題一覧

この 技術と関連する公募課題

関連する公募課題一覧

astavision 新着記事

サイト情報について

本サービスは、国が公開している情報(公開特許公報、特許整理標準化データ等)を元に構成されています。出典元のデータには一部間違いやノイズがあり、情報の正確さについては保証致しかねます。また一時的に、各データの収録範囲や更新周期によって、一部の情報が正しく表示されないことがございます。当サイトの情報を元にした諸問題、不利益等について当方は何ら責任を負いかねることを予めご承知おきのほど宜しくお願い申し上げます。

主たる情報の出典

特許情報…特許整理標準化データ(XML編)、公開特許公報、特許公報、審決公報、Patent Map Guidance System データ