blob: dfe27149745591fed73f1ca52d111b9a2b3be700 [file] [log] [blame]
<!--#include virtual="header.txt"-->
<h1>High Throughput Computing Administration Guide</h1>
<p>This document contains Slurm administrator information specifically
for high throughput computing, namely the execution of many short jobs.
Getting optimal performance for high throughput computing does require
some tuning and this document should help you off to a good start.
A working knowledge of Slurm should be considered a prerequisite
for this material.</p>
<h2 id="performance">Performance Results
<a class="slurm_link" href="#performance"></a>
</h2>
<p>Slurm has also been validated to execute 500 simple batch jobs per second
on a sustained basis with short bursts of activity at a much higher level.
Actual performance depends upon the jobs to be executed plus the hardware and
configuration used.</p>
<h2 id="sys_config">System configuration
<a class="slurm_link" href="#sys_config"></a>
</h2>
<p>Several system configuration parameters may require modification to support a large number
of open files and TCP connections with large bursts of messages. Changes can
be made using the <b>/etc/rc.d/rc.local</b> or <b>/etc/sysctl.conf</b>
script to preserve changes after reboot. In either case, you can write values
directly into these files
(e.g. <i>"echo 32832 &gt; /proc/sys/fs/file-max"</i>).</p>
<ul>
<li><b>/proc/sys/fs/file-max</b>:
The maximum number of concurrently open files.
We recommend a limit of at least 32,832.</li>
<li><b>/proc/sys/net/ipv4/tcp_max_syn_backlog</b>:
The maximum number of SYN requests to keep in memory that we have yet to get
the third packet in a 3-way handshake from.
The default value is 1024 for systems with more than 128Mb of memory, and 128
for low memory machines. If server suffers of overload, try to increase this
number.</li>
<li><b>/proc/sys/net/ipv4/tcp_syncookies</b>:
Used to send out <i>syncookies</i> to hosts when the kernels syn backlog queue
for a specific socket is overflowed.
The default value is 0, which disables this functionality.
Set the value to 1.
<li><b>/proc/sys/net/ipv4/tcp_synack_retries</b>:
How many times to retransmit the SYN,ACK reply to an SYN request.
In other words, this tells the system how many times to try to establish a
passive TCP connection that was started by another host.
This variable takes an integer value, but should under no circumstances be
larger than 255.
Each retransmission will take approximately 30 to 40 seconds.
The default value of 5, which results in a timeout of passive TCP connections
of approximately 180 seconds and is generally satisfactory.
<li><b>/proc/sys/net/core/somaxconn</b>:
Limit of socket listen() backlog, known in userspace as SOMAXCONN. Defaults to
128. The value should be raised substantially to support bursts of request.
For example, to support a burst of 1024 requests, set somaxconn to 1024.</li>
<li><b>/proc/sys/net/ipv4/ip_local_port_range</b>:
Identify the ephemeral ports available, which are used for many Slurm
communications. The value may be raised to support a high volume of
communications.
For example, write the value "32768 65535" into the ip_local_port_range file
in order to make that range of ports available.</li>
</ul>
<p>The transmit queue length (<b>txqueuelen</b>) may also need to be modified
using the ifconfig command. A value of 4096 has been found to work well for one
site with a very large cluster
(e.g. <i>"ifconfig <interface> txqueuelen 4096"</i>).</p>
<h2 id="munge_config">Munge configuration
<a class="slurm_link" href="#munge_config"></a>
</h2>
<p>By default the Munge daemon runs with two threads, but a higher thread count
can improve its throughput. We suggest starting the Munge daemon with ten
threads for high throughput support (e.g. <i>"munged --num-threads 10"</i>).</p>
<h2 id="user_limits">User limits
<a class="slurm_link" href="#user_limits"></a>
</h2>
<p>The <b>ulimit</b> values in effect for the <b>slurmctld</b> daemon should
be set quite high for memory size, open file count and stack size.</p>
<h2 id="slurm_config">Slurm Configuration
<a class="slurm_link" href="#slurm_config"></a>
</h2>
<p>Several Slurm configuration parameters should be adjusted to
reflect the needs of high throughput computing. The changes described below
will not be possible in all environments, but these are the configuration
options that you may want to consider for higher throughput.</p>
<ul>
<li><b>AccountingStorageType</b>:
Disabling storing accounting records by not setting this plugin.
Turning accounting off provides minimal improvement in performance.
If using the SlurmDBD increased speedup can be achieved by setting the
CommitDelay option in the <a href=slurmdbd.conf.html>slurmdbd.conf</a></li>
<li><b>JobAcctGatherType</b>:
Disabling the collection of job accounting information will improve job
throughput. Disable collection of accounting by using the
<i>jobacct_gather/none</i> plugin.</li>
<li><b>JobCompType</b>:
Disabling recording of job completion information will improve job
throughput. Disable recording of job completion information by using the
<i>jobcomp/none</i> plugin.</li>
<li><b>JobSubmitPlugins</b>:
Use of a lua job submit plugin is not recommended. slurmctld runs this
script while holding internal locks, and only a single copy of this script
can run at a time. This blocks most concurrency in slurmctld. Therefore, we
do not recommend using it in a high throughput environment.</li>
<li><b>MaxJobCount</b>:
Controls how many jobs may be in the <b>slurmctld</b> daemon records at any
point in time (pending, running, suspended or completed[temporarily]).
The default value is 10,000.</li>
<li><b>MessageTimeout</b>:
Controls how long to wait for a response to messages.
The default value is 10 seconds.
While the <b>slurmctld</b> daemon is highly threaded, its responsiveness
is load dependent. This value might need to be increased somewhat.</li>
<li><b>MinJobAge</b>:
Controls how soon the record of a completed job can be purged from the
<b>slurmctld</b> memory and thus not visible using the <b>squeue</b> command.
The record of jobs run will be preserved in accounting records and logs.
The default value is 300 seconds. The value should be reduced to a few
seconds if possible. Use of accounting records for older jobs can increase
the job throughput rate compared with retaining old jobs in the memory of
the slurmctld daemon.</li>
<li><b>PriorityType</b>:
The <i>priority/basic</i> is considerably faster than other options, but
schedules jobs only on a First In First Out (FIFO) basis.</li>
<li><b>PrologSlurmctld/EpilogSlurmctld</b>:
Neither of these is recommended for a high throughput environment. When they
are enabled a separate slurmctld thread has to be created for every job start
(or task for a job array).
Current architecture requires acquisition of a job write lock in every thread,
which is a costly operation that severely limits scheduler throughput.
<li><b>SchedulerParameters</b>:
Many scheduling parameters are available.
<ul>
<li>Setting option <b>batch_sched_delay</b> will control how long the
scheduling of batch jobs can be delayed. This effects only batch jobs.
For example, if many jobs are submitted each second, the overhead of
trying to schedule each one will adversely impact the rate at which jobs
can be submitted. The default value is 3 seconds.</li>
<li>Setting option <b>defer</b> will avoid attempting to schedule each job
individually at job submit time, but defer it until a later time when
scheduling multiple jobs simultaneously may be possible.
This option may improve system responsiveness when large numbers of jobs
(many hundreds) are submitted at the same time, but it will delay the
initiation time of individual jobs.</li>
<li>Setting the <b>defer_batch</b> option is similar to the <b>defer</b>
option, as explained above. The difference is that <b>defer_batch</b> will
allow interactive jobs to be started immediately, but jobs submitted with
sbatch will be deferred to allow multiple jobs to accumulate and be scheduled
at once.</li>
<li><b>sched_min_interval</b> is yet another configuration parameter to control
how frequently the scheduling logic runs. It can still be triggered on each
job submit, job termination, or other state change which could permit a new
job to be started. However that triggering does not cause the scheduling logic
to be started immediately, but only within the configured <b>sched_interval</b>.
For example, if sched_min_interval=2000000 (microseconds) and 100 jobs are submitted
within a 2 second time window, then the scheduling logic will be executed one time
rather than 100 times if sched_min_interval was set to 0 (no delay).</li>
<li>Besides controlling how frequently the scheduling logic is executed, the
<b>default_queue_depth</b> configuration parameter controls how many jobs are
considered to be started in each scheduler iteration. The default value of
default_queue_depth is 100 (jobs), which should be fine in most cases.</li>
<li>The <i>sched/backfill</i> plugin has relatively high overhead if used with
large numbers of job. Configuring <b>bf_max_job_test</b> to a modest size (say 100
jobs or less) and <b>bf_interval</b> to 30 seconds or more will limit the
overhead of backfill scheduling (<b>NOTE</b>: the default values are fine for
both of these parameters). Other backfill options available for tuning backfill
scheduling include <b>bf_max_job_user</b>, <b>bf_resolution</b> and
<b>bf_window</b>. See the slurm.conf man page for details.</li>
<li>A set of scheduling parameters currently used for running hundreds of jobs
per second on a sustained basis on one cluster follows. Note that every
environment is different and this set of parameters will not work well
in every case, but it may serve as a good starting point.</li>
<ul>
<li>batch_sched_delay=20</li>
<li>bf_continue</li>
<li>bf_interval=300</li>
<li>bf_min_age_reserve=10800</li>
<li>bf_resolution=600</li>
<li>bf_yield_interval=1000000</li>
<li>partition_job_depth=500</li>
<li>sched_max_job_start=200</li>
<li>sched_min_interval=2000000</li>
</ul>
</ul></li>
<li><b>SlurmctldParameters</b>:
Many slurmctld daemon parameters are available.
<ul>
<li>Increasing <b>conmgr_max_connections</b> will allow slurmctld to accept
more connections at once to avoid connect() timeouts during times of high load
but not necessarily read or write timeouts. The trade off is that slurmctld will
use more memory as each connection reserves memory to buffer inbound and
outbound data along with the connection state. <b>conmgr_max_connections</b>
should at least be the number of hardware CPU threads available but less than
<code>sysctl net.nf_conntrack_max</code> and
<code>sysctl net.core.somaxconn</code>. Enabling
<code>sysctl net.ipv4.tcp_syncookies=1</code> is also suggested to
allow the kernel to better manage larger bursts of incoming sockets.
When modifying this parameter, you should monitor for relative changes in
<code>sdiag</code>'s output. The <i>ave_time</i> field section under <i>Remote
Procedure Call statistics</i> should be given special attention as changes to
that can have a dramatic impact on overall response times. Increasing
<b>conmgr_max_connections</b> too much could cause an <i>Out of Memory</i>
event which will cause slurmctld to crash, potentially losing jobs and
accounting. Sites are advised to try changing <b>MessageTimeout</b> and
<b>TCPTimeout</b> before changing the <b>conmgr_max_connections</b> parameter.
</li>
<li>
The <b>conmgr_threads</b> option controls the size of the thread pool that is
used to process communications. Threads are used as needed to handle I/O or to
process incoming RPCs and generate replies. The trade off is that slurmctld will
use more memory for each additional thread. Increasing thread counts will also
cause increased kernel scheduler contention when there are more threads than
available hardware CPUs, increasing the potential for thread starvation. While
processing incoming RPC requests, slurmctld usually has to obtain one or
more of the global slurmctld locks. Each thread attempting to obtain a lock can
cause increased contention with the scheduler threads. Lock contention will
result in the job scheduler running slower or with non-neglible delays.
Sites wishing for more RPC throughput can increase <b>conmgr_threads</b> from
the defaults, while sites wishing to prioritize scheduler threads can decrease
the thread count. Sites are advised to monitor for changes in
<code>sdiag</code>'s job start statistics when changing this parameter.
<b>conmgr_threads</b> should at least be between 2-4 times the number of
hardware CPU threads available to slurmctld daemon due to most RPC processing
needing to wait on global locks. Increasing <b>conmgr_threads</b> too much
could cause an <i>Out of Memory</i> event which will cause slurmctld to
crash, potentially losing jobs and accounting.
</li>
</ul>
<li><b>SchedulerType</b>:
If most jobs are short lived then use of the <i>sched/builtin</i> plugin is
recommended. This manages a queue of jobs on a First-In-First-Out (FIFO) basis
and eliminates logic used to sort the queue by priority.
<li><b>SlurmctldDebug</b>:
More detailed logging will decrease system throughput. Set to <i>error</i> or
<i>info</i> for regular operations with high throughput workload.</li>
<li><b>SlurmctldPort</b>:
It is desirable to configure the <b>slurmctld</b> daemon to accept incoming
messages on more than one port in order to avoid having incoming messages
discarded by the operating system due to exceeding the SOMAXCONN limit
described above. Using between two and ten ports is suggested when large
numbers of simultaneous requests are to be supported.</li>
<li><b>SlurmdDebug</b>:
More detailed logging will decrease system throughput. Set to <i>error</i> or
<i>info</i> for regular operations with high throughput workload.</li>
<li><b>SlurmdLogFile</b>:
Writing to local storage is recommended.</li>
<li>The ability to do RPC rate limiting on a per-user basis is a new feature
with 23.02. It acts as a virtual bucket of tokens that users consume with
Remote Procedure Calls. This allows users to submit a large number of requests
in a short period of time, but not a sustained high rate of requests that
would add stress to the scheduler. You can define the maximum number of tokens
with <b>rl_bucket_size</b>, the rate at which new tokens are added with
<b>rl_refill_rate</b>, the frequency with which tokens are refilled with
<b>rl_refill_period</b> and the number of entities to track with
<b>rl_table_size</b>. It is enabled with <b>rl_enable</b>.</li>
<li><b>Other</b>: Configure logging, accounting and other overhead to a minimum
appropriate for your environment.</li>
</ul>
<h2 id="slurmdbd_config">SlurmDBD Configuration
<a class="slurm_link" href="#slurmdbd_config"></a>
</h2>
<p>Turning accounting off provides a minimal improvement in performance.
If using SlurmDBD increased speedup can be achieved by setting the CommitDelay
option in the <a href=slurmdbd.conf.html>slurmdbd.conf</a> to introduce a
delay between the time slurmdbd receives a connection from slurmctld and
when it commits the information to the database. This allows multiple
requests to be accumulated and reduces the number of commit requests
to the database.</p>
<p>You might also consider setting the '<i>Purge*</i>' options in your
slurmdbd.conf to clear out old Data. A Typical configuration would
look like this...</p>
<ul>
<li><b>PurgeEventAfter</b>=12months</li>
<li><b>PurgeJobAfter</b>=12months</li>
<li><b>PurgeResvAfter</b>=2months</li>
<li><b>PurgeStepAfter</b>=2months</li>
<li><b>PurgeSuspendAfter</b>=1month</li>
<li><b>PurgeTXNAfter</b>=12months</li>
<li><b>PurgeUsageAfter</b>=12months</li>
</ul>
<p style="text-align:center;">Last modified 13 March 2025</p>
<!--#include virtual="footer.txt"-->