メインコンテンツに移動

エピローグ

SLURMジョブ管理サーバーがTorque/MAUIサーバーの代わりに利用できることが判明した.ライセンス違反にならないように,早急に,交換しよう.

とその前に. プロローグとエピローグ書いてないんだった. 「いや,やり方わかんないんで」といいつつ迷惑をかける奴が出てこないように(解除する能力を持った奴だけが解除できるように)デフォルトで掛かるように設定しておこう.バカが太い顔してると倫理観が下がるからな.

Prologの後ろでエラー

まだPrologに何もしていないのだが,実行ノードのログに妙なのが出ているな

[2019-12-25T11:59:49.389] launch task 119.0 request from UID:2002 GID:2001 HOST:10.249.229.225 PORT:36039
[2019-12-25T11:59:49.389] lllp_distribution jobid [119] implicit auto binding: cores,one_thread, dist 8192
[2019-12-25T11:59:49.389] _task_layout_lllp_cyclic
[2019-12-25T11:59:49.389] _lllp_generate_cpu_bind jobid [119]: mask_cpu,one_thread, 0x1,0x2
[2019-12-25T11:59:49.389] _run_prolog: run job script took usec=3
[2019-12-25T11:59:49.389] _run_prolog: prolog with lock for job 119 ran for 0 seconds
[2019-12-25T11:59:49.418] [119.0] task_p_pre_launch: Using sched_affinity for tasks
[2019-12-25T11:59:49.418] [119.0] task_p_pre_launch: Using sched_affinity for tasks
[2019-12-25T11:59:50.857] [119.0] error: ib2007-2 [1] pmixp_utils.c:476 [_is_dir] mpi/pmix: ERROR: Cannot stat() path="/tmp/spmix_appdir_119.0": No such file or directory (2)
[2019-12-25T11:59:50.857] [119.0] error: ib2007-2 [1] pmixp_utils.c:496 [pmixp_rmdir_recursively] mpi/pmix: ERROR: path="/tmp/spmix_appdir_119.0" is not a directory
[2019-12-25T11:59:50.857] [119.0] error: ib2007-2 [1] pmixp_client.c:493 [pmixp_libpmix_finalize] mpi/pmix: ERROR: Failed to remove /tmp/spmix_appdir_119.0

なんじゃこりゃ.全部の計算ノードに出ているが,エラーとはなってねえぞ. Prologって青いとこで入るんだよねえ? 管理サーバーのログはシンプルなもんだ

[2019-12-25T11:59:49.378] sched: _slurm_rpc_allocate_resources JobId=119 NodeList=ib2007-[1-2,4] usec=257
[2019-12-25T11:59:50.856] _job_complete: JobId=119 WEXITSTATUS 0
[2019-12-25T11:59:50.856] _job_complete: JobId=119 done

ふうん.あまり気にしてない人もいるな.とりま find . -name pmixp_utils.c してみると, 問題はslurm/src/plugins/mpi/pmix/pmixp_utils.c だそうだ.ええっとですね,この pmixp_info_tmpdir_lib() ってフォルダーを作るでしょ.slurmd 由来が作るから root の持ち物.でもジョブユーザーにもゆめる必要があるんだっつうて,

int pmixp_mkdir(char *path, mode_t rights)
{
        /* NOTE: we need user who owns the job to access PMIx usock file. According to 'man 7 unix':
         * "... In the Linux implementation, sockets which are visible in the file system honor the permissions of the directory
           they are in... "
         * Our case is the following: slurmstepd is usually running as root,
         * user application will be "sudo'ed". To provide both of them with access to the unix socket we do the following:
         * 1. Owner ID is set to the job owner.
         * 2. Group ID corresponds to slurmstepd.
         * 3. Set 0770 access mode    いい考えじゃないか.そりゃな.
         */
        if (0 != mkdir(path, rights) ) {
                PMIXP_ERROR_STD("Cannot create directory \"%s\"",path);
                return errno;
        }
        /* There might be umask that will drop essential rights.
         * Fix it explicitly.
         * TODO: is there more elegant solution? */
        if (chmod(path, rights) < 0) {
                error("%s: chown(%s): %m", __func__, path);
                return errno;
        }
        if (chown(path, (uid_t) pmixp_info_jobuid(), (gid_t) -1) < 0) {
                error("%s: chown(%s): %m", __func__, path);
                return errno;
        }
        return 0;
}

このように作った.オーナーはユーザ,グループrootのフォルダーである.で, 用が済んだので,pmixp_client.c:493 で消そうと思いました. 

extern int pmixp_libpmix_finalize(void){
        int rc = SLURM_SUCCESS, rc1;
        rc = pmixp_lib_finalize();
        rc1 = pmixp_rmdir_recursively(pmixp_info_tmpdir_lib());
        if (0 != rc1) {
                PMIXP_ERROR_STD("Failed to remove %s\n",pmixp_info_tmpdir_lib());/* Not considering this as fatal error */
        }
        rc1 = pmixp_rmdir_recursively(pmixp_info_tmpdir_cli());
        if (0 != rc1) {
                PMIXP_ERROR_STD("Failed to remove %s\n",pmixp_info_tmpdir_cli());/* Not considering this as fatal error */
        }
        return rc;
}

エラーしてるのは,下の方ですね.上は消せているのよ.で, なんでか対象フォルダーが既になくて,打ちひしがれているわけだ.

フォルダーを作ったり利用したりするのは無事であった.後片付けをしようとしたらエラーした.

だが!しかし!対象のフォルダーは /tmp に見当たらない.無事に消せている.と,いうことは:

  • 実は pmixp_info_tmpdir_lib = pmixp_info_tmpdir_cli であり, 悲しい哉,上の作業で無事に消えている
    • 定義は pmixp_info.h で
      pmixp_info_tmpdir_cli = _pmixp_job_info.cli_tmpdir;
      pmixp_info_tmpdir_lib = _pmixp_job_info.lib_tmpdir;

    • cli_tmpdir と lib_tmpdir は, pmix_jobinfo_t でどこかから受け取る.だれが送ってるんだ
    • どうやらPMIx本体のようだ.
  • PMIxがプラグインに何送っているかは不明だな.もしかして cli_tmpdir = lib_tmpdir の可能性も排除できない
  • そもそも pmixp_info_tmpdir_lib が不要なケースがありフォルダーがそもそも存在しない

ええい面倒だ,フォルダーが存在する場合にだけ,削除を試みれば良いのだ,それで,問題ないでしょ?フォルダーがあるときに削除できなかったらエラーだけど,フォルダーが上で削除済みなら,ただエラー出すだけだからな!

紛らわしいので,errorとか言わないように訂正した(フォルダーが存在する場合にだけ,pmixp_rmdir_recursiveを呼び出す).

プロローグ&エピローグ

プロローグ・エピローグには数種類あるが,今回関係しそうなものを調べる.

プロローグ・エピローグ

まず, root権限で実行されるプロローグが実行される.ジョブを引き受けた全ての計算ノードについて,1回づつ実行される. 利用できる情報は大変限定される:

SLURM_STEP_ID=0
SLURMD_NODENAME=ib2007-1    別の計算ノードでは,そのマシンの名前になる
PWD=/var/log/slurm                      お前のHOMEフォルダーなんか教えていらねえよ
SLURM_CLUSTER_NAME=fdlab     いや,違うことないだろ
SLURM_NODELIST=ib2007-[1-2]
SLURM_CONF=/usr/local/etc/slurm.conf     それを知ったから,どうなると?!
SLURM_JOB_PARTITION=F
SLURM_SCRIPT_CONTEXT=prolog_slurmd
SLURM_JOB_USER=sugimoto
SLURM_UID=2002
SLURM_JOB_UID=2002 
SLURM_JOB_ID=145                   ジョブ番号はわかる
SLURM_JOBID=145                       ?!?!2回目だな
SLURM_JOB_CONSTRAINTS=(null)

正直,フォルダーを作るのげせいぜいである.が,しかし,root権限であるので,それだけでもありがたい話かもしれない.スクリプトのstdoutは存在しないので,echo とかしてもダメです.ファイルに情報を書き出すことは可能です. 例えばこんな感じだ:

TMPDIR=/local/tmp/$SLURM_JOB_ID
mkdir -p $TMPDIR
chown $SLURM_JOB_USER $TMPDIR

タスク・{プロローグ|エピローグ}

次に,ユーザー権限で実行されるタスク・プロローグが実行される.これも計算ノードごとに1回実行される.以下の情報は有効だなHOSTNAME=ib2007-1                       ← 計算ノードの「代表者」
                                             hostnameではなく, SLURMにおける登録名である. 全ての計算ノードで共通になる
SLURMD_NODENAME=ib2007-2    ← その計算ノードのSLURMにおける登録名
SLURMD_JOB_USER=sugimoto     ← 実行ユーザー
HOME=/net/sun3/sugimoto              ← 実行ユーザーのHOMEフォルダー
SLURM_SUBMIT_DIR=/net/sun3/sugimoto/test/JOB/SLURM      ← ジョブを投入したフォルダー名
TMPDIR=/local/tmp/145                   ← プロローグで設定した変数も見える

 
ううん,しかし,自動的にcdしてから開始する方法がないなあ.これでは,せっかくSSDをRAID0で多数並べたスーパー爆速ディスクを利用せずに,nfsでえっちらおっちらファイルアクセスをして人の邪魔をする奴が増えてしまう.

どうしたものか.要するに

  • sbatch の場合だけでいいから,ジョブ文本体を実行する前に,1行コマンドを実行してほしい
  • ジョブ文本体が終わったら,1行コマンドを実行してほしい

というだけなのだが..

SPANK

そいつはSPANKとかいうらしいぞ.さすがリバモアは違うな.しかし・・・こりゃぢぇんぢぇんわきゃんにゃいわ.

あきらめた.わかりそうな気が1mmもしない.難しいというより,てめえのシステムだけに合わせて文書なしって奴だ.

まあしかたあるみゃあて.

プロローグとエピローグは,現システムのを参考に

  • プロローグは,/net/ノード名/tmp/JOBID フォルダーを作成
  • エピローグは,/net/ノード名/tmp/JOBID フォルダーを2日後に削除するように予約
  • タスク・プロローグは,代表者が
    • 作業フォルダーの詳細を「ファイルに書き込む」

しかしかたあるめえ.で,一時ファイル領域を使う人は

  • cd `StartDisk`
    • 作業フォルダーの場所を読み取り,rsync
  • 計算実行
  • cd `FinshDisk`
    • 作業フォルダーを回収

と書く,というルールだ.
   

まあ,いずれにせよ,予定より4-5日余計にかかったが,ジョブ管理システム更新テストは無事終了だ.

ジョブクラス

実用できるジョブクラスを設定しておく.