ジョブスケジューラによる分散計算
共用計算機を利用して大量の計算を分散計算する方法や考えかた、マナーなどを述べる。ここではSun Grid Engine系のスケジューラを想定している。
プライオリティの考えかた
- 共有リソースであるスパコンを、自分と他人がともに最大限実行できるよう配慮する
- 速く計算が終わる人を優先する (1時間で終わる計算を数週間待たされるのは理不尽)
- 計算時間が長いジョブはプライオリティを下げる (数週間かかる計算をさらに1時間待つことは可能)
タブー
- ジョブスケジューラを使わずに計算する (リソース管理されなくなるので公平に計算機を利用できない)
- ヘッド、ログインノードで計算しようとする (ログインに支障がでる)
ジョブの操作
ジョブの投入
qsub -q [キュー名] -p [プライオリティ] -l [メモリ量] [シェルスクリプト名]
プライオリティは-1023から1024であり小さいほうがプライオリティが低い。0がデフォルト。 rootでない限りプラオリティが下げることしかできない。
メモリ量は -l h_vmem=24G
とすれば24GBを確保できる。
ジョブの確認
qstat -u [ユーザ名] # ユーザのキューのみを確認
qstat -u "*" # 全員のキューを確認
ジョブを強制終了する
qdel -u [ユーザ名] # ユーザのジョブをすべて停止させる
qdel [ジョブID] # 指定したジョブIDだけ停止させる
ジョブの詳細情報を得る
qacct -j [ジョブID]
メモリやCPUの使用状況を確認できる。
一度に大量のジョブを投入する
アレイジョブについて記述する。
マルチコア・CPUを利用するジョブを投入する
確保するCPUコア数 = スロット数を指定してジョブを投入する。
投入するシェルスクリプトに以下の行を入れる。
#$ -l nc=[slot数]
実行するプログラムで指定するコア数と同じ数字を[スロット数]に入れる。
最近多くのプログラムがマルチコアで動作する。なるべくそのようなプログラムを利用する。 スロットを細かくしすぎると、他の複数スロットを利用するマルチコアジョブが、 入りにくくなるので、なるべく避ける。
例えば8 cores CPUが2つあるノードは16スロット使える。 ある人が1スロットのジョブを大量に投げてしまうと、1ジョブが 終了しても、すぐまた1スロットのジョブが入ってしまう。 これだと、ほかの8コアや16コアの人がいつまで入っていかない。
キューの確認
キューのリストを得る
qconf -sql
ノードの設定・確認
ジョブが投入できるホストのリストを得る
qconf -ss
ノートを追加する
qconf -as [ノード名]
そのほかのコツ
メモリが足りなくてOSにジョブをkillされる
LinuxにはOMM killerという機能があり、メモリを使いすぎてOSに影響が出てしまうプロセスを kill する。OMM killer がkillしそうなプロセスが以下で見れる。
dstat --top-oom
このスコアは、/proc/[PID]/oom_score
以下に入っている
/proc/[PID]/oom_adj
には優先順位を入力できる。-16から+15の値で小さいと優先順位は低い。
OMM Killer でプロセスが kill されたかどうかは、syslog を確認する。
sudo grep Killed /var/log/messages
IOアクセスを減らして高速に計算する
- IOを減らすために、なるべくファイルに書き出さずに、パイプを利用する。
- 圧縮ファイルを解凍してから実行すると、その分ストレージが必要になる。解凍した結果をパイプで受けとりながら計算することで、IOアクセスやストレージ量を削減できる。
- ほとんどの場合 fastq が gzip や bz2 のまま、最後まで計算が可能。
ジョブが正常に終わったか確認しやすくする
結果一時ファイルに出力し、最後にリネームする。ファイル名をみて最後までジョブが実行されたか判断しやすくなる。
その他
- 観光バス方式でジョブ名をつける。通し番号をつけるときは降順にする。投入したジョブがいくつまで終わったかがわかりやすい。
- DNA配列解析プログラムでは、メモリ使用量を推定することが難しい場合が多い。大量のジョブを投入する前に、試しに実行してみるのもよい。
- どうしても大量のジョブや、長期のジョブを流したいときは、ユーザのメーリングリストやチャットなどで相談する。ジョブスケジューラは技術的にリソースを管理できるが、研究の優先順位や締切などソーシャルなリソース管理を行うことができないため、ソーシャルな解決が時には必要であることに注意すること。