blob: 39958643bcc167f749611b11c18f682f8162dc15 [file] [log] [blame]
<!--#include virtual="header.txt"-->
<h1>Depth-Oblivious Fair-share Factor</h1>
<h2 id="contents">Contents<a class="slurm_link" href="#contents"></a></h2>
<ul>
<li><a href=#intro>Introduction</a></li>
<li><a href=#fairshare>Depth-Oblivious Fair-Share Formula</a></li>
<li><a href=#ratio>The Effective Usage Ratio Under an Account Hierarchy</a></li>
<li><a href=#config>Configuration</a></li>
</ul>
<!-------------------------------------------------------------------------->
<h2 id="intro">Introduction<a class="slurm_link" href="#intro"></a></h2>
<p>The depth-oblivious fair-share factor is a variant of the default
fair-share factor which increases usable priority ranges and improves
fairness between accounts in deep and/or irregular hierarchies. The
reader is assumed to be familiar with the priority/multifactor plugin
and only the specifics of the depth-oblivious factor are documented
here</p>
<!-------------------------------------------------------------------------->
<h2 id="fairshare">Depth-Oblivious Fair-Share Formula
<a class="slurm_link" href="#fairshare"></a>
</h2>
<P> The main formula for calculating the fair-share factor of an account is:</P>
<PRE>
F = 2^(-R)
</PRE>
<P>where:</P>
<DL compact>
<DT> F
<DD> is the fair-share factor
<DT> R
<DD> is the effective usage ratio of the account
</DL>
<P> This formula resembles the original fair-share formula, and
produces the same result for an account at the first level of the tree
(under root). Indeed, for first-level accounts, the effective usage
ratio R is equal to the usage ratio r defined as: </P>
<PRE>
r = U/S
</PRE>
<P>where:</P>
<DL compact>
<DT> S
<DD> is the normalized shares
<DT> U
<DD> is the normalized usage factoring in half-life decay
</DL>
<P> which is the same as the original formula. </P>
<h2 id="ratio">The Effective Usage Ratio Under an Account Hierarchy
<a class="slurm_link" href="#ratio"></a>
</h2>
<P> The generalized formula for R is a bit more complex. It involves a
local usage ratio r<sub>l</sub>:</P>
<PRE>
r<sub>l</sub> = r / (U<sub>all_siblings</sub>/S<sub>all_siblings</sub>)
</PRE>
<P> which is the ratio between the usage ratio of an account, and the
total usage ratio of all the siblings at his level including
itself. For example, assuming that all the children of an account have
used in total two times their combined shares (which equal the shares
of the parent account), but that one of the child has used only two
thirds of his shares, the local usage ratio of that child will be of
one third. </P>
<P> The general formula for R is then defined by: </P>
<PRE>
R = R<sub>parent</sub> * r<sub>l</sub>^k
</PRE>
<P>where:</P>
<DL compact>
<DT> k
<DD> varies between 0 and 1 and determines how much the effective usage
ratio of an account is determined by the usage ratio of its ancestors.
</DL>
<P> To understand the formula for k, it is useful to first make a few
observations about the formula for R. On the one hand, if k equals 1,
the above formula gives R = R<sub>parent</sub> * r<sub>l</sub>. For a
second-level account, by plugging in the formula for r<sub>l</sub>,
this leads to R = r *
U<sub>parent</sub>/U<sub>all_siblings</sub>. Assuming jobs are
submitted at leaf accounts, U<sub>parent</sub> =
U<sub>all_siblings</sub> which gives R = r. This means that if k
equals 1, the fair-share factor of an account is only based on its own
usage ratio. On the other hand, if k equals 0, R = R<sub>parent</sub>
which means the fair-share factor of an account is only based on the
usage ratio of its ancestors. </P>
<P> The formula for k is: <P>
<PRE>
k = (1/(1+(5*ln(R<sub>parent</sub>))^2)) if ln(R<sub>parent</sub>)*ln(r<sub>l</sub>) <= 0
k = 1 if ln(R<sub>parent</sub>)*ln(r<sub>l</sub>) >= 0
</PRE>
<P> This formula is chosen to ensure that, if the usage of the
ancestors of an account is on target, the fair-share factor of the
account mainly depends on its own usage. Therefore k tends towards 1
when R<sub>parent</sub> tends towards 1. On the contrary, the more the
ancestors of an account have underused/overused their shares, the more
the fair-share factor of the account should get a bonus/malus by
moving towards the fair-share factor of its parent. Therefore, k tends
towards 0 when R<sub>parent</sub> diverges from 1. However, if the
account usage imbalance is greater than its ancestors' in the same
direction, (for example, the ancestors have consumed two times their
shares, and the child has consumed 3 times its shares), moving the
fair-share factor back towards the one of the parent is not
helpful. As a result, k is kept to 1 in that case.</P>
<div class="figure">
<img src=k_function.gif width=565><BR>
Figure 1. Plot of k as a function of R<sub>parent</sub>
</div>
<!-------------------------------------------------------------------------->
<h2 id="config">Configuration<a class="slurm_link" href="#config"></a></h2>
<p>The following slurm.conf parameters are used
to enable the depth-oblivious flavor of the fair-share factor. See
slurm.conf(5) man page for more details.</p>
<dl>
<dt>PriorityFlags
<dd>Set to "DEPTH_OBLIVIOUS".
<dt>PriorityType
<dd>Set this value to "priority/multifactor".
</dl>
<!-------------------------------------------------------------------------->
<p style="text-align:center;">Last modified 26 June 2023</p>
<!--#include virtual="footer.txt"-->