[SCore-users-jp] メモリの解放について
Hisaki Honjo
honjo @ murata.co.jp
2004年 4月 27日 (火) 11:11:20 JST
はじめまして。
本庄と申します。
SCoreを使ってPCクラスタを構築しているのですが、
どうしても分からないことがあり、投稿させていただきました。
現在、ある程度大きなメモリを「一時的」に必要とするシステムを作成しています。
この、「一時的」なメモリは不要になったらすぐに解放しているのですが、
どうも、プロセスが終了するまで解放されていないような挙動を示します。
試しに、簡単なプログラム(添付)を作成し、
topコマンドにて各ノードのメモリ消費量を監視してみると、
やはり、プロセスが終了するまでメモリが解放されていません。
本来なら、「pause 2」の時点で解放されているはず…
ただし、1ノードのみの実行だと解放実行直後に
ちゃんとメモリが解放されていることが確認されています。
つまり、複数台で並列化した場合のみ発生します。
これはなぜなのでしょうか?
プログラムに問題がある場合はアドバイス頂けないでしょうか。
MLの過去ログなども調べてみたのですが、該当する内容が見当たりませんでした。
よろしくお願いいたします。
補足:システムはテスト段階のため、非力なPCを使用しています。
そのため、一時領域を作成する時点で物理メモリが圧倒的に不足しており、
殆どスワップメモリが使用されます。
---[環境]-------------------------------------
RedHat Linux 7.3 (Kernel 2.4.21-1SCORE)
SCore 5.6.1
Memory 物理:192MB, スワップ:1GB
CPU : PentiumIII 466MHz Single x 4
----------------------------------------------
---[ソース]-----------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
int main(int argc, char **argv)
{
int nProcess;
int nID;
double * pData;
int i;
// MPI初期化
MPI_Init( &argc, &argv );
MPI_Comm_size( MPI_COMM_WORLD, &nProcess );
MPI_Comm_rank( MPI_COMM_WORLD, &nID );
// メモリ確保(500MB)
pData = (double *)malloc( sizeof(double) * ( 8096 * 8095 ) );
for ( i=0; i<nSize; i++ ) pData[i] = 0.0;
// メモリ確保後の確認
printf( "pause 1 @ %d\n", nID );
getchar();
MPI_Barrier( MPI_COMM_WORLD );
// メモリ解放
printf( "delete @ %d\n", nID );
free( pData );
// メモリ解放後の確認
printf( "pause 2 @ %d\n", nID );
getchar();
MPI_Barrier( MPI_COMM_WORLD );
// MPI終了
MPI_Finalize();
return 0;
}
----------------------------------------------
---[コンパイルおよび実行時のパラメータ]-------
コンパイル> mpicc main.c -o test
実行(OK) > scrun -nodes=1 ./test
実行(NG) > scrun -nodes=2 ./test
----------------------------------------------
------------------------
本庄 央樹(Honjo Hisaki)
------------------------
SCore-users-jp メーリングリストの案内