[Japanese|English]
クラスタシステム利用の Tips
クラスタシステム利用にあたって気づいた便利なノウハウなどの記入をお願いします.ログインすることで編集できるようになります.
目次
研究ユーザ情報交換用メーリングリストの過去ログ
研究ユーザの情報交換用メーリングリストの過去ログは, http://lists.imc.tut.ac.jp/pipermail/research-users/ で見れます.
使用リソース(メモリ使用量など)の計測
プロセスが使用したリソース(メモリ使用量など)は GNU 版 time コマンド(/usr/bin/time)で計測できます.オプション -v を利用することで,以下のようにプロセスが使用したリソースの詳細が表示されます(Man page of TIME).
$ /usr/bin/time --version GNU time 1.7 $ /usr/bin/time -v perl -e '"x" x 400 x 1024 x 1024' Command being timed: "perl -e "x" x 400 x 1024 x 1024" User time (seconds): 0.08 System time (seconds): 0.15 Percent of CPU this job got: 98% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.24 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): 411772 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 47885 Voluntary context switches: 15 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 $ /usr/bin/time -f %M perl -e '"x" x 400 x 1024 x 1024' 411900
メモリの使用量は Maximum resident set size で知ることができます.また, -f %M を指定することでメモリの使用量のみを出力することもできます.
GNU 版 time コマンドはクラスタの演算ノードでも利用できますが,結果が標準エラー出力であることに留意する必要があります.
ジョブの実行状態を繰り返し表示
投入したジョブがどのような状況かを表示する場合には, 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倍程度消費する傾向にあります.
ラッパーツールの設定・利用
3系の 吉田 が作成した,クラスタを対話式に近い形で利用するためのツールの設定方法と利用方法.
設定方法
ホームディレクトリ直下の bin にツールへのシンボリックリンクを作る.
$ mkdir ~/bin $ ln -s /work/my016/tool/qcmd.sh ~/bin/qcmd $ ln -s /work/my016/tool/qwatch.pl ~/bin/qwatch
~/.bash_profile に以下の3行を追記する(ホームディレクトリ直下の bin に PATH を設定).
if [ -d "$HOME/bin" ] ; then export PATH="$HOME/bin:$PATH" fi
~/.bashrc に以下の3行を追記する.
alias qdelall='bash /work/my016/tool/qdel.sh all' alias qdelqueue='bash /work/my016/tool/qdel.sh queue' alias qdelrun='bash /work/my016/tool/qdel.sh run'
再度,ログインする.
ジョブ投入コマンド(qcmd)
qcmd は任意のコマンドをクラスタのノード上で実行するためのツールです.
$ qcmd Usage: [Q=QueueName] [S=select] [V=vhost] [C=ncpus] [G=ngpus] [M=Req'd Memory (gb)] [W=Req'd Time (hour)] [J=JobName] [AO=afterok:JobID] [DOCKER_IMAGE|SINGULARITY_IMAGE=image] qcmd [-I|command|-- executable]
- Q: ジョブを投入するキュー名(default: S, C, G, M, Wの値に応じて最適なもの)
- S: 必要ノード数(default: 1)
- V: 実行するノード(default: 未指定)
- C: 1ノードあたりの必要CPU数(default: 1)
- G: 1ノードあたりの必要GPU数(default: 0)
- M: 1ノードあたりの必要メモリ量(default: 6,単位: GB)
- W: ジョブの制限時間(default: 24,単位: hour)
- J: ジョブ名(default: qcmd)※qstatなどで表示される名前
実行例
$ qcmd ps aux $ qcmd /usr/bin/time -v perl i_love_cats.pl $ M=20 qcmd /usr/bin/time -v perl i_love_fat_cats.pl $ qcmd "perl catching_cats.pl | perl counting_cats.pl"
通常は qcmd の後ろに実行したいコマンドを指定すれば,(Vによるノードの指定がなければ)任意のノードで実行されます.その実行結果(標準出力の内容)は,カレントディレクトリの [JobName].o[JobID] というファイルに出力されます.
- オプションは qcmd の手前に記述します.
パイプ(|)やリダイレクト(>)を利用する場合には,コマンド全体をダブルクォート(")で括ります.
- コンテナが指定されない場合,「SINGULARITY_IMAGE=imc.tut.ac.jp/centos7:2019.09」という窓口サーバ相当コンテナが自動選択されます.
- コマンドの代わりに -I を指定すると,インタラクティブ実行になります.この場合の W のデフォルト値は 12 です.
- qcmd -- ps aux のように -- を付けてコマンドを指定した場合, qsub -- executable のモードで実行されます.
- qsub を呼び出す際に -V を指定しているため,全ての環境変数が引き継がれます.ただし,-- executableによる実行の場合,環境変数PATHが引き継がれない場合があります.
~/.bash_profile に以下の3行を追記すると,「qcmd -I」のインタラクティブ実行を,実行時のディレクトリに移動した状態で起動できます.
if [ -n "$PBS_O_WORKDIR" -a "$PBS_ENVIRONMENT" = "PBS_INTERACTIVE" ]; then cd "$PBS_O_WORKDIR" fi
クラスタ確認コマンド(qwatch)
qwatch はクラスタの稼働状況を確認するためのツールです.
$ qwatch -h Usage: perl qwatch.pl [Options] Options: -h, --help 標準出力に使用方法のメッセージを出力して正常終了する。 -n, --node ノードの情報を表示する。--fields-nodeの指定は無視される。 -u, --user ユーザの情報を表示する。--fields-userの指定は無視される。 -j, --job ジョブの情報を表示する。--fields-jobの指定は無視される。 -m, --mine ジョブの情報を表示する際、自身のジョブの情報に限定する。 --fields-node 出力するノードのフィールドをカンマで区切る。 --fields-user 出力するユーザのフィールドをカンマで区切る。 --fields-job 出力するジョブのフィールドをカンマで区切る。
実行例
$ qwatch $ qwatch -jm
あなたのジョブが実行されているノードは,UsersやNodesを確認することで分かります.
あなたが指定したncpusの値を100倍したものとCPU(%)の値との間に,著しい乖離がないかを確認してください(特にncpusを2以上にしている場合).もし,ncpus=28を指定しているにもかかわらず(TSKが20になります),CPU使用率「CPU(%)」が75であれば,非常に非効率な実行になっている可能性が高いです(1つのCPUも使い切っていない).
ジョブ削除コマンド(qdelall, qdelqueue, qdelrun)
~/.bashrc で設定したエイリアスにより,以下の3コマンドが利用可能になります.
- qdelall
- 投入したジョブを全て取り消す
- qdelqueue
- 投入したジョブのうち,実行待ちジョブ(キュー)のみを取り消す
- qdelrun
- 投入したジョブのうり,実行中のジョブのみを取り消す