クラスタシステム利用の Tips
クラスタシステム利用にあたって気づいた便利なノウハウなどの記入をお願いします.ログインすることで編集できるようになります.
研究ユーザ情報交換用メーリングリストの過去ログ
研究ユーザの情報交換用メーリングリストの過去ログは, http://lists.imc.tut.ac.jp/pipermail/research-users/ で見れます.
使用リソース(メモリ使用量など)の計測
プロセスが使用したリソース(メモリ使用量など)は GNU 版 time コマンド(/usr/bin/time)で計測できます.オプション -v を利用することで,以下のようにプロセスが使用したリソースの詳細が表示されます(Man page of TIME).
-bash-4.1$ /usr/bin/time --version GNU time 1.7 -bash-4.1$ /usr/bin/time -v whoami my016 Command being timed: "whoami" User time (seconds): 0.00 System time (seconds): 0.00 Percent of CPU this job got: 0% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 3088 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 243 Voluntary context switches: 3 Involuntary context switches: 1 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
メモリの使用量は Maximum resident set size で知ることができますが, v1.7 には実際の4倍で表示されるという既知のバグ(実使用量は表示された値の4分の1)があります(GNU Time にある壮大なバグ).
GNU 版 time コマンドはクラスタの演算ノードでも利用できますが,結果が標準エラー出力であることに留意する必要があります.
投入しているジョブの一括削除
一般のユーザには qdel コマンドのオプション all が許可されておらず,また,オプション -t が正常に作動しないため,投入しているジョブの一括削除には,以下のようなスクリプトを利用します.
1 #!/bin/bash
2
3 if [ $# -ne 1 -a $# -ne 2 ]; then
4 echo "Usage: bash $0 [ 'all' | firstId lastId | lastId ]"
5 exit
6 fi
7
8 # 第一引数が数値か否か
9 if expr "$1" : '[0-9]*' > /dev/null ; then
10 ids=`seq $1 $2`
11 else
12 ids=`qstat | cut -d . -f 1 | tail -n +3 | column`
13 fi
14
15 echo qdel $ids
16 qdel $ids
第一引数に all を指定することにより,投入しているジョブ(実行中か否かは問いません)の全てを削除します.また,第一引数及び第二引数を利用することにより,削除するジョブIDの範囲を指定することもできます.実行スクリプトを qdel.sh としたとき,以下のように実行します.
-bash-4.1$ bash qdel.sh all -bash-4.1$ bash qdel.sh 100 200
任意のコマンドをジョブ投入するスクリプト
qsub コマンドの -v オプションを利用すると,実行スクリプトに任意の環境変数を渡すことができます.この機能を利用し,演算ノードに任意のコマンドを実行できるようにしたものが以下のスクリプトです.なお,標準エラー出力は標準出力とともに出力し(-j oe),実行時間及び実行ノードを記録するためのコマンド(date, hostname)も含まれています.
実行スクリプトを qsub.sh としたとき,以下のように JOB_CMD に任意のコマンドを指定してジョブを投入します.
-bash-4.1$ qsub -v JOB_CMD="/usr/bin/time -v perl i_love_cats.pl" qsub.sh -bash-4.1$ qsub -v JOB_CMD="perl catching_cats.pl | perl counting_cats.pl" qsub.sh
ジョブの実行状態を繰り返し表示
投入したジョブがどのような状況かを表示する場合には, watch コマンドを併用すると便利です.以下のように実行すると,5秒間隔で繰り返し実行され,常に最新の状態を把握することができます.また,オプション -d を指定すると,前回との差分がハイライトされます.なお,繰り返し実行するコマンドにエイリアスは指定できません.
-bash-4.1$ watch -n 5 qstat -a -bash-4.1$ watch -n 5 qstat -Q -bash-4.1$ watch -n 5 -d qstat -Q
ulimit -t (cpu time) による制限
開発ノードには ulimit による cpu time の制限が存在します.この制限値は time コマンドで表示される値とは異なる値(隠れた値)に対して適用されるようです.原因のよくわからない「強制終了」が発生した場合,この制限が原因である可能性があります.例えば,大量のデータを rsync で同期すると以下のようなエラーが発生します.
-bash-4.1$ rsync --progress -avh /tmp/source /destination/ sending incremental file list ... rsync: writefd_unbuffered failed to write 4 bytes to socket [sender]: Broken pipe (32) rsync: connection unexpectedly closed (96 bytes received so far) [sender] rsync error: error in rsync protocol data stream (code 12) at io.c(600) [sender=3.0.6]
rsync が消費する cpu time は --bwlimit の指定に関係なく,概ねデータ転送量で決まるようです.リモート同期の場合は ssh による経路暗号化処理が入るため,ローカル同期よりも cpu time を2倍程度消費する傾向にあります.
ジョブの割り当て順序
広域連携教育研究用クラスタ
ジョブスケジューラは wsnd30, wsnd29, ..., wsnd00 のようにホスト番号の大きい演算ノードから順にジョブを割り当てる.
次世代シミュレーション技術者教育用クラスタ
ジョブスケジューラは csnd02, csnd03, ..., csnd27, csnd00, csnd01 のように基本的にホスト番号の小さい演算ノードから順にジョブを割り当てる. csnd00, csnd01 は GPGPU が搭載されたノードであるため,最後に割り当てられる.