SLURMは、開始要求よりも多くのCPUを使用するジョブを許可します


1

私がSLURMで直面している問題は以下のようにまとめることができます。 bashスクリプトを考えましょう test.sh これは8個のCPUを要求しますが、実際には10個のCPUを使用してジョブを開始します。

#!/bin/sh
#SBATCH --ntasks=8
stress -c 10

32個のCPUを搭載したサーバーで、このスクリプトを5回起動すると sbatch test.sh、そのうちの4つはすぐに実行を開始し、最後のものは、によって示されているように、保留中として表示されます squeue コマンド:

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
    5      main  test.sh     jack PD       0:00      1 (Resources)
    1      main  test.sh     jack  R       0:08      1 server
    2      main  test.sh     jack  R       0:08      1 server
    3      main  test.sh     jack  R       0:05      1 server
    4      main  test.sh     jack  R       0:05      1 server

問題は、これら4つのジョブが実際に40個のCPUを使用しており、システムに過負荷をかけていることです。それどころか、SLURMは、ユーザーが要求した以上のリソースを実際に使用しているジョブを開始しないか、それらを開始するのに十分なリソースがあるまでそれらを保留にすることを期待します。

私についてのいくつかの役に立つ詳細 slurm.conf ファイル:

# SCHEDULING                                                                       
#DefMemPerCPU=0                                                                    
FastSchedule=1                                                                     
#MaxMemPerCPU=0                                                                    
SchedulerType=sched/backfill                                                       
SchedulerPort=7321                                                                 
SelectType=select/cons_res                                                         
SelectTypeParameters=CR_CPU
# COMPUTE NODES                                                                 
NodeName=server CPUs=32 RealMemory=10000 State=UNKNOWN                   
# PARTITIONS                                                                    
PartitionName=main Nodes=server Default=YES Shared=YES MaxTime=INFINITE State=UP

私はSLURMから始めたばかりで、この振る舞いに困惑しています。自分のサーバーのユーザーが、あまりにも多くのCPUを使用するジョブを開始しないようにするにはどうすればよいですか。私はマニュアルを読み、フォーラムの情報を探すのに多くの時間を費やしました、しかし残念ながら私は何も役に立ちませんでした。

ご協力ありがとうございます。

回答:


1

Slurmはスクリプトが作成しようとしているプロセス/スレッドの数を知ることができません。それは要求されたリソースに頼ることができるだけです、そしてそれはそれがそれが仕事を予定するのに使うものです。

ここでの最善の方法は、Slurmのアフィニティプラグインを使用して、要求した以上のリソースを使用するジョブを防ぐことです。このプラグインは要求されたCPUにジョブをバインドします。 ( アフィニティドキュメント

ユーザーがそのスクリプトで開始するプロセス/スレッド数を制御することはできませんが、ジョブが使用できるコアの量を制限することで、制御されないユーザーが他のユーザーのジョブに与える影響を減らすことができます。

これはあなたのシステムが過負荷になっているように見えることを防ぎませんが、「悪い」ユーザは彼ら自身に影響を与えるだけです。


0

以下 SOでの議論 私はしようとしている --exclusive これを達成するための議論。私のアーキテクチャはあなたのものとは異なります(私は7つのプロセッサを用意しています)が、ここに私がしたことがあります:

#!/bin/sh
#SBATCH --ntasks=2    
srun -n 2 --exclusive stress -c 1

そして実行中

sbatch test.sh ; sbatch test.sh ; sbatch test.sh ; sbatch test.sh

私に6を与える stress プロセス:

15050 tom       20   0    7308    212    108 R 100.0  0.0   1:47.46 stress                                                                                                              
15054 tom       20   0    7308    208    108 R 100.0  0.0   1:47.47 stress                                                                                                              
15063 tom       20   0    7308    208    108 R 100.0  0.0   1:47.47 stress                                                                                                              
15064 tom       20   0    7308    212    108 R 100.0  0.0   1:47.47 stress                                                                                                              
15080 tom       20   0    7308    208    108 R 100.0  0.0   1:47.46 stress                                                                                                            
15076 tom       20   0    7308    212    108 R  99.7  0.0   1:47.45 stress      

最後のものはキューで待機しています。

     JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
      2368       Tom  test.sh      tom PD       0:00      1 (Resources)
      2365       Tom  test.sh      tom  R       5:03      1 Tom
      2366       Tom  test.sh      tom  R       5:03      1 Tom
      2367       Tom  test.sh      tom  R       5:03      1 Tom

だからこの場合に使用して srun -n 2 同じプロセスを2回起動します。私が使用した場合も同じことが起こります

#!/bin/sh
#SBATCH --ntasks=2
srun -n 1 --exclusive stress -c 1 &
srun -n 1 --exclusive stress -c 1 &
srun -n 1 --exclusive stress -c 1 &
wait

つまり、SLURMはこのバッチスクリプトに2つのタスクがあることを知っているので、2つのスクリプトを同時に実行することができます。 3人目は「順番を待つ」必要があります。

一方

#!/bin/sh
#SBATCH --ntasks=1
srun -n 1 --exclusive stress -c 2

あなたがあなたの質問に書いている行動を教えてください。

これが100%答えるかどうか確かではないが多分それは少し助ける。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.