blob: 96f17fdf661d84c0612b7887cdb6f88d1ff15fe6 [file] [log] [blame]
<!--#include virtual="header.txt"-->
<h1><a name="top">Sharing Consumable Resources</a></h1>
<h2 id="cpu_management">CPU Management
<a class="slurm_link" href="#cpu_management"></a>
</h2>
<P>
(Disclaimer: In this "CPU Management" section, the term "consumable resource"
does not include memory. The management of memory as a consumable resource is
discussed in its own section below.)
</P>
<P>
The per-partition <CODE>OverSubscribe</CODE> setting applies to the <U>entity
being selected for scheduling</U>:
<UL><LI><P>
When the <CODE>select/linear</CODE> plugin is enabled, the
per-partition <CODE>OverSubscribe</CODE> setting controls whether or not the
<B>nodes</B> are shared among jobs.
</P></LI><LI><P>
When the default <CODE>select/cons_tres</CODE> plugin is
enabled, the per-partition <CODE>OverSubscribe</CODE> setting controls
whether or not the <B>configured consumable resources</B> are shared among jobs.
When a consumable resource such as a core,
socket, or CPU is shared, it means that more than one job can be assigned to it.
</P></LI></UL>
</P>
<P>
The following table describes this new functionality in more detail:
</P>
<TABLE CELLPADDING=3 CELLSPACING=1 BORDER=1>
<TR><TH>Selection Setting</TH>
<TH>Per-partition <CODE>OverSubscribe</CODE> Setting</TH>
<TH>Resulting Behavior</TH>
</TR><TR>
<TD ROWSPAN=3>SelectType=<B>select/linear</B></TD>
<TD>OverSubscribe=NO</TD>
<TD>Whole nodes are allocated to jobs. No node will run more than one job
per partition/queue.</TD>
</TR><TR>
<TD>OverSubscribe=YES</TD>
<TD>By default same as OverSubscribe=NO. Nodes allocated to a job may be shared with
other jobs if each job allows sharing via the <CODE>srun --oversubscribe</CODE>
option.</TD>
</TR><TR>
<TD>OverSubscribe=FORCE</TD>
<TD>Each whole node can be allocated to multiple jobs up to the count specified
per partition/queue (default 4 jobs per node)</TD>
</TR><TR>
<TD ROWSPAN=3>SelectType=<B>select/cons_tres</B><BR>
Plus one of the following:<BR>
SelectTypeParameters=<B>CR_Core</B><BR>
SelectTypeParameters=<B>CR_Core_Memory</B></TD>
<TD>OverSubscribe=NO</TD>
<TD>Cores are allocated to jobs. No core will run more than one job
per partition/queue.</TD>
</TR><TR>
<TD>OverSubscribe=YES</TD>
<TD>By default same as OverSubscribe=NO. Cores allocated to a job may be shared with
other jobs if each job allows sharing via the <CODE>srun --oversubscribe</CODE>
option.</TD>
</TR><TR>
<TD>OverSubscribe=FORCE</TD>
<TD>Each core can be allocated to multiple jobs up to the count specified
per partition/queue (default 4 jobs per core).</TD>
</TR><TR>
<TD ROWSPAN=3>SelectType=<B>select/cons_tres</B><BR>
Plus one of the following:<BR>
SelectTypeParameters=<B>CR_CPU</B><BR>
SelectTypeParameters=<B>CR_CPU_Memory</B></TD>
<TD>OverSubscribe=NO</TD>
<TD>CPUs are allocated to jobs. No CPU will run more than one job
per partition/queue.</TD>
</TR><TR>
<TD>OverSubscribe=YES</TD>
<TD>By default same as OverSubscribe=NO. CPUs allocated to a job may be shared with
other jobs if each job allows sharing via the <CODE>srun --oversubscribe</CODE>
option.</TD>
</TR><TR>
<TD>OverSubscribe=FORCE</TD>
<TD>Each CPU can be allocated to multiple jobs up to the count specified
per partition/queue (default 4 jobs per CPU).</TD>
</TR><TR>
<TD ROWSPAN=3>SelectType=<B>select/cons_tres</B><BR>
Plus one of the following:<BR>
SelectTypeParameters=<B>CR_Socket</B><BR>
SelectTypeParameters=<B>CR_Socket_Memory</B></TD>
<TD>OverSubscribe=NO</TD>
<TD>Sockets are allocated to jobs. No Socket will run more than one job
per partition/queue.</TD>
</TR><TR>
<TD>OverSubscribe=YES</TD>
<TD>By default same as OverSubscribe=NO. Sockets allocated to a job may be shared with
other jobs if each job allows sharing via the <CODE>srun --oversubscribe</CODE>
option.</TD>
</TR><TR>
<TD>OverSubscribe=FORCE</TD>
<TD>Each socket can be allocated to multiple jobs up to the count specified
per partition/queue (default 4 jobs per socket).</TD>
</TR>
</TABLE>
<P>When <CODE>OverSubscribe=FORCE</CODE> is configured, the consumable resources are
scheduled for jobs using a <B>least-loaded</B> algorithm. Thus, idle
CPUs|cores|sockets will be allocated to a job before busy ones, and
CPUs|cores|sockets running one job will be allocated to a job before ones
running two or more jobs. This is the same approach that the
<CODE>select/linear</CODE> plugin uses when allocating "shared" nodes.
</P>
<P>
Note that the <B>granularity</B> of the "least-loaded" algorithm is what
distinguishes the consumable resource and linear plugins
when <CODE>OverSubscribe=FORCE</CODE> is configured. With the
<CODE>select/cons_tres</CODE> plugin enabled,
the CPUs of a node are not
overcommitted until <B>all</B> of the rest of the CPUs are overcommitted on the
other nodes. Thus if one job allocates half of the CPUs on a node and then a
second job is submitted that requires more than half of the CPUs, the
consumable resource plugin will attempt to place this new job on other
busy nodes that have more than half of the CPUs available for use. The
<CODE>select/linear</CODE> plugin simply counts jobs on nodes, and does not
track the CPU usage on each node.
</P><P>
The sharing functionality in the
<CODE>select/cons_tres</CODE> plugin also supports the
new <CODE>OverSubscribe=FORCE:&lt;num&gt;</CODE> syntax. If <CODE>OverSubscribe=FORCE:3</CODE>
is configured with a consumable resource plugin and <CODE>CR_Core</CODE> or
<CODE>CR_Core_Memory</CODE>, then the plugin will
run up to 3 jobs on each <U>core</U> of each node in the partition. If
<CODE>CR_Socket</CODE> or <CODE>CR_Socket_Memory</CODE> is configured, then the
plugin will run up to 3 jobs on each <U>socket</U>
of each node in the partition.
</P>
<h2 id="multiple_partitions">Nodes in Multiple Partitions
<a class="slurm_link" href="#multiple_partitions"></a>
</h2>
<P>
Slurm has supported configuring nodes in more than one partition since version
0.7.0. The following table describes how nodes configured in two partitions with
different <CODE>OverSubscribe</CODE> settings will be allocated to jobs. Note that
"shared" jobs are jobs that are submitted to partitions configured with
<CODE>OverSubscribe=FORCE</CODE> or with <CODE>OverSubscribe=YES</CODE> and the job requested
sharing with the <CODE>srun --oversubscribe</CODE> option. Conversely, "non-shared"
jobs are jobs that are submitted to partitions configured with
<CODE>OverSubscribe=NO</CODE> or <CODE>OverSubscribe=YES</CODE> and the job did <U>not</U>
request shareable resources.
</P>
<TABLE CELLPADDING=3 CELLSPACING=1 BORDER=1>
<TR><TH>&nbsp;</TH><TH>First job "shareable"</TH><TH>First job not
"shareable"</TH></TR>
<TR><TH>Second job "shareable"</TH><TD>Both jobs can run on the same nodes and
may share resources</TD><TD>Jobs do not run on the same nodes</TD></TR>
<TR><TH>Second job not "shareable"</TH><TD>Jobs do not run on the same nodes</TD>
<TD>Jobs can run on the same nodes but will not share resources</TD></TR>
</TABLE>
<P>
The next table contains several scenarios with the <CODE>select/cons_tres</CODE>
plugin enabled to further
clarify how a node is used when it is configured in more than one partition and
the partitions have different "OverSubscribe" policies.
</P>
<TABLE CELLPADDING=3 CELLSPACING=1 BORDER=1>
<TR><TH>Slurm configuration</TH>
<TH>Resulting Behavior</TH>
</TR><TR>
<TD>Two <CODE>OverSubscribe=NO</CODE> partitions assigned the same set of nodes</TD>
<TD>Jobs from either partition will be assigned to all available consumable
resources. No consumable resource will be shared. One node could have 2 jobs
running on it, and each job could be from a different partition.</TD>
</TR><TR>
<TD>Two partitions assigned the same set of nodes: one partition is
<CODE>OverSubscribe=FORCE</CODE>, and the other is <CODE>OverSubscribe=NO</CODE></TD>
<TD>A node will only run jobs from one partition at a time. If a node is
running jobs from the <CODE>OverSubscribe=NO</CODE> partition, then none of its
consumable resources will be shared. If a node is running jobs from the
<CODE>OverSubscribe=FORCE</CODE> partition, then its consumable resources can be
shared.</TD>
</TR><TR>
<TD>Two <CODE>OverSubscribe=FORCE</CODE> partitions assigned the same set of nodes</TD>
<TD>Jobs from either partition will be assigned consumable resources. All
consumable resources can be shared. One node could have 2 jobs running on it,
and each job could be from a different partition.</TD>
</TR><TR>
<TD>Two partitions assigned the same set of nodes: one partition is
<CODE>OverSubscribe=FORCE:3</CODE>, and the other is <CODE>OverSubscribe=FORCE:5</CODE></TD>
<TD>Generally the same behavior as above. However no consumable resource will
ever run more than 3 jobs from the first partition, and no consumable resource
will ever run more than 5 jobs from the second partition. A consumable resource
could have up to 8 jobs running on it at one time.</TD>
</TR>
</TABLE>
<P>
Note that the "mixed shared setting" configuration (row #2 above) introduces the
possibility of <B>starvation</B> between jobs in each partition. If a set of
nodes are running jobs from the <CODE>OverSubscribe=NO</CODE> partition, then these
nodes will continue to only be available to jobs from that partition, even if
jobs submitted to the <CODE>OverSubscribe=FORCE</CODE> partition have a higher
priority. This works in reverse also, and in fact it's easier for jobs from the
<CODE>OverSubscribe=FORCE</CODE> partition to hold onto the nodes longer because the
consumable resource "sharing" provides more resource availability for new jobs
to begin running "on top of" the existing jobs. This happens with the
<CODE>select/linear</CODE> plugin also, so it's not specific to the
<CODE>select/cons_tres</CODE> plugin.
</P>
<h2 id="memory_management">Memory Management
<a class="slurm_link" href="#memory_management"></a>
</h2>
<P>
The management of memory as a consumable resource remains unchanged and
can be used to prevent oversubscription of memory, which would result in
having memory pages swapped out and severely degraded performance.
</P>
<TABLE CELLPADDING=3 CELLSPACING=1 BORDER=1>
<TR><TH>Selection Setting</TH>
<TH>Resulting Behavior</TH>
</TR><TR>
<TD>SelectType=<B>select/linear</B></TD>
<TD>Memory allocation is not tracked. Jobs are allocated to nodes without
considering if there is enough free memory. Swapping could occur!</TD>
</TR><TR>
<TD>SelectType=<B>select/linear</B> plus<BR>
SelectTypeParameters=<B>CR_Memory</B></TD>
<TD>Memory allocation is tracked. Nodes that do not have enough available
memory to meet the jobs memory requirement will not be allocated to the job.
</TD>
</TR><TR>
<TD>SelectType=<B>select/cons_tres</B><BR>
Plus one of the following:<BR>
SelectTypeParameters=<B>CR_Core</B><BR>
SelectTypeParameters=<B>CR_CPU</B><BR>
SelectTypeParameters=<B>CR_Socket</B></TD>
<TD>Memory allocation is not tracked. Jobs are allocated to consumable resources
without considering if there is enough free memory. Swapping could occur!</TD>
</TR><TR>
<TD>SelectType=<B>select/cons_tres</B><BR>
Plus one of the following:<BR>
SelectTypeParameters=<B>CR_Core_Memory</B><BR>
SelectTypeParameters=<B>CR_CPU_Memory</B><BR>
SelectTypeParameters=<B>CR_Socket_Memory</B></TD>
<TD>Memory allocation for all jobs are tracked. Nodes that do not have enough
available memory to meet the jobs memory requirement will not be allocated to
the job.</TD>
</TR>
</TABLE>
<P>Users can specify their job's memory requirements one of two ways. The
<CODE>srun --mem=&lt;num&gt;</CODE> option can be used to specify the jobs
memory requirement on a per allocated node basis. This option is recommended
for use with the <CODE>select/linear</CODE> plugin, which allocates
whole nodes to jobs. The
<CODE>srun --mem-per-cpu=&lt;num&gt;</CODE> option can be used to specify the
jobs memory requirement on a per allocated CPU basis. This is recommended
for use with the <CODE>select/cons_tres</CODE>
plugin, which can allocate individual CPUs to jobs.</P>
<P>Default and maximum values for memory on a per node or per CPU basis can
be configured by the system administrator using the following
<CODE>slurm.conf</CODE> options: <CODE>DefMemPerCPU</CODE>,
<CODE>DefMemPerNode</CODE>, <CODE>MaxMemPerCPU</CODE> and
<CODE>MaxMemPerNode</CODE>.
Users can use the <CODE>--mem</CODE> or <CODE>--mem-per-cpu</CODE> option
at job submission time to override the default value, but they cannot exceed
the maximum value.
</P><P>
Enforcement of a jobs memory allocation is performed by setting the "maximum
data segment size" and the "maximum virtual memory size" system limits to the
appropriate values before launching the tasks. Enforcement is also managed by
the accounting plugin, which periodically gathers data about running jobs. Set
<CODE>JobAcctGather</CODE> and <CODE>JobAcctFrequency</CODE> to
values suitable for your system.</P>
<P>
<B>NOTE</B>: The <CODE>--oversubscribe</CODE> and <CODE>--exclusive</CODE>
options are mutually exclusive when used at job submission. If both options are
set when submitting a job, the job submission command used will fatal.
</P>
<p style="text-align:center;">Last modified 09 July 2025</p>
<!--#include virtual="footer.txt"-->