slurm24.11:preempt機能によるジョブのSUSPENDと割込実行②

### 前回の続きQoSによる制御

前回はパーティションに優先順位を付けることで、優先するジョブを割込み実行出来るようにしました。

手軽ではあるのですが、パーティションの数が単純に二倍になるのでパーティション数が多い環境には不向きです。

そこで前回のようなパーティションに優先順位を付けるのでは無く、ジョブ単位で優先順位を付けて
優先度の高いジョブが割込実行出来るようにしていきます。

### QoSを使った割込実行をするための設定

下記設定で、QoSを使った場合の優先度を大きく設定し、優先ジョブが投入されたら５秒以内で切り替わるように設定しています。
まずこの段階で大きく引っかかったのはPreemptExemptTimeの設定がPreemptExemptTime=10(秒）と思い設定をしていたら、実際は10分（分単位）であることに気付くまで１週間以上無駄な時間を掛けました。
マニュアルにちゃんと記載されていたのに、初歩的なミスで多少落ち込みました。
記述方法としては、デフォルトは分単位、0:5で分:秒、0:0:5で時：分：秒という単位で記述出来るそうですが、時間単位でwaitを掛ける必要は正直ないと思います。

本来ならばOverSubscribeを使わないで割込実行したかったのですが、現状リソースの安全な解放方法を確保出来ず、多少ダーティーなやり方で割込を実現させています。

```:slurm.conf
PriorityType=priority/multifactor
PriorityWeightQOS=100000

PreemptType=preempt/qos
PreemptMode=SUSPEND,GANG
PreemptExemptTime=0:5

PartitionName=standard Nodes=ALL Default=YES MaxTime=INFINITE State=UP PreemptMode=SUSPEND,GANG OverSubscribe=FORCE:1

```

ジョブに設定するQoSとして、low,normal,highを作ります。

```
# low: 優先度が低く、誰もプリエンプトしない
sacctmgr add qos low Priority=500 Preempt=off Flags=NO_DECAY

# normal: 少し高めの優先度、誰もプリエンプトしない
sacctmgr add qos normal Priority=1000 Preempt=off Flags=NO_DECAY

# high: 優先度が高く、lowとnormalをプリエンプト（suspend）できる
sacctmgr add qos high Priority=10000 Preempt=low,normal Flags=NO_DECAY
```

実行するジョブは前回の記事のジョブを少し修正し、Qosの設定を追加しています。

```:normal.sh
#!/bin/bash
#SBATCH --job-name=test.sh
#SBATCH -o job_%J_%j.out
#SBATCH -e job_%J_%j.err
#SBATCH --qos=normal

# メモリを１ＧＢ消費して300秒waitするだけのスクリプト
python mem.py
```

```:high.sh
#!/bin/bash
#SBATCH --job-name=high.sh
#SBATCH -o job_%J_%j.out
#SBATCH -e job_%J_%j.err
#SBATCH --qos=high

python mem.py
```

それではnormalのジョブを３つ実行し、ちゃんと割り込まれているか検証したいと思います。

```:bash
$sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
normal*      up   infinite      1   idle slurm2411c1

(base) testuser1@slurm2411c1:/work/temp$ squeue
JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)

```

まずは、normalパーティションからジョブを投入します。
```:bash
(base) testuser1@slurm2411c1:/work/temp$ sbatch normal.sh 
Submitted batch job 177
(base) testuser1@slurm2411c1:/work/temp$ sbatch normal.sh 
Submitted batch job 178
(base) testuser1@slurm2411c1:/work/temp$ sbatch normal.sh 
Submitted batch job 179

(base) testuser1@slurm2411c1:/work/temp$ squeue

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
179  normal      test.sh  testuser1 PD       0:00      1 (Resources)
178  normal      test.sh  testuser1  R       3:46      1 slurm2411c1
177  normal      test.sh  testuser1  R       3:49      1 slurm2411c1
```

qos=highを設定したジョブを投入するとJOBID：177がS(SUSPEND)になり、high.shが実行されました。

```
(base) testuser1@slurm2411c1:/work/temp$ sbatch normal.sh 
Submitted batch job 180

(base) testuser1@slurm2411c1:/work/temp$ squeue

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
179  normal      test.sh  testuser1 PD       0:00      1 (Resources)
178  normal      test.sh  testuser1  R       3:46      1 slurm2411c1
177  normal      test.sh  testuser1  S       3:49      1 slurm2411c1
180  normal      high.sh  testuser1  R       0:09      1 slurm2411c1
```

しかし経過を見ていると、JOBID:177と180(high.sh)が交互にR(RUN)とS(SUSPEND)になりました。

```
(base) testuser1@slurm2411c1:/work/temp$ squeue

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
179  normal      test.sh  testuser1 PD       0:00      1 (Resources)
178  normal      test.sh  testuser1  R       3:46      1 slurm2411c1
177  normal      test.sh  testuser1  R       3:49      1 slurm2411c1
180  normal      high.sh  testuser1  S       0:09      1 slurm2411c1

(base) testuser1@slurm2411c1:/work/temp$ squeue

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
179  normal      test.sh  testuser1 PD       0:00      1 (Resources)
178  normal      test.sh  testuser1  R       3:46      1 slurm2411c1
177  normal      test.sh  testuser1  S       3:49      1 slurm2411c1
180  normal      high.sh  testuser1  R       0:09      1 slurm2411c1

```




### 終わりに

OverSubscribeによって、CPUのリソースは競合していても動作する事ができました。
しかしマニュアル上ではGPUリソースを使う場合は割込は出来ないと記載されていますので、
GPUを使うジョブに関しては素直に待つしかないようです。

REQUEUEなら結局再計算になってしまうので、メモリリソースを解放（スワップへの待避含め）することが出来ないかもうちょっと調査を継続する予定