blob: 21356a68bb3eca3c22bb03c575960242b1ca1186 [file] [log] [blame] [edit]
<!--#include virtual="header.txt"-->
<h1><a name="top">Select Plugin Design Guide</a></h1>
<h2>Overview</h2>
<p>The select plugin is responsible for selecting compute resources to be
allocated to a job, plus allocating and deallocating those resources.
The select plugin is aware of the systems topology, based upon data structures
established by the topology plugn. It can also over-subscribe resources to
support gang scheduling (time slicing of parallel jobs), if so configured.
The select plugin is also capable of communicating with an external entity
to perform these actions (the select/bluegene plugin used on an IBM BlueGene
and the select/cray plugin used with Cray ALPS/BASIL software are two
examples). Other architectures would rely upon either the select/linear or
select/cons_res plugin. The select/linear plugin allocates whole nodes to jobs
and is the simplest implementation. The select/cons_res plugin (<i>cons_res</i>
is an abbreviation for <i>consumable resources</i>) can allocate individual
sockets, cores, threads, or CPUs within a node. The select/cons_res plugin
is slightly slower than select/linear, but contains far more complex logic.</p>
<h2>Mode of Operation</h2>
<p>The select/linear and select/cons_res plugins have similar modes of
operation. The obvious difference is that data structures in select/linear
are node-centric, while those in select/cons_res contain information at a
finer resolution (sockets, cores, threads, or CPUs depending upon the
SelectTypeParameters configuration parameter). The description below is
generic and applies to both plugin implementations. Note that both plugins
are able to manage memory allocations. Both plugins are also able to manage
generic resource (GRES) allocations, making use of the GRES plugins.</p>
<p>Per node data structures include memory (configured and allocated),
GRES (configured and allocated, in a List data structure), plus a flag
indicating if the node has been allocated using an exclusive option (preventing
other jobs from being allocated resources on that same node). The other key
data structure is used to enforce the per-partition <i>Shared</i> configuration
parameter and tracks how many jobs have been allocated each resource in each
partition. This data structure is different between the plugins based upon
the resolution of the resource allocation (e.g. nodes or CPUs).</p>
<p>Most of the logic in the select plugin is dedicated to identifying resources
to be allocated to a new job. Input to that function includes: a pointer to the
new job, a bitmap identifying nodes which could be used, node counts (minimum,
maximum, and desired), a count of how many jobs of that partition the job can
share resources with, and a list of jobs which can be preempted to initiate the
new job. The first phase is to determine of all usable nodes, which nodes
would best satisfy the resource requirement. This consistes of a best-fit
algorithm that groups nodes based upon network topology (if the topology/tree
plugin is configured) or based upon consecutive nodes (by default). Once the
best nodes are identified, resources are accumulated for the new job until its
resource requirements are satisfied.</p>
<p>If the job can not be started with currently available resources, the plugin
will attempt to identify jobs which can be preempted in order to initiate the
new job. A copy of the current system state will be created including details
about all resources and active jobs. Preemptable jobs will then be removed
from this simulated system state until the new job can be initiated. When
sufficient resources are available for the new job, the jobs actually needing
to be preempted for its initiation will be preempted (this may be a subset of
the jobs whose preemption is simulated).</p>
<p>Other functions exist to support suspending jobs, resuming jobs, terminating
jobs, expanding/shrinking job allocations, un/packing job state information,
un/packing node state information, etc. The operation of those functions is
relatively straightforward and not detailed here.</p>
<h2>Operation on IBM BlueGene Systems</h2>
<p>On IBM BlueGene systems, SLURM's <i>slurmd</i> daemon executes on the
front-end nodes rather than the compute nodes and IBM provides a Bridge API
to manage compute nodes and jobs. The IBM BlueGene systems also have very
specific topology rules for what resources can be allocated to a job. SLURM's
interface to IBM's Bridge API and the topology rules are found within the
select/bluegene plugin and very little BlueGene-specific logic in SLURM is
found outside of that plugin. Note that the select/bluegene plugin is used for
BlueGene/L, BlueGene/P and BlueGene/Q systems with select portions of the
code conditionally compiled depending upon the system type.</p>
<h2>Operation on Cray Systems</h2>
<p>The operation of the select/cray plugin is unique in that it does not
directly select resources for a job, but uses the select/linear plugin for
that purpose. It also interfaces with Cray's ALPS software using the BASIL
interface or directly using the database. On Cray systems, SLURM's <i>slurmd</i>
daemon executes on the front-end nodes rather than the compute nodes and
ALPS is the mechanism available for SLURM to manage compute nodes and their
jobs.</p>
<pre>
-------------------
| select/cray |
-------------------
| |
----------------- --------------
| select/linear | | BASIL/ALPS |
----------------- --------------
</pre>
<p class="footer"><a href="#top">top</a></p>
<p style="text-align:center;">Last modified 31 May 2011</p>
<!--#include virtual="footer.txt"-->