blob: f9d7e5546b28119c53a45f6066acd734d7f90992 [file] [log] [blame]
<!--#include virtual="header.txt"-->
<h1>Frequently Asked Questions</h1>
<h2>For Management</h2>
<ul>
<li><a href="#free">Is Slurm really free?</a></li>
<li><a href="#foss">Why should I use Slurm or other free software?</a></li>
<li><a href="#support">Why should I pay for free software?</a></li>
<li><a href="#acronym">What does "Slurm" stand for?</a></li>
</ul>
<h2>For Researchers</h2>
<ul>
<li><a href="#cite">How should I cite work involving Slurm?</a></li>
</ul>
<h2>For Users</h2>
<h3>Designing Jobs</h3>
<ul>
<li><a href="#steps">How can I run multiple jobs from within a single
script?</a></li>
<li><a href="#multi_batch">How can I run a job within an existing job
allocation?</a></li>
<li><a href="#cpu_count">Slurm documentation refers to CPUs, cores and threads.
What exactly is considered a CPU?</a></li>
<li><a href="#arbitrary">How do I run specific tasks on certain nodes
in my allocation?</a></li>
<li><a href="#batch_out">How can I get the task ID in the output or error file
name for a batch job?</a></li>
<li><a href="#user_env">How does Slurm establish the environment for my
job?</a></li>
<li><a href="#parallel_make">Can the <i>make</i> command utilize the resources
allocated to a Slurm job?</a></li>
<li><a href="#ansys">How can I run an Ansys program with Slurm?</a></li>
</ul>
<h3>Submitting Jobs</h3>
<ul>
<li><a href="#opts">Why are my srun options ignored?</a></li>
<li><a href="#sharing">Why does the srun --overcommit option not permit
multiple jobs to run on nodes?</a></li>
<li><a href="#unbuffered_cr">Why is the srun --u/--unbuffered option adding
a carriage return to my output?</a></li>
<li><a href="#sbatch_srun">What is the difference between the sbatch
and srun commands?</a></li>
<li><a href="#terminal">Can tasks be launched with a remote (pseudo)
terminal?</a></li>
<li><a href="#prompt">How can I get shell prompts in interactive mode?</a></li>
<li><a href="#x11">Can Slurm export an X11 display on an allocated compute node?</a></li>
</ul>
<h3>Scheduling</h3>
<ul>
<li><a href="#pending">Why is my job not running?</a></li>
<li><a href="#backfill">Why is the Slurm backfill scheduler not starting my
job?</a></li>
</ul>
<h3>Killed Jobs</h3>
<ul>
<li><a href="#purge">Why is my job killed prematurely?</a></li>
<li><a href="#inactive">Why is my batch job that launches no job steps being
killed?</a></li>
<li><a href="#force">What does &quot;srun: Force Terminated job&quot;
indicate?</a></li>
<li><a href="#early_exit">What does this mean: &quot;srun: First task exited
30s ago&quot; followed by &quot;srun Job Failed&quot;?</a></li>
</ul>
<h3>Managing Jobs</h3>
<ul>
<li><a href="#hold">How can I temporarily prevent a job from running
(e.g. place it into a <i>hold</i> state)?</a></li>
<li><a href="#job_size">Can I change my job's size after it has started
running?</a></li>
<li><a href="#estimated_start_time">Why does squeue (and "scontrol show
jobid") sometimes not display a job's estimated start time?</a></li>
<li><a href="#squeue_color">Can squeue output be color coded?</a></li>
<li><a href="#comp">Why is my job/node in a COMPLETING state?</a></li>
<li><a href="#req">How can a job in a complete or failed state be requeued?</a></li>
<li><a href="#sview_colors">Why is sview not coloring/highlighting nodes
properly?</a></li>
<li><a href="#mpi_symbols">Why is my MPICH2 or MVAPICH2 job not running with
Slurm? Why does the DAKOTA program not run with Slurm?</a></li>
</ul>
<h3>Resource Limits</h3>
<ul>
<li><a href="#rlimit">Why are my resource limits not propagated?</a></li>
<li><a href="#mem_limit">Why are jobs not getting the appropriate
memory limit?</a></li>
<li><a href="#memlock">Why is my MPI job failing due to the locked memory
(memlock) limit being too low?</a></li>
</ul>
<h2>For Administrators</h2>
<h3>Test Environments</h3>
<ul>
<li><a href="#multi_slurm">Can multiple Slurm systems be run in
parallel for testing purposes?</a></li>
<li><a href="#multi_slurmd">Can Slurm emulate a larger cluster?</a></li>
<li><a href="#extra_procs">Can Slurm emulate nodes with more
resources than physically exist on the node?</a></li>
</ul>
<h3>Build and Install</h3>
<ul>
<li><a href="#rpm">Why aren't pam_slurm.so, auth_none.so, or other components in a
Slurm RPM?</a></li>
<li><a href="#debug">How can I build Slurm with debugging symbols?</a></li>
<li><a href="#git_patch">How can a patch file be generated from a Slurm commit
in GitHub?</a></li>
<li><a href="#apply_patch">How can I apply a patch to my Slurm source?</a></li>
<li><a href="#epel">Why am I being offered an automatic update for Slurm?</a></li>
</ul>
<h3>Cluster Management</h3>
<ul>
<li><a href="#controller"> How should I relocate the primary or backup
controller?</a></li>
<li><a href="#clock">Do I need to maintain synchronized clocks
on the cluster?</a></li>
<li><a href="#stop_sched">How can I stop Slurm from scheduling jobs?</a></li>
<li><a href="#maint_time">How can I dry up the workload for a maintenance
period?</a></li>
<li><a href="#upgrade">What should I be aware of when upgrading Slurm?</a></li>
<li><a href="#db_upgrade">Is there anything exceptional to be aware of when
upgrading my database server?</a></li>
<li><a href="#cluster_acct">When adding a new cluster, how can the Slurm cluster
configuration be copied from an existing cluster to the new cluster?</a></li>
<li><a href="#state_info">How could some jobs submitted immediately before the
slurmctld daemon crashed be lost?</a></li>
<li><a href="#limit_propagation">Is resource limit propagation
useful on a homogeneous cluster?</a></li>
<li><a href="#enforce_limits">Why are the resource limits set in the database
not being enforced?</a></li>
<li><a href="#licenses">Can Slurm be configured to manage licenses?</a></li>
<li><a href="#torque">How easy is it to switch from PBS or Torque to Slurm?</a></li>
<li><a href="#mpi_perf">What might account for MPI performance being below the
expected level?</a></li>
<li><a href="#delete_partition">How do I safely remove partitions?</a></li>
<li><a href="#routing_queue">How can a routing queue be configured?</a></li>
<li><a href="#none_plugins">What happened to the "none" plugins?</a></li>
</ul>
<h3>Accounting Database</h3>
<ul>
<li><a href="#slurmdbd">Why should I use the slurmdbd instead of the
regular database plugins?</a></li>
<li><a href="#dbd_rebuild">How can I rebuild the database hierarchy?</a></li>
<li><a href="#ha_db">How critical is configuring high availability for my
database?</a></li>
<li><a href="#sql">How can I use double quotes in MySQL queries?</a></li>
</ul>
<h3>Compute Nodes (slurmd)</h3>
<ul>
<li><a href="#return_to_service">Why is a node shown in state DOWN when the node
has registered for service?</a></li>
<li><a href="#down_node">What happens when a node crashes?</a></li>
<li><a href="#multi_job">How can I control the execution of multiple
jobs per node?</a></li>
<li><a href="#time">Why are jobs allocated nodes and then unable to initiate
programs on some nodes?</a></li>
<li><a href="#ping"> Why does <i>slurmctld</i> log that some nodes
are not responding even if they are not in any partition?</a></li>
<li><a href="#state_preserve">How can I easily preserve drained node
information between major Slurm updates?</a></li>
<li><a href="#health_check_example">Does anyone have an example node health check
script for Slurm?</a></li>
<li><a href="#health_check">Why doesn't the <i>HealthCheckProgram</i>
execute on DOWN nodes?</a></li>
<li><a href="#slurmd_oom">How can I prevent the <i>slurmd</i> and
<i>slurmstepd</i> daemons from being killed when a node's memory
is exhausted?</a></li>
<li><a href="#ubuntu">I see the host of my calling node as 127.0.1.1
instead of the correct IP address. Why is that?</a></li>
<li><a href="#add_nodes">How should I add nodes to Slurm?</a></li>
<li><a href="#rem_nodes">How should I remove nodes from Slurm?</a></li>
<li><a href="#reboot">Why is a compute node down with the reason set to
"Node unexpectedly rebooted"?</a></li>
<li><a href="#cgroupv2">How do I convert my nodes to Control Group (cgroup)
v2?</a></li>
<li><a href="#amazon_ec2">Can Slurm be used to run jobs on Amazon's EC2?</a></li>
</ul>
<h3>User Management</h3>
<ul>
<li><a href="#pam">How can PAM be used to control a user's limits on or
access to compute nodes?</a></li>
<li><a href="#pam_exclude">How can I exclude some users from pam_slurm?</a></li>
<li><a href="#user_account">Can a user's account be changed in the database?</a></li>
<li><a href="#changed_uid">I had to change a user's UID and now they cannot submit
jobs. How do I get the new UID to take effect?</a></li>
<li><a href="#sssd">How can I get SSSD to work with Slurm?</a></li>
</ul>
<h3>Jobs</h3>
<ul>
<li><a href="#suspend">How is job suspend/resume useful?</a></li>
<li><a href="#squeue_script">How can I suspend, resume, hold or release all
of the jobs belonging to a specific user, partition, etc?</a></li>
<li><a href="#restore_priority">After manually setting a job priority value,
how can its priority value be returned to being managed by the
priority/multifactor plugin?</a></li>
<li><a href="#scontrol_multi_jobs">Can I update multiple jobs with a single
<i>scontrol</i> command?</a></li>
<li><a href="#task_prolog">How could I automatically print a job's
Slurm job ID to its standard output?</a></li>
<li><a href="#write_to_job_stdout">Is it possible to write to user stdout?</a></li>
<li><a href="#orphan_procs">Why are user processes and <i>srun</i>
running even though the job is supposed to be completed?</a></li>
<li><a href="#reqspec">How can a job which has exited with a specific exit code
be requeued?</a></li>
<li><a href="#cpu_freq">Why is Slurm unable to set the CPU frequency for jobs?</a></li>
<li><a href="#salloc_default_command">Can the salloc command be configured to
launch a shell on a node in the job's allocation?</a></li>
<li><a href="#tmpfs_jobcontainer">How can I set up a private /tmp and /dev/shm for
jobs on my machine?</a></li>
<li><a href="#sysv_memory">How do I configure Slurm to work with System V IPC
enabled applications?</a></li>
</ul>
<h3>General Troubleshooting</h3>
<ul>
<li><a href="#core_dump">If a Slurm daemon core dumps, where can I find the
core file?</a></li>
<li><a href="#backtrace">How can I get a backtrace from a core file?</a></li>
</ul>
<h3>Error Messages</h3>
<ul>
<li><a href="#inc_plugin">&quot;Cannot resolve X plugin operations&quot; on
daemon startup</a></li>
<li><a href="#credential_replayed">&quot;Credential replayed&quot; in
<i>SlurmdLogFile</i></a></li>
<li><a href="#cred_invalid">&quot;Invalid job credential&quot;</a></li>
<li><a href="#cred_replay">&quot;Task launch failed on node ... Job credential
replayed&quot;</a></li>
<li><a href="#file_limit">&quot;Unable to accept new connection: Too many open
files&quot;</a></li>
<li><a href="#slurmd_log"><i>SlurmdDebug</i> fails to log job step information
at the appropriate level</a></li>
<li><a href="#batch_lost">&quot;Batch JobId=# missing from batch node &lt;node&gt;
(not found BatchStartTime after startup)&quot;</a></li>
<li><a href="#opencl_pmix">Multi-Instance GPU not working with Slurm and
PMIx; GPUs are &quot;In use by another client&quot;</a></li>
<li><a href="#accept_again">&quot;srun: error: Unable to accept connection:
Resources temporarily unavailable&quot;</a></li>
<li><a href="#large_time">&quot;Warning: Note very large processing time&quot;
in <i>SlurmctldLogFile</i></a></li>
<li><a href="#mysql_duplicate">&quot;Duplicate entry&quot; causes slurmdbd to
fail</a></li>
<li><a href="#json_serializer">&quot;Unable to find plugin: serializer/json&quot;</a></li>
</ul>
<h3>Third Party Integrations</h3>
<ul>
<li><a href="#globus">Can Slurm be used with Globus?</a></li>
<li><a href="#totalview">How can TotalView be configured to operate with
Slurm?</a></li>
</ul>
<h2>For Management</h2>
<p><a id="free"><b>Is Slurm really free?</b></a><br>
Yes, Slurm is free and open source:
<ul>
<li>Slurm is free as defined by the
<a href="https://www.gnu.org/philosophy/free-sw.en.html">Free Software
Foundation</a></li>
<li>Slurm’s <a href="https://github.com/SchedMD/slurm">source code</a> and
<a href="https://slurm.schedmd.com/documentation.html">documentation</a> are
publicly available under the GNU GPL v2</li>
<li>Slurm can be <a href="https://www.schedmd.com/download-slurm/">
downloaded</a>, used, modified, and redistributed at no monetary cost</li>
</ul></p>
<p><a id="foss"><b>Why should I use Slurm or other free software?</b></a><br>
Free software, as with proprietary software, varies widely in quality, but the
mechanism itself has proven to be capable of producing high-quality software
that is trusted by companies around the world. The Linux kernel is a prominent
example, which is often trusted on web servers, infrastructure servers,
supercomputers, and mobile devices.</p>
<p>Likewise, Slurm has become a trusted tool in the supercomputing world since
its initial release in 2002 and the founding of SchedMD in 2010 to continue
developing Slurm. Today, Slurm powers a majority of the
<a href="https://www.top500.org/">TOP500</a> supercomputers. Customers switching
from commercial workload managers to Slurm typically report higher scalability,
better performance and lower costs.</p>
<p><a id="support"><b>Why should I pay for free software?</b></a><br>
Free software does not mean that it is without cost. Software requires
significant time and expertise to write, test, distribute, and maintain. If the
software is large and complex, like Slurm or the Linux kernel, these costs can
become very substantial.</p>
<p>Slurm is often used for highly important tasks at major computing clusters
around the world. Due to the extensive features available and the complexity of
the code required to provide those features, many organizations prefer to have
experts available to provide tailored recommendations and troubleshooting
assistance. While Slurm has a global development community incorporating leading
edge technology, <a href="https://www.schedmd.com">SchedMD</a> personnel have
developed most of the code and can provide competitively priced commercial
support and on-site training.</p>
<p><a id="acronym"><b>What does "Slurm" stand for?</b></a><br>
Nothing.</p>
<p>Originally, "SLURM" (completely capitalized) was an acronym for
"Simple Linux Utility for Resource Management". In 2012 the preferred
capitalization was changed to Slurm, and the acronym was dropped &mdash; the
developers preferred to think of Slurm as "sophisticated" rather than "Simple"
by this point. And, as Slurm continued to expand it's scheduling capabilities,
the "Resource Management" label was also viewed as outdated.</p>
<h2>For Researchers</h2>
<p><a id="cite"><b>How should I cite work involving Slurm?</b></a><br>
We recommend citing the peer-reviewed paper from JSSPP 2023:
<a href="https://doi.org/10.1007/978-3-031-43943-8_1">
Architecture of the Slurm Workload Manager.</a></p>
<pre>Jette, M.A., Wickberg, T. (2023). Architecture of the Slurm Workload Manager.
In: Klusáček, D., Corbalán, J., Rodrigo, G.P. (eds) Job Scheduling Strategies
for Parallel Processing. JSSPP 2023. Lecture Notes in Computer Science,
vol 14283. Springer, Cham. https://doi.org/10.1007/978-3-031-43943-8_1
</pre>
<h2>For Users</h2>
<h3>Designing Jobs</h3>
<p><a id="steps"><b>How can I run multiple jobs from within a
single script?</b></a><br>
A Slurm job is just a resource allocation. You can execute many
job steps within that allocation, either in parallel or sequentially.
Some jobs actually launch thousands of job steps this way. The job
steps will be allocated nodes that are not already allocated to
other job steps. This essentially provides a second level of resource
management within the job for the job steps.</p>
<p><a id="multi_batch"><b>How can I run a job within an existing
job allocation?</b></a><br>
There is an srun option <i>--jobid</i> that can be used to specify
a job's ID.
For a batch job or within an existing resource allocation, the
environment variable <i>SLURM_JOB_ID</i> has already been defined,
so all job steps will run within that job allocation unless
otherwise specified.
The one exception to this is when submitting batch jobs.
When a batch job is submitted from within an existing batch job,
it is treated as a new job allocation request and will get a
new job ID unless explicitly set with the <i>--jobid</i> option.
If you specify that a batch job should use an existing allocation,
that job allocation will be released upon the termination of
that batch job.</p>
<p><a id="cpu_count"><b>Slurm documentation refers to CPUs, cores and threads.
What exactly is considered a CPU?</b></a><br>
If your nodes are configured with hyperthreading, then a CPU is equivalent
to a hyperthread.
Otherwise a CPU is equivalent to a core.
You can determine if your nodes have more than one thread per core
using the command "scontrol show node" and looking at the values of
"ThreadsPerCore".</p>
<p>Note that even on systems with hyperthreading enabled, the resources will
generally be allocated to jobs at the level of a core (see NOTE below).
Two different jobs will not share a core except through the use of a partition
OverSubscribe configuration parameter.
For example, a job requesting resources for three tasks on a node with
ThreadsPerCore=2 will be allocated two full cores.
Note that Slurm commands contain a multitude of options to control
resource allocation with respect to base boards, sockets, cores and threads.</p>
<p>(<b>NOTE</b>: An exception to this would be if the system administrator
configured SelectTypeParameters=CR_CPU and each node's CPU count without its
socket/core/thread specification. In that case, each thread would be
independently scheduled as a CPU. This is not a typical configuration.)</p>
<p><a id="arbitrary"><b>How do I run specific tasks on certain nodes
in my allocation?</b></a><br>
One of the distribution methods for srun '<b>-m</b>
or <b>--distribution</b>' is 'arbitrary'. This means you can tell Slurm to
layout your tasks in any fashion you want. For instance if I had an
allocation of 2 nodes and wanted to run 4 tasks on the first node and
1 task on the second and my nodes allocated from SLURM_JOB_NODELIST
where tux[0-1] my srun line would look like this:<br><br>
<i>srun -n5 -m arbitrary -w tux[0,0,0,0,1] hostname</i><br><br>
If I wanted something similar but wanted the third task to be on tux 1
I could run this:<br><br>
<i>srun -n5 -m arbitrary -w tux[0,0,1,0,0] hostname</i><br><br>
Here is a simple Perl script named arbitrary.pl that can be ran to easily lay
out tasks on nodes as they are in SLURM_JOB_NODELIST.</p>
<pre>
#!/usr/bin/perl
my @tasks = split(',', $ARGV[0]);
my @nodes = `scontrol show hostnames $SLURM_JOB_NODELIST`;
my $node_cnt = $#nodes + 1;
my $task_cnt = $#tasks + 1;
if ($node_cnt < $task_cnt) {
print STDERR "ERROR: You only have $node_cnt nodes, but requested layout on $task_cnt nodes.\n";
$task_cnt = $node_cnt;
}
my $cnt = 0;
my $layout;
foreach my $task (@tasks) {
my $node = $nodes[$cnt];
last if !$node;
chomp($node);
for(my $i=0; $i < $task; $i++) {
$layout .= "," if $layout;
$layout .= "$node";
}
$cnt++;
}
print $layout;
</pre>
<p>We can now use this script in our srun line in this fashion.<br><br>
<i>srun -m arbitrary -n5 -w `arbitrary.pl 4,1` -l hostname</i><br><br>
This will layout 4 tasks on the first node in the allocation and 1
task on the second node.</p>
<p><a id="batch_out"><b>How can I get the task ID in the output
or error file name for a batch job?</b></a><br>
If you want separate output by task, you will need to build a script
containing this specification. For example:</p>
<pre>
$ cat test
#!/bin/sh
echo begin_test
srun -o out_%j_%t hostname
$ sbatch -n7 -o out_%j test
sbatch: Submitted batch job 65541
$ ls -l out*
-rw-rw-r-- 1 jette jette 11 Jun 15 09:15 out_65541
-rw-rw-r-- 1 jette jette 6 Jun 15 09:15 out_65541_0
-rw-rw-r-- 1 jette jette 6 Jun 15 09:15 out_65541_1
-rw-rw-r-- 1 jette jette 6 Jun 15 09:15 out_65541_2
-rw-rw-r-- 1 jette jette 6 Jun 15 09:15 out_65541_3
-rw-rw-r-- 1 jette jette 6 Jun 15 09:15 out_65541_4
-rw-rw-r-- 1 jette jette 6 Jun 15 09:15 out_65541_5
-rw-rw-r-- 1 jette jette 6 Jun 15 09:15 out_65541_6
$ cat out_65541
begin_test
$ cat out_65541_2
tdev2
</pre>
<p><a id="user_env"><b>How does Slurm establish the environment
for my job?</b></a><br>
Slurm processes are not run under a shell, but directly exec'ed
by the <i>slurmd</i> daemon (assuming <i>srun</i> is used to launch
the processes).
The environment variables in effect at the time the <i>srun</i> command
is executed are propagated to the spawned processes.
The <i>~/.profile</i> and <i>~/.bashrc</i> scripts are not executed
as part of the process launch. You can also look at the <i>--export</i> option of
srun and sbatch. See man pages for details.</p>
<p><a id="parallel_make"><b>Can the <i>make</i> command
utilize the resources allocated to a Slurm job?</b></a><br>
Yes. There is a patch available for GNU make version 3.81
available as part of the Slurm distribution in the file
<i>contribs/make-3.81.slurm.patch</i>. For GNU make version 4.0 you
can use the patch in the file <i>contribs/make-4.0.slurm.patch</i>.
This patch will use Slurm to launch tasks across a job's current resource
allocation. Depending upon the size of modules to be compiled, this may
or may not improve performance. If most modules are thousands of lines
long, the use of additional resources should more than compensate for the
overhead of Slurm's task launch. Use with make's <i>-j</i> option within an
existing Slurm allocation. Outside of a Slurm allocation, make's behavior
will be unchanged.</p>
<p><a id="ansys"><b>How can I run an Ansys program with Slurm?</b></a><br>
If you are talking about an interactive run of the Ansys app, then you can use
this simple script (it is for Ansys Fluent):</p>
<pre>
$ cat ./fluent-srun.sh
#!/usr/bin/env bash
HOSTSFILE=.hostlist-job$SLURM_JOB_ID
if [ "$SLURM_PROCID" == "0" ]; then
srun hostname -f > $HOSTSFILE
fluent -t $SLURM_NTASKS -cnf=$HOSTSFILE -ssh 3d
rm -f $HOSTSFILE
fi
exit 0
</pre>
<p>To run an interactive session, use srun like this:</p>
<pre>
$ srun -n &lt;tasks&gt; ./fluent-srun.sh
</pre>
<h3>Submitting Jobs</h3>
<p><a id="opts"><b>Why are my srun options ignored?</b></a><br>
Everything after the command <span class="commandline">srun</span> is
examined to determine if it is a valid option for srun. The first
token that is not a valid option for srun is considered the command
to execute and everything after that is treated as an option to
the command. For example:</p>
<blockquote>
<p><span class="commandline">srun -N2 uptime -pdebug</span></p>
</blockquote>
<p>srun processes "-N2" as an option to itself. "uptime" is the command to
execute and "-pdebug" is treated as an option to the uptime command. Depending
on the command and options provided, you may get an invalid option message or
unexpected behavior if the options happen to be valid.</p>
<p>Options for srun should appear before the command to be run:</p>
<blockquote>
<p><span class="commandline">srun -N2 -pdebug uptime</span></p>
</blockquote>
<p><a id="sharing"><b>Why does the srun --overcommit option not permit multiple jobs
to run on nodes?</b></a><br>
The <b>--overcommit</b> option is a means of indicating that a job or job step is willing
to execute more than one task per processor in the job's allocation. For example,
consider a cluster of two processor nodes. The srun execute line may be something
of this sort</p>
<blockquote>
<p><span class="commandline">srun --ntasks=4 --nodes=1 a.out</span></p>
</blockquote>
<p>This will result in not one, but two nodes being allocated so that each of the four
tasks is given its own processor. Note that the srun <b>--nodes</b> option specifies
a minimum node count and optionally a maximum node count. A command line of</p>
<blockquote>
<p><span class="commandline">srun --ntasks=4 --nodes=1-1 a.out</span></p>
</blockquote>
<p>would result in the request being rejected. If the <b>--overcommit</b> option
is added to either command line, then only one node will be allocated for all
four tasks to use.</p>
<p>More than one job can execute simultaneously on the same compute resource
(e.g. CPU) through the use of srun's <b>--oversubscribe</b> option in
conjunction with the <b>OverSubscribe</b> parameter in Slurm's partition
configuration. See the man pages for srun and slurm.conf for more information.</p>
<p><a id="unbuffered_cr"><b>Why is the srun --u/--unbuffered option adding
a carriage character return to my output?</b></a><br>
The libc library used by many programs internally buffers output rather than
writing it immediately. This is done for performance reasons.
The only way to disable this internal buffering is to configure the program to
write to a pseudo terminal (PTY) rather than to a regular file.
This configuration causes <u>some</u> implementations of libc to prepend the
carriage return character before all line feed characters.
Removing the carriage return character would result in desired formatting
in some instances, while causing bad formatting in other cases.
In any case, Slurm is not adding the carriage return character, but displaying
the actual program's output.</p>
<p><a id="sbatch_srun"><b>What is the difference between the sbatch
and srun commands?</b></a><br>
The srun command has two different modes of operation. First, if not run within
an existing job (i.e. not within a Slurm job allocation created by salloc or
sbatch), then it will create a job allocation and spawn an application.
If run within an existing allocation, the srun command only spawns the
application.
For this question, we will only address the first mode of operation and compare
creating a job allocation using the sbatch and srun commands.</p>
<p>The srun command is designed for interactive use, with someone monitoring
the output.
The output of the application is seen as output of the srun command,
typically at the user's terminal.
The sbatch command is designed to submit a script for later execution and its
output is written to a file.
Command options used in the job allocation are almost identical.
The most noticeable difference in options is that the sbatch command supports
the concept of <a href="job_array.html">job arrays</a>, while srun does not.
Another significant difference is in fault tolerance.
Failures involving sbatch jobs typically result in the job being requeued
and executed again, while failures involving srun typically result in an
error message being generated with the expectation that the user will respond
in an appropriate fashion.</p>
<p><a id="terminal"><b>Can tasks be launched with a remote (pseudo)
terminal?</b></a><br>
The best method is to use <code>salloc</code> with
<b>use_interactive_step</b> set in the <b>LaunchParameters</b> option in
<i>slurm.conf</i>. See
<a href="#prompt">getting shell prompts in interactive mode</a>.</p>
<p><a id="prompt"><b>How can I get shell prompts in interactive
mode?</b></a><br>
Starting in 20.11, the recommended way to get an interactive shell prompt is
to configure <b>use_interactive_step</b> in <i>slurm.conf</i>:</p>
<pre>
LaunchParameters=use_interactive_step
</pre>
<p>This configures <code>salloc</code> to automatically launch an interactive
shell via <code>srun</code> on a node in the allocation whenever
<code>salloc</code> is called without a program to execute.</p>
<p>By default, <b>use_interactive_step</b> creates an <i>interactive step</i> on
a node in the allocation and runs the shell in that step. An interactive step
is to an interactive shell what a batch step is to a batch script - both have
access to all resources in the allocation on the node they are running on, but
do not "consume" them.</p>
<p>Note that beginning in 20.11, steps created by srun are now exclusive. This
means that the previously-recommended way to get an interactive shell,
<span class="commandline">srun --pty $SHELL</span>, will no longer work, as the
shell's step will now consume all resources on the node and cause subsequent
<span class="commandline">srun</span> calls to pend.</p>
<p>An alternative but not recommended method is to make use of srun's
<i>--pty</i> option, (e.g. <i>srun --pty bash -i</i>).
Srun's <i>--pty</i> option runs task zero in pseudo terminal mode. Bash's
<i>-i</i> option instructs it to run in interactive mode (with prompts).
However, unlike the batch or interactive steps, this launches a step which
consumes all resources in the job. This means that subsequent steps cannot be
launched in the job unless they use the <i>--overlap</i> option. If task plugins
are configured, the shell is limited to CPUs of the first task. Subsequent
steps (which must be launched with <i>--overlap</i>) may be limited to fewer
resources than expected or may fail to launch tasks altogether if multiple
nodes were requested. Therefore, this alternative should rarely be used;
<code>salloc</code> should be used instead.
</p>
<p><a id="x11"><b>Can Slurm export an X11 display on an allocated compute node?</b></a><br/>
You can use the X11 builtin feature starting at version 17.11.
It is enabled by setting <i>PrologFlags=x11</i> in <i>slurm.conf</i>.
Other X11 plugins must be deactivated.
<br/>
Run it as shown:
</p>
<pre>
$ ssh -X user@login1
$ srun -n1 --pty --x11 xclock
</pre>
<p>
An alternative for older versions is to build and install an optional SPANK
plugin for that functionality. Instructions to build and install the plugin
follow. This SPANK plugin will not work if used in combination with native X11
support so you must disable it compiling Slurm with <i>--disable-x11</i>. This
plugin relies on openssh library and it provides features such as GSSAPI
support.<br/> Update the Slurm installation path as needed:</p>
<pre>
# It may be obvious, but don't forget the -X on ssh
$ ssh -X alex@testserver.com
# Get the plugin
$ mkdir git
$ cd git
$ git clone https://github.com/hautreux/slurm-spank-x11.git
$ cd slurm-spank-x11
# Manually edit the X11_LIBEXEC_PROG macro definition
$ vi slurm-spank-x11.c
$ vi slurm-spank-x11-plug.c
$ grep "define X11_" slurm-spank-x11.c
#define X11_LIBEXEC_PROG "/opt/slurm/17.02/libexec/slurm-spank-x11"
$ grep "define X11_LIBEXEC_PROG" slurm-spank-x11-plug.c
#define X11_LIBEXEC_PROG "/opt/slurm/17.02/libexec/slurm-spank-x11"
# Compile
$ gcc -g -o slurm-spank-x11 slurm-spank-x11.c
$ gcc -g -I/opt/slurm/17.02/include -shared -fPIC -o x11.so slurm-spank-x11-plug.c
# Install
$ mkdir -p /opt/slurm/17.02/libexec
$ install -m 755 slurm-spank-x11 /opt/slurm/17.02/libexec
$ install -m 755 x11.so /opt/slurm/17.02/lib/slurm
# Configure
$ echo -e "optional x11.so" >> /opt/slurm/17.02/etc/plugstack.conf
$ cd ~/tests
# Run
$ srun -n1 --pty --x11 xclock
alex@node1's password:
</pre>
<h3>Scheduling</h3>
<p><a id="pending"><b>Why is my job not running?</b></a><br>
The answer to this question depends on a lot of factors. The main one is which
scheduler is used by Slurm. Executing the command</p>
<blockquote>
<p> <span class="commandline">scontrol show config | grep SchedulerType</span></p>
</blockquote>
<p> will supply this information. If the scheduler type is <b>builtin</b>, then
jobs will be executed in the order of submission for a given partition. Even if
resources are available to initiate your job immediately, it will be deferred
until no previously submitted job is pending. If the scheduler type is <b>backfill</b>,
then jobs will generally be executed in the order of submission for a given partition
with one exception: later submitted jobs will be initiated early if doing so does
not delay the expected execution time of an earlier submitted job. In order for
backfill scheduling to be effective, users' jobs should specify reasonable time
limits. If jobs do not specify time limits, then all jobs will receive the same
time limit (that associated with the partition), and the ability to backfill schedule
jobs will be limited. The backfill scheduler does not alter job specifications
of required or excluded nodes, so jobs which specify nodes will substantially
reduce the effectiveness of backfill scheduling. See the <a href="#backfill">
backfill</a> section for more details. For any scheduler, you can check priorities
of jobs using the command <span class="commandline">scontrol show job</span>.
Other reasons can include waiting for resources, memory, qos, reservations, etc.
As a guideline, issue an <span class="commandline">scontrol show job &lt;jobid&gt;</span>
and look at the field <i>State</i> and <i>Reason</i> to investigate the cause.
A full list and explanation of the different Reasons can be found in the
<a href="resource_limits.html#reasons">resource limits</a> page.</p>
<p><a id="backfill"><b>Why is the Slurm backfill scheduler not starting my job?
</b></a><br>
The most common problem is failing to set job time limits. If all jobs have
the same time limit (for example the partition's time limit), then backfill
will not be effective. Note that partitions can have both default and maximum
time limits, which can be helpful in configuring a system for effective
backfill scheduling.</p>
<p>In addition, there are a multitude of backfill scheduling parameters
which can impact which jobs are considered for backfill scheduling, such
as the maximum number of jobs tested per user. For more information see
the slurm.conf man page and check the configuration of SchedulerParameters
on your system.</p>
<h3>Killed Jobs</h3>
<p><a id="purge"><b>Why is my job killed prematurely?</b></a><br>
Slurm has a job purging mechanism to remove inactive jobs (resource allocations)
before reaching its time limit, which could be infinite.
This inactivity time limit is configurable by the system administrator.
You can check its value with the command</p>
<blockquote>
<p><span class="commandline">scontrol show config | grep InactiveLimit</span></p>
</blockquote>
<p>The value of InactiveLimit is in seconds.
A zero value indicates that job purging is disabled.
A job is considered inactive if it has no active job steps or if the srun
command creating the job is not responding.
In the case of a batch job, the srun command terminates after the job script
is submitted.
Therefore batch job pre- and post-processing is limited to the InactiveLimit.
Contact your system administrator if you believe the InactiveLimit value
should be changed.</p>
<p><a id="inactive"><b>Why is my batch job that launches no
job steps being killed?</b></a><br>
Slurm has a configuration parameter <i>InactiveLimit</i> intended
to kill jobs that do not spawn any job steps for a configurable
period of time. Your system administrator may modify the <i>InactiveLimit</i>
to satisfy your needs. Alternately, you can just spawn a job step
at the beginning of your script to execute in the background. It
will be purged when your script exits or your job otherwise terminates.
A line of this sort near the beginning of your script should suffice:<br>
<i>srun -N1 -n1 sleep 999999 &</i></p>
<p><a id="force"><b>What does &quot;srun: Force Terminated job&quot;
indicate?</b></a><br>
The srun command normally terminates when the standard output and
error I/O from the spawned tasks end. This does not necessarily
happen at the same time that a job step is terminated. For example,
a file system problem could render a spawned task non-killable
at the same time that I/O to srun is pending. Alternately a network
problem could prevent the I/O from being transmitted to srun.
In any event, the srun command is notified when a job step is
terminated, either upon reaching its time limit or being explicitly
killed. If the srun has not already terminated, the message
&quot;srun: Force Terminated job&quot; is printed.
If the job step's I/O does not terminate in a timely fashion
thereafter, pending I/O is abandoned and the srun command
exits.</p>
<p><a id="early_exit"><b>What does this mean:
&quot;srun: First task exited 30s ago&quot;
followed by &quot;srun Job Failed&quot;?</b></a><br>
The srun command monitors when tasks exit. By default, 30 seconds
after the first task exits, the job is killed.
This typically indicates some type of job failure and continuing
to execute a parallel job when one of the tasks has exited is
not normally productive. This behavior can be changed using srun's
<i>--wait=&lt;time&gt;</i> option to either change the timeout
period or disable the timeout altogether. See srun's man page
for details.</p>
<h3>Managing Jobs</h3>
<p><a id="hold"><b>How can I temporarily prevent a job from running
(e.g. place it into a <i>hold</i> state)?</b></a><br>
The easiest way to do this is to change a job's earliest begin time
(optionally set at job submit time using the <i>--begin</i> option).
The example below places a job into hold state (preventing its initiation
for 30 days) and later permitting it to start now.</p>
<pre>
$ scontrol update JobId=1234 StartTime=now+30days
... later ...
$ scontrol update JobId=1234 StartTime=now
</pre>
<p><a id="job_size"><b>Can I change my job's size after it has started
running?</b></a><br>
Slurm supports the ability to decrease the size of jobs.
Requesting fewer hardware resources, and changing partition, qos,
reservation, licenses, etc. is only allowed for pending jobs.</p>
<p>Use the <i>scontrol</i> command to change a job's size either by specifying
a new node count (<i>NumNodes=</i>) for the job or identify the specific nodes
(<i>NodeList=</i>) that you want the job to retain.
Any job steps running on the nodes which are relinquished by the job will be
killed unless initiated with the <i>--no-kill</i> option.
After the job size is changed, some environment variables created by Slurm
containing information about the job's environment will no longer be valid and
should either be removed or altered (e.g. SLURM_JOB_NUM_NODES,
SLURM_JOB_NODELIST and SLURM_NTASKS).
The <i>scontrol</i> command will generate a script that can be executed to
reset local environment variables.
You must retain the SLURM_JOB_ID environment variable in order for the
<i>srun</i> command to gather information about the job's current state and
specify the desired node and/or task count in subsequent <i>srun</i> invocations.
A new accounting record is generated when a job is resized, showing the job to
have been resubmitted and restarted at the new size.
An example is shown below.</p>
<pre>
#!/bin/bash
srun my_big_job
scontrol update JobId=$SLURM_JOB_ID NumNodes=2
. slurm_job_${SLURM_JOB_ID}_resize.sh
srun -N2 my_small_job
rm slurm_job_${SLURM_JOB_ID}_resize.*
</pre>
<p><a id="estimated_start_time"><b>Why does squeue (and "scontrol show
jobid") sometimes not display a job's estimated start time?</b></a><br>
When the backfill scheduler is configured, it provides an estimated start time
for jobs that are candidates for backfill. Pending jobs with dependencies
will not have an estimate as it is difficult to predict what resources will
be available when the jobs they are dependent on terminate. Also note that
the estimate is better for jobs expected to start soon, as most running jobs
end before their estimated time. There are other restrictions on backfill that
may apply. See the <a href="#backfill">backfill</a> section for more details.
</p>
<p><a id="squeue_color"><b>Can squeue output be color coded?</b></a><br>
The squeue command output is not color coded, but other tools can be used to
add color. One such tool is ColorWrapper
(<a href="https://github.com/rrthomas/cw">https://github.com/rrthomas/cw</a>).
A sample ColorWrapper configuration file and output are shown below.</p>
<pre>
path /bin:/usr/bin:/sbin:/usr/sbin:&lt;env&gt;
usepty
base green+
match red:default (Resources)
match black:default (null)
match black:cyan N/A
regex cyan:default PD .*$
regex red:default ^\d*\s*C .*$
regex red:default ^\d*\s*CG .*$
regex red:default ^\d*\s*NF .*$
regex white:default ^JOBID.*
</pre>
<img src="squeue_color.png" width=600>
<p><a id="comp"><b>Why is my job/node in a COMPLETING state?</b></a><br>
When a job is terminating, both the job and its nodes enter the COMPLETING state.
As the Slurm daemon on each node determines that all processes associated with
the job have terminated, that node changes state to IDLE or some other appropriate
state for use by other jobs.
When every node allocated to a job has determined that all processes associated
with it have terminated, the job changes state to COMPLETED or some other
appropriate state (e.g. FAILED).
Normally, this happens within a second.
However, if the job has processes that cannot be terminated with a SIGKILL
signal, the job and one or more nodes can remain in the COMPLETING state
for an extended period of time.
This may be indicative of processes hung waiting for a core file
to complete I/O or operating system failure.
If this state persists, the system administrator should check for processes
associated with the job that cannot be terminated then use the
<span class="commandline">scontrol</span> command to change the node's
state to DOWN (e.g. &quot;scontrol update NodeName=<i>name</i> State=DOWN Reason=hung_completing&quot;),
reboot the node, then reset the node's state to IDLE
(e.g. &quot;scontrol update NodeName=<i>name</i> State=RESUME&quot;).
Note that setting the node DOWN will terminate all running or suspended
jobs associated with that node.
An alternative is to set the node's state to DRAIN until all jobs
associated with it terminate before setting it DOWN and re-booting.</p>
<p>Note that Slurm has two configuration parameters that may be used to
automate some of this process.
<i>UnkillableStepProgram</i> specifies a program to execute when
non-killable processes are identified.
<i>UnkillableStepTimeout</i> specifies how long to wait for processes
to terminate.
See the "man slurm.conf" for more information about these parameters.</p>
<p><a id="req"><b>How can a job in a complete or failed state be requeued?</b></a>
<br>
Slurm supports requeuing jobs in a done or failed state. Use the
command:</p>
<p><b>scontrol requeue job_id</b></p>
<p>The job will then be requeued back in the PENDING state and scheduled again.
See man(1) scontrol.
</p>
<p>Consider a simple job like this:</p>
<pre>
$cat zoppo
#!/bin/sh
echo "hello, world"
exit 10
$sbatch -o here ./zoppo
Submitted batch job 10
</pre>
<p>
The job finishes in FAILED state because it exits with
a non zero value. We can requeue the job back to
the PENDING state and the job will be dispatched again.
</p>
<pre>
$ scontrol requeue 10
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
10 mira zoppo david PD 0:00 1 (NonZeroExitCode)
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
10 mira zoppo david R 0:03 1 alanz1
</pre>
<p>Slurm supports requeuing jobs in a hold state with the command:</p>
<p><b>scontrol requeuehold job_id</b></p>
<p>The job can be in state RUNNING, SUSPENDED, COMPLETED or FAILED
before being requeued.</p>
<pre>
$ scontrol requeuehold 10
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
10 mira zoppo david PD 0:00 1 (JobHeldUser)
</pre>
<p><a id="sview_colors"><b>Why is sview not coloring/highlighting nodes
properly?</b></a><br>
sview color-coding is affected by the GTK theme. The node status grid
is made up of button widgets and certain GTK themes don't show the color
setting as desired. Changing GTK themes can restore proper color-coding.</p>
<p><a id="mpi_symbols"><b>Why is my MPICH2 or MVAPICH2 job not running with
Slurm? Why does the DAKOTA program not run with Slurm?</b></a><br>
The Slurm library used to support MPICH2 or MVAPICH2 references a variety of
symbols. If those symbols resolve to functions or variables in your program
rather than the appropriate library, the application will fail. For example
<a href="http://dakota.sandia.gov">DAKOTA</a>, versions 5.1 and
older, contains a function named regcomp, which will get used rather
than the POSIX regex functions. Rename DAKOTA's function and
references from regcomp to something else to make it work properly.</p>
<h3>Resource Limits</h3>
<p><a id="rlimit"><b>Why are my resource limits not propagated?</b></a><br>
When the <span class="commandline">srun</span> command executes, it captures the
resource limits in effect at submit time on the node where srun executes.
These limits are propagated to the allocated nodes before initiating the
user's job.
The Slurm daemons running on the allocated nodes then try to establish
identical resource limits for the job being initiated.
There are several possible reasons for not being able to establish those
resource limits.</p>
<ul>
<li>The hard resource limits applied to Slurm's slurmd daemon are lower
than the user's soft resources limits on the submit host. Typically
the slurmd daemon is initiated by the init daemon with the operating
system default limits. This may be addressed either through use of the
ulimit command in the /etc/sysconfig/slurm file or enabling
<a href="#pam">PAM in Slurm</a>.</li>
<li>The user's hard resource limits on the allocated node are lower than
the same user's soft hard resource limits on the node from which the
job was submitted. It is recommended that the system administrator
establish uniform hard resource limits for users on all nodes
within a cluster to prevent this from occurring.</li>
<li>PropagateResourceLimits or PropagateResourceLimitsExcept parameters are
configured in slurm.conf and avoid propagation of specified limits.</li>
</ul>
<p><b>NOTE</b>: This may produce the error message
&quot;Can't propagate RLIMIT_...&quot;.
The error message is printed only if the user explicitly specifies that
the resource limit should be propagated or the srun command is running
with verbose logging of actions from the slurmd daemon (e.g. "srun -d6 ...").</p>
<p><a id="mem_limit"><b>Why are jobs not getting the appropriate
memory limit?</b></a><br>
This is probably a variation on the <a href="#memlock">locked memory limit</a>
problem described above.
Use the same solution for the AS (Address Space), RSS (Resident Set Size),
or other limits as needed.</p>
<p><a id="memlock"><b>Why is my MPI job failing due to the
locked memory (memlock) limit being too low?</b></a><br>
By default, Slurm propagates all of your resource limits at the
time of job submission to the spawned tasks.
This can be disabled by specifically excluding the propagation of
specific limits in the <i>slurm.conf</i> file. For example
<i>PropagateResourceLimitsExcept=MEMLOCK</i> might be used to
prevent the propagation of a user's locked memory limit from a
<a href="quickstart_admin.html#login">login node</a> to a dedicated
node used for his parallel job.
If the user's resource limit is not propagated, the limit in
effect for the <i>slurmd</i> daemon will be used for the spawned job.
A simple way to control this is to ensure that user <i>root</i> has a
sufficiently large resource limit and ensuring that <i>slurmd</i> takes
full advantage of this limit. For example, you can set user root's
locked memory limit ulimit to be unlimited on the compute nodes (see
<i>"man limits.conf"</i>) and ensuring that <i>slurmd</i> takes
full advantage of this limit (e.g. by adding <i>"LimitMEMLOCK=infinity"</i>
to your systemd's <i>slurmd.service</i> file). It may also be desirable to lock
the slurmd daemon's memory to help ensure that it keeps responding if memory
swapping begins. A sample <i>/etc/sysconfig/slurm</i> which can be read from
systemd is shown below.
Related information about <a href="#pam">PAM</a> is also available.</p>
<pre>
#
# Example /etc/sysconfig/slurm
#
# Memlocks the slurmd process's memory so that if a node
# starts swapping, the slurmd will continue to respond
SLURMD_OPTIONS="-M"
</pre>
<h2>For Administrators</h2>
<h3>Test Environments</h3>
<p><a id="multi_slurm"><b>Can multiple Slurm systems be run in
parallel for testing purposes?</b></a><br>
Yes, this is a great way to test new versions of Slurm.
Just install the test version in a different location with a different
<i>slurm.conf</i>.
The test system's <i>slurm.conf</i> should specify different
pathnames and port numbers to avoid conflicts.
The only problem is if more than one version of Slurm is configured
with <i>burst_buffer/*</i> plugins or others that may interact with external
system APIs.
In that case, there can be conflicting API requests from
the different Slurm systems.
This can be avoided by configuring the test system with <i>burst_buffer/none</i>.</p>
<p><a id="multi_slurmd"><b>Can Slurm emulate a larger cluster?</b></a><br>
Yes, this can be useful for testing purposes.
It has also been used to partition "fat" nodes into multiple Slurm nodes.
There are two ways to do this.
The best method for most conditions is to run one <i>slurmd</i>
daemon per emulated node in the cluster as follows.</p>
<ol>
<li>When executing the <i>configure</i> program, use the option
<i>--enable-multiple-slurmd</i> (or add that option to your <i>~/.rpmmacros</i>
file).</li>
<li>Build and install Slurm in the usual manner.</li>
<li>In <i>slurm.conf</i> define the desired node names (arbitrary
names used only by Slurm) as <i>NodeName</i> along with the actual
address of the physical node in <i>NodeHostname</i>. Multiple
<i>NodeName</i> values can be mapped to a single
<i>NodeHostname</i>. Note that each <i>NodeName</i> on a single
physical node needs to be configured to use a different port number
(set <i>Port</i> to a unique value on each line for each node). You
will also want to use the "%n" symbol in slurmd related path options in
slurm.conf (<i>SlurmdLogFile</i> and <i>SlurmdPidFile</i>). </li>
<li>When starting the <i>slurmd</i> daemon, include the <i>NodeName</i>
of the node that it is supposed to serve on the execute line (e.g.
"slurmd -N hostname").</li>
<li> This is an example of the <i>slurm.conf</i> file with the emulated nodes
and ports configuration. Any valid value for the CPUs, memory or other
valid node resources can be specified.</li>
</ol>
<pre>
NodeName=dummy26[1-100] NodeHostName=achille Port=[6001-6100] NodeAddr=127.0.0.1 CPUs=4 RealMemory=6000
PartitionName=mira Default=yes Nodes=dummy26[1-100]
</pre>
<p>See the
<a href="programmer_guide.html#multiple_slurmd_support">Programmers Guide</a>
for more details about configuring multiple slurmd support.</p>
<p><a id="extra_procs"><b>Can Slurm emulate nodes with more
resources than physically exist on the node?</b></a><br>
Yes. In the slurm.conf file, configure <i>SlurmdParameters=config_overrides</i>
and specify
any desired node resource specifications (<i>CPUs</i>, <i>Sockets</i>,
<i>CoresPerSocket</i>, <i>ThreadsPerCore</i>, and/or <i>TmpDisk</i>).
Slurm will use the resource specification for each node that is
given in <i>slurm.conf</i> and will not check these specifications
against those actually found on the node. The system would best be configured
with <i>TaskPlugin=task/none</i>, so that launched tasks can run on any
available CPU under operating system control.</p>
<h3>Build and Install</h3>
<p><a id="rpm"><b>Why aren't pam_slurm.so, auth_none.so, or other components in a
Slurm RPM?</b></a><br>
It is possible that at build time the required dependencies for building the
library are missing. If you want to build the library then install pam-devel
and compile again. See the file slurm.spec in the Slurm distribution for a list
of other options that you can specify at compile time with rpmbuild flags
and your <i>rpmmacros</i> file.</p>
<p>The auth_none plugin is in a separate RPM and not built by default.
Using the auth_none plugin means that Slurm communications are not
authenticated, so you probably do not want to run in this mode of operation
except for testing purposes. If you want to build the auth_none RPM then
add <i>--with auth_none</i> on the rpmbuild command line or add
<i>%_with_auth_none</i> to your ~/rpmmacros file. See the file slurm.spec
in the Slurm distribution for a list of other options.</p>
<p><a id="debug"><b>How can I build Slurm with debugging symbols?</b></a><br>
When configuring, run the configure script with <i>--enable-developer</i> option.
That will provide asserts, debug messages and the <i>-Werror</i> flag, that
will in turn activate <i>--enable-debug</i>.
<br/>With the <i>--enable-debug</i> flag, the code will be compiled with
<i>-ggdb3</i> and <i>-g -O1 -fno-strict-aliasing</i> flags that will produce
extra debugging information. Another possible option to use is
<i>--disable-optimizations</i> that will set <i>-O0</i>.
See also <i>auxdir/x_ac_debug.m4</i> for more details.</p>
<p><a id="git_patch"><b>How can a patch file be generated from a Slurm
commit in GitHub?</b></a><br>
Find and open the commit in GitHub then append ".patch" to the URL and save
the resulting file. For an example, see:
<a href="https://github.com/SchedMD/slurm/commit/91e543d433bed11e0df13ce0499be641774c99a3.patch">
https://github.com/SchedMD/slurm/commit/91e543d433bed11e0df13ce0499be641774c99a3.patch</a>
</p>
<p><a id="apply_patch"><b>How can I apply a patch to my Slurm source?</b></a>
<br>
If you have a patch file that you need to apply to your source, such as a
security or bug fix patch supplied by SchedMD's support, you can do
so with the <b>patch</b> command. You would first extract the contents of the
source tarball for the version you are using. You can then apply the patch
to the extracted source. Below is an example of how to do this with the
source for Slurm 23.11.1:
<pre>
$ tar xjvf slurm-23.11.1.tar.bz2 > /dev/null
$ patch -p1 -d slurm-23.11.1/ < example.patch
patching file src/slurmctld/step_mgr.c
</pre>
</p>
<p>Once the patch has been applied to the source code, you can proceed to
build Slurm as you would normally if you build with <b>make</b>. If you use
<b>rpmbuild</b> to build Slurm, you will have to create a tarball with the
patched files. The filename of the tarball must match the original filename
to avoid errors.
<pre>
$ tar cjvf slurm-23.11.1.tar.bz2 slurm-23.11.1/ > /dev/null
$ rpmbuild -ta slurm-23.11.1.tar.bz2 > /dev/null
</pre>
</p>
<p>Alternatively, as of Slurm 24.11.0 when using <b>rpmbuild</b>, a patched
package may be created directly by placing the patch file in the same directory
as the source tarball and executing the following command:</p>
<pre>
$ rpmbuild -ta --define 'patch security.patch' slurm-24.11.0.tar.bz2
</pre>
<p><a id="epel"><b>Why am I being offered an automatic update for Slurm?</b></a>
<br>
EPEL has added Slurm packages to their repository to make them more widely
available to the Linux community. However, this packaged version is not
supported or maintained by SchedMD, and is not recommend for customers at this
time. If you are using the EPEL repo you could be offered an update for Slurm
that you may not anticipate. In order to prevent Slurm from being upgraded
unintentionally, we recommend you modify the EPEL repository configuration file
to exclude all Slurm packages from automatic updates.</p>
<pre>
exclude=slurm*
</pre>
<h3>Cluster Management</h3>
<p><a id="controller"><b>How should I relocate the primary or
backup controller?</b></a><br>
If the cluster's computers used for the primary or backup controller
will be out of service for an extended period of time, it may be desirable
to relocate them. In order to do so, follow this procedure:</p>
<ol>
<li>(Slurm 23.02 and older) Drain the cluster of running jobs</li>
<li>Stop all Slurm daemons</li>
<li>Modify the <i>SlurmctldHost</i> values in the <i>slurm.conf</i> file</li>
<li>Distribute the updated <i>slurm.conf</i> file to all nodes</li>
<li>Copy the <i>StateSaveLocation</i> directory to the new host and
make sure the permissions allow the <i>SlurmUser</i> to read and write it.
<li>Restart all Slurm daemons</li>
</ol>
<p>Starting with Slurm 23.11, jobs that were started by the old controller will
receive the updated controller address and will continue and finish normally.
On older versions, jobs started by the old controller will still try to report
back to the older controller.
In both cases, there should be no loss of any pending jobs.
Ensure that any nodes added to the cluster have a current <i>slurm.conf</i>
file installed.</p>
<p><b>CAUTION:</b> If two nodes are simultaneously configured as the primary
controller (two nodes on which <i>SlurmctldHost</i> specify the local host
and the <i>slurmctld</i> daemon is executing on each), system behavior will be
destructive. If a compute node has an incorrect <i>SlurmctldHost</i> parameter,
that node may be rendered unusable, but no other harm will result.</p>
<p><a id="clock"><b>Do I need to maintain synchronized
clocks on the cluster?</b></a><br>
In general, yes. Having inconsistent clocks may cause nodes to be unusable and
generate errors in Slurm log files regarding expired credentials. For example:
</p>
<pre>
error: Munge decode failed: Expired credential
ENCODED: Wed May 12 12:34:56 2008
DECODED: Wed May 12 12:01:12 2008
</pre>
<p><a id="stop_sched"><b>How can I stop Slurm from scheduling jobs?</b></a><br>
You can stop Slurm from scheduling jobs on a per partition basis by setting
that partition's state to DOWN. Set its state UP to resume scheduling.
For example:</p>
<pre>
$ scontrol update PartitionName=foo State=DOWN
$ scontrol update PartitionName=bar State=UP
</pre>
<p><a id="maint_time"><b>How can I dry up the workload for a
maintenance period?</b></a><br>
Create a resource reservation as described in Slurm's
<a href="reservations.html">Resource Reservation Guide</a>.</p>
<p><a id="upgrade"><b>What should I be aware of when upgrading Slurm?</b></a><br>
Refer to the <a href="upgrades.html">Upgrade Guide</a> for details.</p>
<p><a id="db_upgrade"><b>Is there anything exceptional to be aware of when
upgrading my database server?</b></a><br>
Generally, no. Special cases are noted in the <a href="upgrades.html#db_server">
Database server</a> section of the Upgrade Guide.</p>
<p><a id="cluster_acct"><b>When adding a new cluster, how can the Slurm cluster
configuration be copied from an existing cluster to the new cluster?</b></a><br>
Accounts need to be configured for the cluster. An easy way to copy information from
an existing cluster is to use the sacctmgr command to dump that cluster's information,
modify it using some editor, the load the new information using the sacctmgr
command. See the sacctmgr man page for details, including an example.</p>
<p><a id="state_info"><b>How could some jobs submitted immediately before
the slurmctld daemon crashed be lost?</b></a><br>
Any time the slurmctld daemon or hardware fails before state information reaches
disk can result in lost state.
Slurmctld writes state frequently (every five seconds by default), but with
large numbers of jobs, the formatting and writing of records can take seconds
and recent changes might not be written to disk.
Another example is if the state information is written to file, but that
information is cached in memory rather than written to disk when the node fails.
The interval between state saves being written to disk can be configured at
build time by defining SAVE_MAX_WAIT to a different value than five.</p>
<p><a id="limit_propagation"><b>Is resource limit propagation
useful on a homogeneous cluster?</b></a><br>
Resource limit propagation permits a user to modify resource limits
and submit a job with those limits.
By default, Slurm automatically propagates all resource limits in
effect at the time of job submission to the tasks spawned as part
of that job.
System administrators can utilize the <i>PropagateResourceLimits</i>
and <i>PropagateResourceLimitsExcept</i> configuration parameters to
change this behavior.
Users can override defaults using the <i>srun --propagate</i>
option.
See <i>"man slurm.conf"</i> and <i>"man srun"</i> for more information
about these options.</p>
<p><a id="enforce_limits"><b>Why are the resource limits set in the
database not being enforced?</b></a><br>
In order to enforce resource limits, set the value of
<b>AccountingStorageEnforce</b> in each cluster's slurm.conf configuration
file appropriately. If <b>AccountingStorageEnforce</b> does not contains
an option of "limits", then resource limits will not be enforced on that cluster.
See <a href="resource_limits.html">Resource Limits</a> for more information.</p>
<p><a id="licenses"><b>Can Slurm be configured to manage licenses?</b></a><br>
Slurm does not provide a native integration with third party license managers,
but it does provide for the allocation of global resources called licenses.
Use the Licenses configuration parameter in your slurm.conf file
(e.g. "Licenses=foo:10,bar:20"). Jobs can request licenses and be granted
exclusive use of those resources (e.g. "sbatch --licenses=foo:2,bar:1 ...").
It is not currently possible to change the total number of licenses on a system
without restarting the slurmctld daemon, but it is possible to dynamically
reserve licenses and remove them from being available to jobs on the system
(e.g. "scontrol update reservation=licenses_held licenses=foo:5,bar:2").
For more information see the <a href="licenses.html">Licenses Guide</a>.</p>
<p><a id="torque"><b>How easy is it to switch from PBS or Torque to Slurm?</b></a><br>
A lot of users don't even notice the difference.
Slurm has wrappers available for the mpiexec, pbsnodes, qdel, qhold, qrls,
qstat, and qsub commands (see contribs/torque in the distribution and the
"slurm-torque" RPM).
There is also a wrapper for the showq command at
<a href="https://github.com/pedmon/slurm_showq">
https://github.com/pedmon/slurm_showq</a>.</p>
<p>Slurm recognizes and translates the "#PBS" options in batch scripts.
Most, but not all options are supported.</p>
<p>Slurm also includes a SPANK plugin that will set all of the PBS environment
variables based upon the Slurm environment (e.g. PBS_JOBID, PBS_JOBNAME,
PBS_WORKDIR, etc.).
One environment not set by PBS_ENVIRONMENT, which if set would result in the
failure of some MPI implementations.
The plugin will be installed in<br>
&lt;install_directory&gt;/lib/slurm/spank_pbs.so<br>
See the SPANK man page for configuration details.</p>
<p><a id="mpi_perf"><b>What might account for MPI performance being below
the expected level?</b></a><br>
Starting the slurmd daemons with limited locked memory can account for this.
Adding the line "ulimit -l unlimited" to the <i>/etc/sysconfig/slurm</i> file can
fix this.</p>
<p><a id="delete_partition"><b>How do I safely remove partitions?
</b></a><br>
Partitions should be removed using the
"scontrol delete PartitionName=&lt;partition&gt;" command. This is because
scontrol will prevent any partitions from being removed that are in use.
Partitions need to be removed from the slurm.conf after being removed using
scontrol or they will return after a restart.
An existing job's partition(s) can be updated with the "scontrol update
JobId=&lt;jobid&gt; Partition=&lt;partition(s)&gt;" command.
Removing a partition from the slurm.conf and restarting will cancel any existing
jobs that reference the removed partitions.
</p>
<p><a id="routing_queue"><b>How can a routing queue be configured?</b></a><br>
A job submit plugin is designed to have access to a job request from a user,
plus information about all of the available system partitions/queue.
An administrator can write a C plugin or LUA script to set an incoming job's
partition based upon its size, time limit, etc.
See the <a href="https://slurm.schedmd.com/job_submit_plugins.html"> Job Submit Plugin API</a>
guide for more information.
Also see the available job submit plugins distributed with Slurm for examples
(look in the "src/plugins/job_submit" directory).</p>
<p><a id="none_plugins"><b>What happened to the "none" plugins?</b></a><br>
In Slurm 23.02 and earlier, several parameters had a plugin named "none"
that would essentially disable the setting. In version 23.11, those plugins
named "none" were removed. To disable a setting you just need to leave it
unset. If you still have a plugin defined as "none", Slurm will still
recognize it and treat it as though it was unset. Parameters that previously
had a "none" plugin are:
<ul>
<li>AccountingStorageType</li>
<li>AcctGatherEnergyType</li>
<li>AcctGatherInterconnectType</li>
<li>AcctGatherFilesystemType</li>
<li>AcctGatherProfileType</li>
<li>CliFilterPlugins</li>
<li>CoreSpecPlugin</li>
<li>ExtSensorsType</li>
<li>JobAcctGatherType</li>
<li>JobCompType</li>
<li>JobContainerType</li>
<li>MCSPlugin</li>
<li>MpiDefault</li>
<li>PowerParameters</li>
<li>PreemptType</li>
<li>PrioritySiteFactorPlugin</li>
<li>SwitchType</li>
<li>TaskPlugin</li>
<li>TopologyPlugin</li>
</ul></p>
<h3>Accounting Database</h3>
<p><a id="slurmdbd"><b>Why should I use the slurmdbd instead of the
regular database plugins?</b></a><br>
While the normal storage plugins will work fine without the added
layer of the slurmdbd there are some great benefits to using the
slurmdbd.</p>
<ol>
<li>Added security. Using the slurmdbd you can have an authenticated
connection to the database.</li>
<li>Offloading processing from the controller. With the slurmdbd there is no
slowdown to the controller due to a slow or overloaded database.</li>
<li>Keeping enterprise wide accounting from all Slurm clusters in one database.
The slurmdbd is multi-threaded and designed to handle all the
accounting for the entire enterprise.</li>
<li>With the database plugins you can query with sacct accounting stats from
any node Slurm is installed on. With the slurmdbd you can also query any
cluster using the slurmdbd from any other cluster's nodes. Other tools like
sreport are also available.</li>
</ol>
<p><a id="dbd_rebuild"><b>How can I rebuild the database hierarchy?</b></a><br>
If you see errors of this sort:</p>
<pre>
error: Can't find parent id 3358 for assoc 1504, this should never happen.
</pre>
<p>in the slurmctld log file, this is indicative that the database hierarchy
information has been corrupted, typically due to a hardware failure or
administrator error in directly modifying the database. In order to rebuild
the database information, start the slurmdbd daemon with the "-R" option
followed by an optional comma separated list of cluster names to operate on.</p>
<p><a id="ha_db"><b>How critical is configuring high availability for my
database?</b></a></p>
<ul>
<li>Consider if you really need a high-availability MySQL setup. A short outage
of slurmdbd is not a problem, because slurmctld will store all data in memory
and send it to slurmdbd when it resumes operations. The slurmctld daemon will
also cache all user limits and fair share information.</li>
<li>You cannot use NDB, since SlurmDBD's MySQL implementation uses keys on BLOB
values (and potentially other features on the incompatibility list).</li>
<li>You can set up "classical" Linux HA, with heartbeat/corosync to migrate IP
between primary/backup mysql servers and:
<ul>
<li>Configure one way replication of mysql, and change primary/backup roles on
failure</li>
<li>Use shared storage for primary/backup mysql servers database, and start
backup on primary mysql failure.</li>
</ul>
</li>
</ul>
<p><a id="sql"><b>How can I use double quotes in MySQL queries?</b></a><br>
Execute:</p>
<pre>
SET session sql_mode='ANSI_QUOTES';
</pre>
<p>This will allow double quotes in queries like this:</p>
<pre>
show columns from "tux_assoc_table" where Field='is_def';
</pre>
<h3>Compute Nodes (slurmd)</h3>
<p><a id="return_to_service"><b>Why is a node shown in state
DOWN when the node has registered for service?</b></a><br>
The configuration parameter <i>ReturnToService</i> in <i>slurm.conf</i>
controls how DOWN nodes are handled.
Set its value to one in order for DOWN nodes to automatically be
returned to service once the <i>slurmd</i> daemon registers
with a valid node configuration.
A value of zero is the default and results in a node staying DOWN
until an administrator explicitly returns it to service using
the command &quot;scontrol update NodeName=whatever State=RESUME&quot;.
See &quot;man slurm.conf&quot; and &quot;man scontrol&quot; for more
details.</p>
<p><a id="down_node"><b>What happens when a node crashes?</b></a><br>
A node is set DOWN when the slurmd daemon on it stops responding
for <i>SlurmdTimeout</i> as defined in <i>slurm.conf</i>.
The node can also be set DOWN when certain errors occur or the
node's configuration is inconsistent with that defined in <i>slurm.conf</i>.
Any active job on that node will be killed unless it was submitted
with the srun option <i>--no-kill</i>.
Any active job step on that node will be killed.
See the slurm.conf and srun man pages for more information.</p>
<p><a id="multi_job"><b>How can I control the execution of multiple
jobs per node?</b></a><br>
There are two mechanisms to control this.
If you want to allocate individual processors on a node to jobs,
configure <i>SelectType=select/cons_tres</i>.
See <a href="cons_tres.html">Consumable Resources in Slurm</a>
for details about this configuration.
If you want to allocate whole nodes to jobs, configure
configure <i>SelectType=select/linear</i>.
Each partition also has a configuration parameter <i>OverSubscribe</i>
that enables more than one job to execute on each node.
See <i>man slurm.conf</i> for more information about these
configuration parameters.</p>
<p><a id="time"><b>Why are jobs allocated nodes and then unable
to initiate programs on some nodes?</b></a><br>
This typically indicates that the time on some nodes is not consistent
with the node on which the <i>slurmctld</i> daemon executes. In order to
initiate a job step (or batch job), the <i>slurmctld</i> daemon generates
a credential containing a time stamp. If the <i>slurmd</i> daemon
receives a credential containing a time stamp later than the current
time or more than a few minutes in the past, it will be rejected.
If you check in the <i>SlurmdLogFile</i> on the nodes of interest, you
will likely see messages of this sort: "<i>Invalid job credential from
&lt;some IP address&gt;: Job credential expired</i>." Make the times
consistent across all of the nodes and all should be well.</p>
<p><a id="ping"><b>Why does <i>slurmctld</i> log that some nodes
are not responding even if they are not in any partition?</b></a><br>
The <i>slurmctld</i> daemon periodically pings the <i>slurmd</i>
daemon on every configured node, even if not associated with any
partition. You can control the frequency of this ping with the
<i>SlurmdTimeout</i> configuration parameter in <i>slurm.conf</i>.</p>
<p><a id="state_preserve"><b>How can I easily preserve drained node
information between major Slurm updates?</b></a><br>
Major Slurm updates generally have changes in the state save files and
communication protocols, so a cold-start (without state) is generally
required. If you have nodes in a DRAIN state and want to preserve that
information, you can easily build a script to preserve that information
using the <i>sinfo</i> command. The following command line will report the
<i>Reason</i> field for every node in a DRAIN state and write the output
in a form that can be executed later to restore state.</p>
<pre>
sinfo -t drain -h -o "scontrol update nodename='%N' state=drain reason='%E'"
</pre>
<p><a id="health_check_example"><b>Does anyone have an example node
health check script for Slurm?</b></a><br>
Probably the most comprehensive and lightweight health check tool out
there is
<a href="https://github.com/mej/nhc">Node Health Check</a>.
It has integration with Slurm as well as Torque resource managers.</p>
<p><a id="health_check"><b>Why doesn't the <i>HealthCheckProgram</i>
execute on DOWN nodes?</b></a><br>
Hierarchical communications are used for sending this message. If there
are DOWN nodes in the communications hierarchy, messages will need to
be re-routed. This limits Slurm's ability to tightly synchronize the
execution of the <i>HealthCheckProgram</i> across the cluster, which
could adversely impact performance of parallel applications.
The use of CRON or node startup scripts may be better suited to ensure
that <i>HealthCheckProgram</i> gets executed on nodes that are DOWN
in Slurm.</p>
<p><a id="slurmd_oom"><b>How can I prevent the <i>slurmd</i> and
<i>slurmstepd</i> daemons from being killed when a node's memory
is exhausted?</b></a><br>
You can set the value in the <i>/proc/self/oom_adj</i> for
<i>slurmd</i> and <i>slurmstepd</i> by initiating the <i>slurmd</i>
daemon with the <i>SLURMD_OOM_ADJ</i> and/or <i>SLURMSTEPD_OOM_ADJ</i>
environment variables set to the desired values.
A value of -17 typically will disable killing.</p>
<p><a id="ubuntu"><b>I see the host of my calling node as 127.0.1.1
instead of the correct IP address. Why is that?</b></a><br>
Some systems by default will put your host in the /etc/hosts file as
something like</p>
<pre>
127.0.1.1 snowflake.llnl.gov snowflake
</pre>
<p>This will cause srun and Slurm commands to use the 127.0.1.1 address
instead of the correct address and prevent communications between nodes.
The solution is to either remove this line or configure a different NodeAddr
that is known by your other nodes.</p>
<p>The CommunicationParameters=NoInAddrAny configuration parameter is subject to
this same problem, which can also be addressed by removing the actual node
name from the "127.0.1.1" as well as the "127.0.0.1"
addresses in the /etc/hosts file. It is ok if they point to
localhost, but not the actual name of the node.</p>
<p><a id="add_nodes"><b>How should I add nodes to Slurm?</b></a><br>
The slurmctld daemon has many bitmaps to track state of nodes and cores in the
cluster. Adding nodes to a running cluster would require the slurmctld daemon
to rebuild all of those bitmaps, which required restarting the daemon in older
versions of Slurm. Communications from the slurmd daemons on the compute
nodes to the slurmctld daemon include a configuration file checksum, so you
should maintain the same slurm.conf file on all nodes.</p>
<p>The following procedure is recommended on <b>Slurm 24.05</b> and older
(see below for 24.11 and newer):</p>
<ol>
<li>Stop the slurmctld daemon (e.g. <code>systemctl stop slurmctld</code>
on the head node)</li>
<li>Update the <b>slurm.conf</b> file on all nodes in the cluster</li>
<li>Restart the slurmd daemons on all nodes (e.g.
<code>systemctl restart slurmd</code> on all nodes)</li>
<li>Restart the slurmctld daemon (e.g. <code>systemctl start slurmctld</code>
on the head node)</li>
</ol>
<p>The following procedure is sufficient on <b>Slurm 24.11</b> and newer:</p>
<ol>
<li>Update the <b>slurm.conf</b> file on all nodes in the cluster</li>
<li>Run <code>scontrol reconfigure</code></li>
</ol>
<p><b>NOTE</b>: Jobs submitted with srun, and that are waiting for an
allocation, prior to new nodes being added to the slurm.conf can fail if the
job is allocated one of the new nodes.</p>
<p><a id="rem_nodes"><b>How should I remove nodes from Slurm?</b></a><br>
To safely remove a node from a cluster, it's best to drain the node of all jobs.
This ensures that job processes aren't running on the node after removal. On
restart of the controller, if a node is removed from a running job the
controller will kill the job on any remaining allocated nodes and attempt to
requeue the job if possible.</p>
<p>The following procedure is recommended on <b>Slurm 24.05</b> and older
(see below for 24.11 and newer):</p>
<ol>
<li>Drain node of all jobs (e.g.
<code>scontrol update nodename='%N' state=drain reason='removing nodes'</code>
)</li>
<li>Stop the slurmctld daemon (e.g. <code>systemctl stop slurmctld</code>
on the head node)</li>
<li>Update the <b>slurm.conf</b> file on all nodes in the cluster</li>
<li>Restart the slurmd daemons on all nodes (e.g.
<code>systemctl restart slurmd</code> on all nodes)</li>
<li>Restart the slurmctld daemon (e.g. <code>systemctl start slurmctld</code>
on the head node)</li>
</ol>
<p>The following procedure is sufficient on <b>Slurm 24.11</b> and newer:</p>
<ol>
<li>Drain node of all jobs (e.g.
<code>scontrol update nodename='%N' state=drain reason='removing nodes'</code>
)</li>
<li>Update the <b>slurm.conf</b> file on all nodes in the cluster</li>
<li>Run <code>scontrol reconfigure</code></li>
</ol>
<p><b>NOTE</b>: Removing nodes from the cluster may cause some errors in the
logs. Verify that any errors in the logs are for nodes that you intended to
remove.</p>
<p><a id="reboot"><b>Why is a compute node down with the reason set to
"Node unexpectedly rebooted"?</b></a><br>
This is indicative of the slurmctld daemon running on the cluster's head node
as well as the slurmd daemon on the compute node when the compute node reboots.
If you want to prevent this condition from setting the node into a DOWN state
then configure ReturnToService to 2. See the slurm.conf man page for details.
Otherwise use scontrol or sview to manually return the node to service.</p>
<p><a id="cgroupv2"><b>How do I convert my nodes to Control Group (cgroup)
v2?</b></a><br>
Refer to the <a href="cgroup_v2.html#conversion">cgroup v2</a> documentation
for the conversion procedure.</p>
<p><a id="amazon_ec2"><b>Can Slurm be used to run jobs on
Amazon's EC2?</b></a><br>
Yes, here is a description of Slurm use with
<a href="http://aws.amazon.com/ec2/">Amazon's EC2</a> courtesy of
Ashley Pittman:</p>
<p>I do this regularly and have no problem with it, the approach I take is to
start as many instances as I want and have a wrapper around
ec2-describe-instances that builds a /etc/hosts file with fixed hostnames
and the actual IP addresses that have been allocated. The only other step
then is to generate a slurm.conf based on how many node you've chosen to boot
that day. I run this wrapper script on my laptop and it generates the files
and they rsyncs them to all the instances automatically.</p>
<p>One thing I found is that Slurm refuses to start if any nodes specified in
the slurm.conf file aren't resolvable, I initially tried to specify cloud[0-15]
in slurm.conf, but then if I configure less than 16 nodes in /etc/hosts this
doesn't work so I dynamically generate the slurm.conf as well as the hosts
file.</p>
<p>As a comment about EC2 I run just run generic AMIs and have a persistent EBS
storage device which I attach to the first instance when I start up. This
contains a /usr/local which has my software like Slurm, pdsh and MPI installed
which I then copy over the /usr/local on the first instance and NFS export to
all other instances. This way I have persistent home directories and a very
simple first-login script that configures the virtual cluster for me.</p>
<h3>User Management</h3>
<p><a id="pam"><b>How can PAM be used to control a user's limits on
or access to compute nodes?</b></a><br>
To control a user's limits on a compute node:</p>
<p>First, enable Slurm's use of PAM by setting <i>UsePAM=1</i> in
<i>slurm.conf</i>.</p>
<p>Second, establish PAM configuration file(s) for Slurm in <i>/etc/pam.conf</i>
or the appropriate files in the <i>/etc/pam.d</i> directory (e.g.
<i>/etc/pam.d/sshd</i> by adding the line "account required pam_slurm.so".
A basic configuration you might use is:</p>
<pre>
account required pam_unix.so
account required pam_slurm.so
auth required pam_localuser.so
session required pam_limits.so
</pre>
<p>Third, set the desired limits in <i>/etc/security/limits.conf</i>.
For example, to set the locked memory limit to unlimited for all users:</p>
<pre>
* hard memlock unlimited
* soft memlock unlimited
</pre>
<p>Finally, you need to disable Slurm's forwarding of the limits from the
session from which the <i>srun</i> initiating the job ran. By default
all resource limits are propagated from that session. For example, adding
the following line to <i>slurm.conf</i> will prevent the locked memory
limit from being propagated:<i>PropagateResourceLimitsExcept=MEMLOCK</i>.</p>
<p>To control a user's access to a compute node:</p>
<p>The pam_slurm_adopt and pam_slurm modules prevent users from
logging into nodes that they have not been allocated (except for user
root, which can always login).
They are both included with the Slurm distribution.</p>
<p>The pam_slurm_adopt module is highly recommended for most installations,
and is documented in its <a href="pam_slurm_adopt.shtml">own guide</a>.</p>
<p>pam_slurm is older and less functional.
These modules are built by default for RPM packages, but can be disabled using
the .rpmmacros option "%_without_pam 1" or by entering the command line
option "--without pam" when the configure program is executed.
Their source code is in the "contribs/pam" and "contribs/pam_slurm_adopt"
directories respectively.</p>
<p>The use of either pam_slurm_adopt or pam_slurm does not require
<i>UsePAM</i> being set. The two uses of PAM are independent.</p>
<p><a id="pam_exclude"><b>How can I exclude some users from pam_slurm?</b></a><br>
<b>CAUTION:</b> Please test this on a test machine/VM before you actually do
this on your Slurm computers.</p>
<p><b>Step 1.</b> Make sure pam_listfile.so exists on your system.
The following command is an example on Redhat 6:</p>
<pre>
ls -la /lib64/security/pam_listfile.so
</pre>
<p><b>Step 2.</b> Create user list (e.g. /etc/ssh/allowed_users):</p>
<pre>
# /etc/ssh/allowed_users
root
myadmin
</pre>
<p>And, change file mode to keep it secret from regular users(Optional):</p>
<pre>
chmod 600 /etc/ssh/allowed_users
</pre>
<p><b>NOTE</b>: root is not necessarily listed on the allowed_users, but I
feel somewhat safe if it's on the list.</p>
<p><b>Step 3.</b> On /etc/pam.d/sshd, add pam_listfile.so with sufficient flag
before pam_slurm.so (e.g. my /etc/pam.d/sshd looks like this):</p>
<pre>
#%PAM-1.0
auth required pam_sepermit.so
auth include password-auth
account sufficient pam_listfile.so item=user sense=allow file=/etc/ssh/allowed_users onerr=fail
account required pam_slurm.so
account required pam_nologin.so
account include password-auth
password include password-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open env_params
session optional pam_keyinit.so force revoke
session include password-auth
</pre>
<p>(Information courtesy of Koji Tanaka, Indiana University)</p>
<p><a id="user_account"><b>Can a user's account be changed in the database?</b></a><br>
A user's account can not be changed directly. A new association needs to be
created for the user with the new account. Then the association with the old
account can be deleted.</p>
<pre>
# Assume user "adam" is initially in account "physics"
sacctmgr create user name=adam cluster=tux account=physics
sacctmgr delete user name=adam cluster=tux account=chemistry
</pre>
<p><a id="changed_uid"><b>I had to change a user's UID and now they cannot submit
jobs. How do I get the new UID to take effect?</b></a><br>
When changing UIDs, you will also need to restart the slurmctld for the changes to
take effect. Normally, when adding a new user to the system, the UID is filled in
automatically and immediately. If the user isn't known on the system yet, there is a
thread that runs every hour that fills in those UIDs when they become known, but it
doesn't recognize UID changes of preexisting users. But you can simply restart the
slurmctld for those changes to be recognized.</p>
<p><a id="sssd"><b>How can I get SSSD to work with Slurm?</b></a><br>
SSSD or System Security Services Daemon does not allow enumeration of
group members by default. Note that enabling enumeration in large
environments might not be feasible. However, Slurm does not need enumeration
except for some specific quirky configurations (multiple groups with the same
GID), so it's probably safe to leave enumeration disabled.
SSSD is also case sensitive by default for some configurations, which could
possibly raise other issues. Add the following lines
to <i>/etc/sssd/sssd.conf</i> on your head node to address these issues:</p>
<pre>
enumerate = True
case_sensitive = False
</pre>
<h3>Jobs</h3>
<p><a id="suspend"><b>How is job suspend/resume useful?</b></a><br>
Job suspend/resume is most useful to get particularly large jobs initiated
in a timely fashion with minimal overhead. Say you want to get a full-system
job initiated. Normally you would need to either cancel all running jobs
or wait for them to terminate. Canceling jobs results in the loss of
their work to that point from their beginning.
Waiting for the jobs to terminate can take hours, depending upon your
system configuration. A more attractive alternative is to suspend the
running jobs, run the full-system job, then resume the suspended jobs.
This can easily be accomplished by configuring a special queue for
full-system jobs and using a script to control the process.
The script would stop the other partitions, suspend running jobs in those
partitions, and start the full-system partition.
The process can be reversed when desired.
One can effectively gang schedule (time-slice) multiple jobs
using this mechanism, although the algorithms to do so can get quite
complex.
Suspending and resuming a job makes use of the SIGSTOP and SIGCONT
signals respectively, so swap and disk space should be sufficient to
accommodate all jobs allocated to a node, either running or suspended.</p>
<p><a id="squeue_script"><b>How can I suspend, resume, hold or release all
of the jobs belonging to a specific user, partition, etc?</b></a><br>
There isn't any filtering by user, partition, etc. available in the scontrol
command; however the squeue command can be used to perform the filtering and
build a script which you can then execute. For example:</p>
<pre>
$ squeue -u adam -h -o "scontrol hold %i" &gt;hold_script
</pre>
<p><a id="restore_priority"><b>After manually setting a job priority
value, how can its priority value be returned to being managed by the
priority/multifactor plugin?</b></a><br>
Hold and then release the job as shown below.</p>
<pre>
$ scontrol hold &lt;jobid&gt;
$ scontrol release &lt;jobid&gt;
</pre>
<p><a id="scontrol_multi_jobs"><b>Can I update multiple jobs with a
single <i>scontrol</i> command?</b></a><br>
No, but you can probably use <i>squeue</i> to build the script taking
advantage of its filtering and formatting options. For example:</p>
<pre>
$ squeue -tpd -h -o "scontrol update jobid=%i priority=1000" >my.script
</pre>
<p><a id="task_prolog"><b>How could I automatically print a job's
Slurm job ID to its standard output?</b></a><br>
The configured <i>TaskProlog</i> is the only thing that can write to
the job's standard output or set extra environment variables for a job
or job step. To write to the job's standard output, precede the message
with "print ". To export environment variables, output a line of this
form "export name=value". The example below will print a job's Slurm
job ID and allocated hosts for a batch job only.</p>
<pre>
#!/bin/sh
#
# Sample TaskProlog script that will print a batch job's
# job ID and node list to the job's stdout
#
if [ X"$SLURM_STEP_ID" = "X" -a X"$SLURM_PROCID" = "X"0 ]
then
echo "print =========================================="
echo "print SLURM_JOB_ID = $SLURM_JOB_ID"
echo "print SLURM_JOB_NODELIST = $SLURM_JOB_NODELIST"
echo "print =========================================="
fi
</pre>
<p><a id="write_to_job_stdout"><b>Is it possible to write to user stdout?</b></a>
<br>The way user I/O is handled by Slurm makes it impossible to write to the
user process as an admin after the user process is executed (execve is called).
This happens right after the call to
<a href="prolog_epilog.html">TaskProlog</a>, which is the last moment we can
write to the stdout of the user process. Slurm assumes that this file
descriptor is only owned by the user process while running. The file descriptor
is opened as specified and passed to the task so it makes use of the file
descriptor directly. Slumstepd is able to log error messages to the error file
by duplicating the standard error of the process.</p>
<p>It is possible to write to standard error from SPANK plugins, but this
can't be used to append a job summary, since the file descriptors are opened
with a close-on-exec flag and are closed by the operating system right after
the user process completes. In theory, a central place that could be used to
prepare some kind of job summary is EpilogSlurmctld. However, using it to
write to a file where user output is stored may be problematic. The script is
running as SlurmUser, so intensive validation of the file name may be required
(e.g. to prevent users from specifying something like /etc/passwd as the
output file). It's also possible that a job could have multiple output files
(see <a href=srun.html#OPT_filename-pattern>filename pattern</a> in the srun
man page).</p>
<p><a id="orphan_procs"><b>Why are user processes and <i>srun</i>
running even though the job is supposed to be completed?</b></a><br>
Slurm relies upon a configurable process tracking plugin to determine
when all of the processes associated with a job or job step have completed.
Those plugins relying upon a kernel patch can reliably identify every process.
Those plugins dependent upon process group IDs or parent process IDs are not
reliable. See the <i>ProctrackType</i> description in the <i>slurm.conf</i>
man page for details. We rely upon the cgroup plugin for most systems.</p>
<p><a id="reqspec"><b>How can a job which has exited with a specific exit
code be requeued?</b></a><br>
Slurm supports requeue in hold with a <b>SPECIAL_EXIT</b> state using the
command:</p>
<pre>scontrol requeuehold State=SpecialExit job_id</pre>
<p>This is useful when users want to requeue and flag a job which has exited
with a specific error case. See man scontrol(1) for more details.</p>
<pre>
$ scontrol requeuehold State=SpecialExit 10
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
10 mira zoppo david SE 0:00 1 (JobHeldUser)
</pre>
<p>
The job can be later released and run again.
</p>
<p>
The requeuing of jobs which exit with a specific exit code can be
automated using an <b>EpilogSlurmctld</b>, see man(5) slurm.conf.
This is an example of a script which exit code depends on the existence
of a file.
</p>
<pre>
$ cat exitme
#!/bin/sh
#
echo "hi! `date`"
if [ ! -e "/tmp/myfile" ]; then
echo "going out with 8"
exit 8
fi
rm /tmp/myfile
echo "going out with 0"
exit 0
</pre>
<p>
This is an example of an EpilogSlurmctld that checks the job exit value
looking at the <b>SLURM_JOB_EXIT2</b> environment variable and requeues a job if
it exited with value 8. The SLURM_JOB_EXIT2 has the format "exit:sig", the first
number is the exit code, typically as set by the exit() function.
The second number of the signal that caused the process to terminate if
it was terminated by a signal.
</p>
<pre>
$ cat slurmctldepilog
#!/bin/sh
export PATH=/bin:/home/slurm/linux/bin
LOG=/home/slurm/linux/log/logslurmepilog
echo "Start `date`" >> $LOG 2>&1
echo "Job $SLURM_JOB_ID exitcode $SLURM_JOB_EXIT_CODE2" >> $LOG 2>&1
exitcode=`echo $SLURM_JOB_EXIT_CODE2|awk '{split($0, a, ":"); print a[1]}'` >> $LOG 2>&1
if [ "$exitcode" == "8" ]; then
echo "Found REQUEUE_EXIT_CODE: $REQUEUE_EXIT_CODE" >> $LOG 2>&1
scontrol requeuehold state=SpecialExit $SLURM_JOB_ID >> $LOG 2>&1
echo $? >> $LOG 2>&1
else
echo "Job $SLURM_JOB_ID exit all right" >> $LOG 2>&1
fi
echo "Done `date`" >> $LOG 2>&1
exit 0
</pre>
<p>
Using the exitme script as an example, we have it exit with a value of 8 on
the first run, then when it gets requeued in hold with SpecialExit state
we touch the file /tmp/myfile, then release the job which will finish
in a COMPLETE state.
</p>
<p><a id="cpu_freq"><b>Why is Slurm unable to set the CPU frequency for
jobs?</b></a><br>
First check that Slurm is configured to bind jobs to specific CPUs by
making sure that TaskPlugin is configured to either affinity or cgroup.
Next check that your processor is configured to permit frequency
control by examining the values in the file
<i>/sys/devices/system/cpu/cpu0/cpufreq</i> where "cpu0" represents a CPU ID 0.
Of particular interest is the file <i>scaling_available_governors</i>,
which identifies the CPU governors available.
If "userspace" is not an available CPU governor, this may well be due to the
<i>intel_pstate</i> driver being installed.
Information about disabling the <i>intel_pstate</i> driver is available
from<br>
<a href="https://bugzilla.kernel.org/show_bug.cgi?id=57141">
https://bugzilla.kernel.org/show_bug.cgi?id=57141</a> and<br>
<a href="http://unix.stackexchange.com/questions/121410/setting-cpu-governor-to-on-demand-or-conservative">
http://unix.stackexchange.com/questions/121410/setting-cpu-governor-to-on-demand-or-conservative</a>.</p>
<p><a id="salloc_default_command"><b>Can the salloc command be configured to
launch a shell on a node in the job's allocation?</b></a><br>
Yes, just set "use_interactive_step" as part of the LaunchParameters
configuration option in slurm.conf.</p>
<p><a id="tmpfs_jobcontainer"><b>How can I set up a private /tmp and /dev/shm for
jobs on my machine?</b></a>
<br/>
Tmpfs job container plugin can be used by including
<i>JobContainerType=job_container/tmpfs</i>
in your slurm.conf file. It additionally requires a
<a href="job_container.conf.html">job_container.conf</a> file to be
set up which is further described in the man page.
Tmpfs plugin creates a private mount namespace inside of which it mounts a
private /tmp to a location that is configured in job_container.conf. The basepath
is used to construct the mount path, by creating a job specific directory inside it
and mounting /tmp to it. Since all the mounts are created inside of a mount
namespace which is private, they are only visible inside the job. Hence this
proves to be a useful solution for jobs that are on shared nodes, since each
job can only view mounts created in their own mount namespace. A private
/dev/shm is also mounted to isolate it between different jobs.</p>
<p>
Mount namespace construction also happens before job's spank environment is
set up. Hence all spank related job steps will view only private /tmp the
plugin creates. The plugin also provides an optional initialization script that
is invoked before the job's namespace is constructed. This can be useful for
any site specific customization that may be necessary.</p>
<pre>
parallels@linux_vb:~$ echo $SLURM_JOB_ID
7
parallels@linux_vb:~$ findmnt -o+PROPAGATION | grep /tmp
└─/tmp /dev/sda1[/storage/7/.7] ext4 rw,relatime,errors=remount-ro,data=ordered private
</pre>
<p>In the example above, <i>BasePath</i> points to /storage and a slurm job with
job id 7 is set up to mount /tmp on /storage/7/.7. When user from inside a job
tries to look up mounts, they can see that their /tmp is mounted. However
they are prevented from mistakenly accessing the backing directory directly.</p>
<pre>
parallels@linux_vb:~$ cd /storage/7/
bash: cd: /storage/7/: Permission denied
</pre>
<p>They are allowed to access (read/write) /tmp only.</p>
<p>
Additionally pam_slurm_adopt has also been extended to support this functionality.
If a user starts an ssh session which is managed by pam_slurm_adopt, then
the user's process joins the namespace that is constructed by tmpfs plugin.
Hence in ssh sessions, user has the same view of /tmp and /dev/shm as
their job. This functionality is enabled by default in pam_slurm_adopt
but can be disabled explicitly by appending <i>join_container=false</i> as shown:</p>
<pre>
account sufficient pam_slurm_adopt.so join_container=false
</pre>
<p><a id="sysv_memory"><b>How do I configure Slurm to work with System V IPC
enabled applications?</b></a><br>
Slurm is generally agnostic to
<a href="http://man7.org/linux/man-pages/man2/ipc.2.html">
System V IPC</a> (a.k.a. "sysv ipc" in the Linux kernel).
Memory accounting of processes using sysv ipc changes depending on the value
of <a href="https://www.kernel.org/doc/Documentation/sysctl/kernel.txt">
sysctl kernel.shm_rmid_forced</a> (added in Linux kernel 3.1):
</p>
<ul>
<li>shm_rmid_forced = 1
<br>
Forces all shared memory usage of processes to be accounted and reported by the
kernel to Slurm. This breaks the separate namespace of sysv ipc and may cause
unexpected application issues without careful planning. Processes that share
the same sysv ipc namespaces across jobs may end up getting OOM killed when
another job ends and their allocation percentage increases.
</li>
<li>shm_rmid_forced = 0 (default in most Linux distributions)
<br>
System V memory usage will not be reported by Slurm for jobs.
It is generally suggested to configure the
<a href="https://www.kernel.org/doc/Documentation/sysctl/kernel.txt">
sysctl kernel.shmmax</a> parameter. The value of kernel.shmmax times the
maximum number of job processes should be deducted from each node's
configured RealMemory in your slurm.conf. Most Linux distributions set the
default to what is effectively unlimited, which can cause the OOM killer
to activate for unrelated new jobs or even for the slurmd process. If any
processes use sysv memory mechanisms, the Linux kernel OOM killer will never
be able to free the used memory. A Slurm job epilog script will be needed to
free any of the user memory. Setting kernel.shmmax=0 will disable sysv ipc
memory allocations but may cause application issues.
</li>
</ul>
<h3>General Troubleshooting</h3>
<p><a id="core_dump"><b>If a Slurm daemon core dumps, where can I find the
core file?</b></a><br>
If <i>slurmctld</i> is started with the -D option, then the core file will be
written to the current working directory. If <i>SlurmctldLogFile</i> is an
absolute path, the core file will be written to this directory. Otherwise the
core file will be written to the <i>StateSaveLocation</i>, or "/var/tmp/" as a
last resort.<br>
SlurmUser must have write permission on the directories. If none of the above
directories have write permission for SlurmUser, no core file will be produced.</p>
<p>If <i>slurmd</i> is started with the -D option, then the core file will also be
written to the current working directory. If <i>SlurmdLogFile</i> is an
absolute path, the core file will be written to the this directory.
Otherwise the core file will be written to the <i>SlurmdSpoolDir</i>, or
"/var/tmp/" as a last resort.<br>
If none of the above directories can be written, no core file will be produced.
</p>
<p>For <i>slurmstepd</i>, the core file will depend upon when the failure
occurs. If it is running in a privileged phase, it will be in the same location
as that described above for the slurmd daemon. If it is running in an
unprivileged phase, it will be in the spawned job's working directory.</p>
<p>Nevertheless, in some operating systems this can vary:</p>
<ul>
<li>
I.e. in RHEL the event
may be captured by abrt daemon and generated in the defined abrt configured
dump location (i.e. /var/spool/abrt).
</li>
</ul>
<p>Normally, distributions need some more tweaking in order to allow the core
files to be generated correctly.</p>
<p>slurmstepd uses the setuid() (set user ID) function to escalate
privileges. It is possible that in certain systems and for security policies,
this causes the core files not to be generated.
<br>To allow the generation in such systems you usually must enable the
suid_dumpable kernel parameter:</p>
Set:<br>
/proc/sys/fs/suid_dumpable to 2<br>
or<br>
sysctl fs.suid_dumpable=2<br><br>
or set it permanently in sysctl.conf<br>
fs.suid_dumpable = 2<br><br>
<p>The value of 2, "suidsafe", makes any binary which normally not be dumped is
dumped readable by root only.<br>This allows the end user to remove such a dump
but not access it directly. For security reasons core dumps in this mode will
not overwrite one another or other files.<br> This mode is appropriate when
administrators are attempting to debug problems in a normal environment.</p>
<p>Then you must also set the core pattern to an absolute pathname:</p>
<pre>sysctl kernel.core_pattern=/tmp/core.%e.%p</pre>
<p>We recommend reading your distribution's documentation about the
configuration of these parameters.</p>
<p>It is also usually needed to configure the system core limits, since it can be
set to 0.</p>
<pre>
$ grep core /etc/security/limits.conf
# - core - limits the core file size (KB)
* hard core unlimited
* soft core unlimited
</pre>
<p>In some systems it is not enough to set a hard limit, you must set also a
soft limit.</p>
<p>Also, for generating the limits in userspace, the
<i>PropagateResourceLimits=CORE</i> parameter in slurm.conf could be needed.</p>
<p>Be also sure to give SlurmUser the appropriate permissions to write in the
core location directories.</p>
<p><b>NOTE</b>: On a diskless node depending on the core_pattern or if
/var/spool/abrt is pointing to an in-memory filespace like tmpfs, if the job
caused an OOM, then the generation of the core may fill up your machine's
memory and hang it. It is encouraged then to make coredumps go to a persistent
storage. Be careful of multiple nodes writing a core dump to a shared
filesystem since it may significantly impact it.
</p>
<b>Other exceptions:</b>
<p>On Centos 6, also set "ProcessUnpackaged = yes" in the file
/etc/abrt/abrt-action-save-package-data.conf.
<p>On RHEL6, also set "DAEMON_COREFILE_LIMIT=unlimited" in the file
rc.d/init.d/functions.</p>
<p>On a SELinux enabled system, or on a distribution with similar security
system, get sure it is allowing to dump cores:</p>
<pre>$ getsebool allow_daemons_dump_core</pre>
<p>coredumpctl can also give valuable information:</p>
<pre>$ coredumpctl info</pre>
<p><a id="backtrace"><b>How can I get a backtrace from a core file?</b></a><br>
If you do have a crash that generates a core file, you will want to get a
backtrace of that crash to send to SchedMD for evaluation.</p>
<p><b>NOTE</b>: Core files must be analyzed by the same binary that was used
when they were generated. Compile time differences make it almost impossible
for SchedMD to use a core file from a different system. You should always
send a backtrace rather than a core file when submitting a support request.</p>
<p>In order to generate a backtrace you must use <i>gdb</i>, specify the
path to the <i>slurm*</i> binary that generated the crash, and specify the
path to the core file. Below is an example of how to get a backtrace of a
core file generated by <i>slurmctld</i>:
<pre>
gdb -ex 't a a bt full' -batch /path/to/slurmctld &lt;core_file&gt;
</pre>
</p>
<p>You can also use <i>gdb</i> to generate a backtrace without a core file.
This can be useful if you are experiencing a crash on startup and aren't
getting a core file for some reason. You would want to start the binary
from inside of <i>gdb</i>, wait for it to crash, and generate the backtrace.
Below is an example, using <i>slurmctld</i> as the example binary:
<pre>
(gdb) /path/to/slurmctld
(gdb) set print pretty
(gdb) r -d
(gdb) t a a bt full
</pre>
</p>
<p>You may also need to get a backtrace of a running daemon if it is stuck
or hung. To do this you would point <i>gdb</i> at the running binary and
have it generate the backtrace. Below is an example, again using
<i>slurmctld</i> as the example:
<pre>
gdb -ex 't a a bt' -batch -p $(pidof slurmctld)
</pre>
</p>
<h3>Error Messages</h3>
<p><a id="inc_plugin"><b>&quot;Cannot resolve X plugin operations&quot; on
daemon startup</b></a><br>
This means that symbols expected in the plugin were
not found by the daemon. This typically happens when the
plugin was built or installed improperly or the configuration
file is telling the plugin to use an old plugin (say from the
previous version of Slurm). Restart the daemon in verbose mode
for more information (e.g. &quot;slurmctld -Dvvvvv&quot;).</p>
<p><a id="credential_replayed"><b>&quot;Credential replayed&quot; in
<i>SlurmdLogFile</i></b></a><br>
This error is indicative of the <i>slurmd</i> daemon not being able
to respond to job initiation requests from the <i>srun</i> command
in a timely fashion (a few seconds).
<i>Srun</i> responds by resending the job initiation request.
When the <i>slurmd</i> daemon finally starts to respond, it
processes both requests.
The second request is rejected and the event is logged with
the "credential replayed" error.
If you check the <i>SlurmdLogFile</i> and <i>SlurmctldLogFile</i>,
you should see signs of the <i>slurmd</i> daemon's non-responsiveness.
A variety of factors can be responsible for this problem
including</p>
<ul>
<li>Diskless nodes encountering network problems</li>
<li>Very slow Network Information Service (NIS)</li>
<li>The <i>Prolog</i> script taking a long time to complete</li>
</ul>
<p>Configure <i>MessageTimeout</i> in slurm.conf to a value higher than the
default 10 seconds.</p>
<p><a id="cred_invalid"><b>&quot;Invalid job credential&quot;</b></a><br>
This error is indicative of Slurm's job credential files being inconsistent across
the cluster. All nodes in the cluster must have the matching public and private
keys as defined by <b>JobCredPrivateKey</b> and <b>JobCredPublicKey</b> in the
Slurm configuration file <b>slurm.conf</b>.</p>
<p><a id="cred_replay"><b>&quot;Task launch failed on node ... Job credential
replayed&quot;</b></a><br>
This error indicates that a job credential generated by the slurmctld daemon
corresponds to a job that the slurmd daemon has already revoked.
The slurmctld daemon selects job ID values based upon the configured
value of <b>FirstJobId</b> (the default value is 1) and each job gets
a value one larger than the previous job.
On job termination, the slurmctld daemon notifies the slurmd on each
allocated node that all processes associated with that job should be
terminated.
The slurmd daemon maintains a list of the jobs which have already been
terminated to avoid replay of task launch requests.
If the slurmctld daemon is cold-started (with the &quot;-c&quot; option
or &quot;/etc/init.d/slurm startclean&quot;), it starts job ID values
over based upon <b>FirstJobId</b>.
If the slurmd is not also cold-started, it will reject job launch requests
for jobs that it considers terminated.
This solution to this problem is to cold-start all slurmd daemons whenever
the slurmctld daemon is cold-started.</p>
<p><a id="file_limit"><b>&quot;Unable to accept new connection: Too many open
files&quot;</b></a><br>
The srun command automatically increases its open file limit to
the hard limit in order to process all of the standard input and output
connections to the launched tasks. It is recommended that you set the
open file hard limit to 8192 across the cluster.</p>
<p><a id="slurmd_log"><b><i>SlurmdDebug</i> fails to log job step information
at the appropriate level</b></a><br>
There are two programs involved here. One is <b>slurmd</b>, which is
a persistent daemon running at the desired debug level. The second
program is <b>slurmstepd</b>, which executes the user job and its
debug level is controlled by the user. Submitting the job with
an option of <i>--debug=#</i> will result in the desired level of
detail being logged in the <i>SlurmdLogFile</i> plus the output
of the program.</p>
<p><a id="batch_lost"><b>&quot;Batch JobId=# missing from batch node &lt;node&gt;
(not found BatchStartTime after startup)&quot;</b></a><br>
A shell is launched on node zero of a job's allocation to execute
the submitted program. The <i>slurmd</i> daemon executing on each compute
node will periodically report to the <i>slurmctld</i> what programs it
is executing. If a batch program is expected to be running on some
node (i.e. node zero of the job's allocation) and is not found, the
message above will be logged and the job canceled. This typically is
associated with exhausting memory on the node or some other critical
failure that cannot be recovered from.</p>
<p><a id="opencl_pmix"><b>Multi-Instance GPU not working with Slurm and PMIx;
GPUs are &quot;In use by another client&quot;</b></a><br/>
PMIx uses the <b>hwloc API</b> for different purposes, including
<i>OS device</i> features like querying sysfs folders (such as
<i>/sys/class/net</i> and <i>/sys/class/infiniband</i>) to get the names of
Infiniband HCAs. With the above mentioned features, hwloc defaults to
querying the OpenCL devices, which creates handles on <i>/dev/nvidia*</i> files.
These handles are kept by slurmstepd and will result in the following error
inside a job:
</p>
<pre>
$ nvidia-smi mig --id 1 --create-gpu-instance FOO,FOO --default-compute-instance
Unable to create a GPU instance on GPU 1 using profile FOO: In use by another client
</pre>
<p>
In order to use Multi-Instance GPUs with Slurm and PMIx you can instruct hwloc
to not query OpenCL devices by setting the
<span class="commandline">HWLOC_COMPONENTS=-opencl</span> environment
variable for slurmd, i.e. setting this variable in systemd unit file for slurmd.
</p>
<p><a id="accept_again"><b>&quot;srun: error: Unable to accept connection:
Resources temporarily unavailable&quot;</b></a><br>
This has been reported on some larger clusters running SUSE Linux when
a user's resource limits are reached. You may need to increase limits
for locked memory and stack size to resolve this problem.</p>
<p><a id="large_time"><b>&quot;Warning: Note very large processing time&quot;
in <i>SlurmctldLogFile</i></b></a><br>
This error is indicative of some operation taking an unexpectedly
long time to complete, over one second to be specific.
Setting the value of the <i>SlurmctldDebug</i> configuration parameter
to <i>debug2</i> or higher should identify which operation(s) are
experiencing long delays.
This message typically indicates long delays in file system access
(writing state information or getting user information).
Another possibility is that the node on which the slurmctld
daemon executes has exhausted memory and is paging.
Try running the program <i>top</i> to check for this possibility.</p>
<p><a id="mysql_duplicate"><b>&quot;Duplicate entry&quot; causes slurmdbd to
fail</b></a><br>
This problem has been rarely observed with MySQL, but not MariaDB.
The root cause of the failure seems to be reaching the upper limit on the auto increment field.
Upgrading to MariaDB is recommended.
If that is not possible then: backup the database, remove the duplicate record(s),
and restart the slurmdbd daemon as shown below.</p>
<pre>
$ slurmdbd -Dvv
...
slurmdbd: debug: Table "cray_job_table" has changed. Updating...
slurmdbd: error: mysql_query failed: 1062 Duplicate entry '2711-1478734628' for key 'id_job'
...
$ mysqldump --single-transaction -u&lt;user&gt; -p&lt;user&gt; slurm_acct_db &gt;/tmp/slurm_db_backup.sql
$ mysql
mysql> use slurm_acct_db;
mysql> delete from cray_job_table where id_job='2711-1478734628';
mysql> quit;
Bye
</pre>
<p>If necessary, you can edit the database dump and recreate the database as
shown below.</p>
<pre>
$ mysql
mysql> drop database slurm_acct_db;
mysql> create database slurm_acct_db;
mysql> quit;
Bye
$ mysql -u&lt;user&gt; -p&lt;user&gt; &lt;/tmp/slurm_db_backup.sql
</pre>
<p><a id="json_serializer"><b>&quot;Unable to find plugin: serializer/json&quot;
</b></a><br/>
Several parts of Slurm have swapped to using our centralized serializer
code. JSON or YAML plugins are only required if one of the functions that
require it is executed. If one of the functions is executed it will fail to
create the JSON/YAML output and the linker will fail with the following error:
</p>
<pre>
slurmctld: fatal: Unable to find plugin: serializer/json
</pre>
<p>
In most cases, these are required for new functionality added after Slurm-20.02.
However, with each release, we have been adding more places that use the
serializer plugins. Because the list is evolving we do not plan on listing all
the commands that require the plugins but will instead provide the error
(shown above). To correct the issue, please make sure that Slurm is configured,
compiled and installed with the relevant JSON or YAML library (or preferably
both). Configure can be made to explicitly request these libraries:
</p>
<pre>
./configure --with-json=PATH --with-yaml=PATH $@
</pre>
<p>
Most distributions include packages to make installation relatively easy.
Please make sure to install the 'dev' or 'devel' packages along with the
library packages. We also provide explicit instructions on how to install from
source: <a href="related_software.html#yaml">libyaml</a> and
<a href="related_software.html#jwt">libjwt</a>.
</p>
<h3>Third Party Integrations</h3>
<p><a id="globus"><b>Can Slurm be used with Globus?</b></a><br>
Yes. Build and install Slurm's Torque/PBS command wrappers along with
the Perl APIs from Slurm's <i>contribs</i> directory and configure
<a href="http://www-unix.globus.org/">Globus</a> to use those PBS commands.
Note there are RPMs available for both of these packages, named
<i>torque</i> and <i>perlapi</i> respectively.
<p><a id="totalview"><b>How can TotalView be configured to operate with
Slurm?</b></a><br>
The following lines should also be added to the global <i>.tvdrc</i> file
for TotalView to operate with Slurm:</p>
<pre>
# Enable debug server bulk launch: Checked
dset -set_as_default TV::bulk_launch_enabled true
# Command:
# Beginning with TV 7X.1, TV supports Slurm and %J.
# Specify --mem-per-cpu=0 in case Slurm configured with default memory
# value and we want TotalView to share the job's memory limit without
# consuming any of the job's memory so as to block other job steps.
dset -set_as_default TV::bulk_launch_string {srun --mem-per-cpu=0 -N%N -n%N -w`awk -F. 'BEGIN {ORS=","} {if (NR==%N) ORS=""; print $1}' %t1` -l --input=none %B/tvdsvr%K -callback_host %H -callback_ports %L -set_pws %P -verbosity %V -working_directory %D %F}
# Temp File 1 Prototype:
# Host Lines:
# Slurm NodeNames need to be unadorned hostnames. In case %R returns
# fully qualified hostnames, list the hostnames in %t1 here, and use
# awk in the launch string above to strip away domain name suffixes.
dset -set_as_default TV::bulk_launch_tmpfile1_host_lines {%R}
</pre>
<!-- OLD FORMAT
dset TV::parallel_configs {
name: Slurm;
description: Slurm;
starter: srun %s %p %a;
style: manager_process;
tasks_option: -n;
nodes_option: -N;
env: ;
force_env: false;
}
!-->
<p style="text-align:center;">Last modified 09 May 2025</p>
<!--#include virtual="footer.txt"-->