| <!--#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"--> |