合計NUMTOT個のプログラムを開始する必要があります(C、Mathematica、ns-2...数学環境はすべて可能です)。問題は、これらのプロセスを実行しているコンピュータがMAX(MAX <NUMTOT)などの実行の最大数だけを許可することです。
次の行を使用して端末でこのプログラムを実行します。
./run.sh -d directory num
ここで、run.shは数学プログラムを呼び出すスクリプト、ディレクトリはプログラムがあるディレクトリ、numは新しい実行回数を表します(integer * num = NUM)。 「run.sh」スクリプトは、「ディレクトリ」(プログラム)のコピーを使用して「num」個のディレクトリを作成し、プログラムの「num」インスタンスを起動します。私の場合、Matlabインスタンスでした。
実行中のプロセスの数を自動的に追跡し、「num」が完了して最大数が(MAX-num)に減ったら、合計数がNUMになるまでMatlabの次の「num」シミュレーションを開始するスクリプトが必要です。シミュレーションが完了しました。
スクリプトが 1 つだけ完了したら、次のプログラムを呼び出して MAX 可能なプロセスを維持できれば、より良いでしょう。
実際に実行されているプロセスの数を知るために、次のスクリプトを実行します。
ps axu |grep plopez|grep simulacion|grep MATLAB|awk '{ $2} END{print NR}'
これは現在実行中のMatlabの総数を提供します。
単一のスクリプトでシミュレーション全体をどのように実行できますか?
答え1
ユーザーが最大プロセス数を実行できるようにする一般的な方法は、マンページで適切な変更を実行する詳細と例をpam_limits(8)
確認することです。limits.conf(5)
/etc/security/limits.conf
特に設定したいパラメータは次のとおりですnproc
。
nproc
maximum number of processes
マンページでこのパラメータを使用する例:
@faculty soft nproc 20
@faculty hard nproc 50
答え2
実行中のインスタンスの数を定期的に確認するのではなく、その数に達するNUM
までプログラムを実行し続け、スクリプトを複数回並列MAX
に実行するスクリプトを作成することをお勧めします。
SIGCHLD
子プロセスが終了したときに放射される信号をキャプチャすることもできます。この機能はまずを使用して有効にする必要がありますset -o monitor
。より詳細な例と代替方法は、以下にあります。Stackoverflowのスレッド。
答え3
MATLAB ジョブが非対話型 (バッチスクリプトの実行など) の場合は、バッチスケジューリングソフトウェアを確認することをお勧めします。トルクまたは泥- この種のリソース管理はまさにこの目的のために設計されています。
これは通常 HPC クラスタで使用されますが、お客様の場合、クラスタにはコンピューティング ノードが 1 つしかありません。
Slurmの利点は、他のスケジューラの長年の経験を活用する現代的でよく設計されたシステムであることです。 Torque/PBSの利点は、おなじみだということです。多くの人がすでに他のクラスタでそれを使用してきました。 Slurm には、PBS や Torque に精通している人が使い慣れたコマンドを使用してすぐに使用できるように、互換性のあるラッパーセットがあります。
どちらも、CPUコア、メモリ、使用可能なライセンスなどに基づいて作業スケジュールを制御するためのいくつかのオプションを提供します。また、ユーザーごとの累積使用量を追跡または制限する必要がある場合は、会計機能も提供します。たとえば、Slurmには、システムを頻繁に使用している人よりも最近、多くのタスクを実行していない人を優先するために使用できる公正な使用重みオプションがあります。これは、合計CPU時間の固定ハードクォータよりも優れています。
制限付きライセンスをバイパスするもう1つのオプションは、次のように機能するようにMATLABスクリプトを作成することです。GNUオクターブそしてMATLAB。その後、必要に応じてテスト/開発実行を実行し、結果を公開したり、他の研究者と協力する必要がある場合は、MATLABで最終実行を実行できます。 OctaveはほとんどMATLABと互換性がありますが、いくつかの違いがあります。一般化する。
答え4
一つBashの子プロセス数の制限に関する他のスレッドの質問に答える次のコードスニペットは、4つのタスクのうちの1つが完了するのを待ち、10秒ごとにチェックします。
while [ $(jobs | wc -l) -ge 4 ] ; do sleep 10 ; done
これらの活動的な睡眠戦略はやや非効率的で、粗雑で不正確であることに注意してください。