[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gfarm-discuss-ja:00642] Re: 並列分散処理のプロセス数の制御とスプールディレクトリの共有
- From: Osamu Tatebe <tatebe@xxxxxxxxxxxxxxxx>
- Date: Wed, 21 Jun 2006 23:02:11 +0900 (JST)
山本さま:
今回のご質問以外では,衛星観測データの解析環境の構築は順調でしょうか?
まず,質問1に関してです.
gfrun は,ssh や mpirun などのように(複数の)プロセスを interactive に
起動するプログラムです.ですので,ご質問のように 365 フラグメントからな
るファイルを -G オプションで指定すると,365 プロセスを一気に起動してし
まいます.
同時に起動するプロセス数を制御するための方法はいくつかあります.以下,
バッチキューイングシステムを利用する方法,添付のスクリプトを利用する方
法を説明します.
1. バッチキューイングシステムを利用する方法
Gfarm のファイル・アフィニティ・スケジューリングを無視してもいいのであ
れば,PBS や SGE などの既存のバッチシステムを利用することができます.こ
のとき,365 フラグメントからなる一ファイルではなく,(1 フラグメントか
らなる)365 ファイルとなるように Gfarm ファイルシステムにコピーして,そ
れぞれのファイルを解析するプログラムを submit するということになります.
ファイル・アフィニティ・スケジューリングを理解させるためには,バッチシ
ステムに Gfarm 用のスケジューリング・プラグインを開発する必要があります.
LSF に関してはそのための研究開発がありましたが,残念ながら一般公開はな
されていません.また,その他のシステムに関してはまだ誰も作っていません.
# contribution は大歓迎です.
2. 添付のスクリプト gfq.sh を利用する方法
まず,このスクリプトは,システムコールフックライブラリ(libgfs_hook.so)
の利用を前提としていますので注意してください.
添付の三つのスクリプトを PATH の通っているディレクトリに保存して,実行
ビットを立てて,以下のように実行します.
% gfq.sh file cmd arg ...
file は,ファイル・アフィニティ・スケジューリングで指定するファイルです.
このとき,例えば file が 356 フラグメントからなる場合,最終的には計
356 プロセスが実行されますが,それぞれのノードでは同時には高々一つのプ
ロセスしか実行されません.
なお,上記は,実行したいプログラムが一つの場合ですが,複数ある場合は,
以下のように gfq_setup.sh と gfq_commit.sh に分けて実行します.
% gfq_setup.sh file1 cmd1 arg ...
% gfq_setup.sh file2 cmd2 arg ...
% ...
% gfq_commit.sh
ただし,この場合,それぞれのノードでの負荷分散は均等ではなくなる可能性
があります.
これらのスクリプトで要求が満たされれればと思いますが,どうでしょうか?
次に,質問2に関してです.
スプールディレクトリを NFS 上に設定することは可能は可能ですが,一般的に
は,それぞれのファイルシステムノードのスプールディレクトリは別々のディ
レクトリにする必要があります.ファイル複製を絶対に作成しない,というの
であれば,ディレクトリを分けなくても動作しますが,なにかのきっかけでファ
イル複製を作成してしまったときにファイルを失ってしまうと思います.また,
いずれにしても他のファイルシステムノードが担当するファイルをアクセスす
るのに,NFS のオーバヘッドに,Gfarm のオーバヘッドが加わってしまうため,
オトクではありません.
恐らく,今回期待されているような動作のためには,ファイルを作成した=全
ノードにファイル複製が作成された,というような動作にすればよいように思
います.そのように Gfarm を修正することは容易ですので,必要であればパッ
チを送付します.
# ちなみに,この場合,ファイルアクセスに関して Gfarm のオーバヘッドは
# 殆んど無視できると思います.
ただ,ファイルアクセス性能がその共有されているファイルシステムの性能に
おさえられてしまいスケールしない,という点はご了承ください.
建部@筑波大
>> On Wed, 21 Jun 2006 12:23:47 +0900, 山本 和憲 <yamamoto@xxxxxxxxxxxxxxxxxxxxxxx> said:
>> 初めまして。
>> 私は愛媛大学大学院 理工学研究科 D1の山本と申します。
>> 現在、Gfarmを用いて衛星観測データの解析環境の構築を試みております。
>> Gfarm v1.2.9を使用しておりまして、
>> 2点ほど質問させて頂く思い、投稿させて頂きました。
>> 質問1.1台のファイルシステムノードで実行される並列分散処理のプロセス数
>> の制御
>> 複数の観測データファイルを1つのGfarmファイルにインポートして、
>> 並列分散処理させる試みを行っております。
>> これまでに1年間の観測データファイル(ファイル数365)を1つのGfarmファ
>> イルとして扱い、
>> 並列分散処理させる試みを行いました。
>> これには7台のファイルシステムノードを使用して、
>> 事前に365個のファイルを均等に7分割して格納しました。
>> この状態で各ファイルを1つのGfarmファイルにインポートして並列分散処理
>> を行った場合に、
>> 1台のファイルシステムノードは各ローカルディスクにある
>> 約50個のファイルの処理を担当することになると思います。
>> 実際に並列分散処理中にgfpsコマンドやpsコマンドで見てみたところ、
>> 1台のファイルシステムノードに並列分散処理の実行プロセスが
>> 同時に複数立ち上がっている状態でありました。
>> しかし、実行時間については、
>> ローカルディスクに全データを格納して1ファイルずつ逐次処理させた場合の
>> 方が速く、
>> その原因の1つとして、並列分散処理の際に1台のファイルシステムノードに
>> 複数の並列分散処理プロセスが立ち上がってしまっているために、
>> スワップを引き起こしてオーバーヘッドになっているからでないかと思いました。
>> 理想としましては、1台のファイルシステムノードがローカルディスクにある
>> 複数のファイルを担当するのですが、
>> その処理は1ファイルずつという風に、
>> 並列分散処理を行う場合に1台のファイルシステムノードで実行されるプロセ
>> ス数を制御することは可能でしょうか?
>> 質問2.ファイルシステムノードのスプールディレクトリをNFSで共有できるか
>> これは、ネットワークのトラフィックを軽減し、
>> ディスクのローカルI/Oを積極に活用するというGfarmのコンセプトに反するか
>> もしれないのですが、
>> 質問1.で示した構築環境はローカルネットワーク内で行っており、
>> ディスク容量の節約のためにリプリケートは使用せず、
>> ファイルの分散ではなく、処理のみを並列分散させたいと思っております。
>> この際に、ファイルノードのスプールディレクトリをNFSなどで共有して利用
>> することは可能でしょうか?
>> メタデータサーバが管理している情報の整合が取れなくなったりはしないで
>> しょうか?
>> お忙しい中すみませんが、ご教示のほどよろしくお願いいたします。
>> --
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> 山本 和憲 Kazunori YAMAMOTO
>> yamamoto@xxxxxxxxxxxxxxxxxxxxxxx
>> 愛媛大学大学院 理工学研究科 電子情報工学専攻
>> 応用情報工学講座 情報ネットワーク分野
>> http://www.infonet.cite.ehime-u.ac.jp/
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#! /bin/sh
GFQ_DIR=/tmp/.gfq-$$
rm -rf $GFQ_DIR
. gfq_setup.sh $*
. gfq_commit.sh
#! /bin/sh
usage () {
echo usage: $0 file cmd ...
exit 1
}
file=$1
[ X$file = X ] && usage
gfstat $1 > /dev/null || exit 1
[ X$GFQ_DIR = X ] && GFQ_DIR=/tmp/.gfq-$USER
[ ! -d $GFQ_DIR ] && mkdir $GFQ_DIR
shift
cmd=$*
n=$(gfwhere $file | wc -l)
i=0
gfsched gfarm:$file | while read host
do
echo gfexec -I $i -N $n $cmd >> $GFQ_DIR/$host
i=`expr $i + 1`
done#! /bin/sh
[ X$GFQ_DIR = X ] && GFQ_DIR=/tmp/.gfq-$USER
[ -d $GFQ_DIR ] || exit 1
gfqbase=`basename $GFQ_DIR`
rm -rf /gfarm/~/$gfqbase >& /dev/null
cp -pr $GFQ_DIR /gfarm/~/ || exit 1
pushd $GFQ_DIR > /dev/null
for h in *
do
gfrcmd $h sh /gfarm/~/$gfqbase/$h &
done
wait
popd > /dev/null
rm -rf $GFQ_DIR