From 9f1c3c1b7dc29970b04a4b8e3c896e06cc24ae5b Mon Sep 17 00:00:00 2001 From: googs1025 Date: Sat, 27 Jul 2024 21:52:08 +0800 Subject: [PATCH] docs: overcommit-plugin enhancements Signed-off-by: googs1025 --- .../overcommit-plugin-with-multi-factors.png | Bin 0 -> 39954 bytes docs/design/images/overcommit-plugin.png | Bin 0 -> 14108 bytes docs/design/overcommit-plugin.md | 127 ++++++++++++++++++ 3 files changed, 127 insertions(+) create mode 100644 docs/design/images/overcommit-plugin-with-multi-factors.png create mode 100644 docs/design/images/overcommit-plugin.png create mode 100644 docs/design/overcommit-plugin.md diff --git a/docs/design/images/overcommit-plugin-with-multi-factors.png b/docs/design/images/overcommit-plugin-with-multi-factors.png new file mode 100644 index 0000000000000000000000000000000000000000..03699dc24da323cf16e51283597e8f398b933300 GIT binary patch literal 39954 zcmeFZWl&sg(=`eN0)*hf-4lX@;O=h0A-E3i8r z;3?UnD3PK+7BTc82q!rpi05W!8(6zi_q=|W9Iqyh2Y_wUz6qR^{| z8t%=JKT>}1|9W*`WOEJq3&BzU`y~L}vj56iUHZS>^bW-R`d?oHyuSkx?j6Y64?-{f zUk2m1#?b%o69VRXBjmSMhCZf6^WP@^1-yw*4vY2g7a7tQ@FgryDfNH5DWZn>)qhzO z>Xlcp5j6rrpdbJ3CLxC;1RY5=`%03p*pP#Q$xr0rQM|@dSyVBv1zkz%Tt@#p{fW=x$$n%d`a5%6^pR^)vX#U0RrNaF( zN>=^|%t{BoMm6aUiLMIM$YbJx1s!>MO{k`_nSNu?^^ZOqR=0^x;XNG>l{Y!;5|XJ>=eS^nGYMZsm)D-|{e(wZYR&w0%6iU#GI$ zMehQ%SPN2QFxexgUWdiCmM97q&$TW*kXoRcjextt<}T#B>At_9A%zGWH3l-A{qVOv zGish;h5w1FVrejF^mFx!d5#di^=CZ~i}+Q4#tbMVyj$UafmjG1*}(RC1$tU-Fpg!R z`Nd!Y?Je2Ybdj3)I{c@s(yz@55pPiPbuEZgE_#=SOox)n z9kq`2s$CX1w5rZr*3U5*Q3N%9UwPkdbhDc|D60_g-Cqz>Rm>Ze*I~mQyfW?|Ok>}V zTJHI&uRFxkJcpVj4tM#239!JD#c9B=Xs(t;My3zinJKV)i&kVyL=*mLwksblZL4Pe zADA4c@iV6YlSWH#m~Qfqz+VIhM~>`{Hzc(-e5yOd!k*sS8#S4ejoi56l~e{tA5|KT zzVHQdRe0NWr^N7>UNyku%w`dlQJwe4d1?FB?6x0UYNn>92I$DtdL0M$VD;O}!63AU z32_-5s|-ZH;5ToH(%k@f+{%!iqreJ7gI$6I*w77NIxn}nr4JS#f`!*Z(nC|Gr`-PP zbiVqM!^#I$d0E>5Z8*)K#V@Vn8*K}9-pzAuw~G(l)lM4GI%8GCVvx4Gvo+1kEq67RF6Ag-o$uXvr&os+1z(kD{m&7sjOxCw_6|zj@*$8aCOM7Ce z!g*Bd#6d}DAphINsW;PHs4AC6ivWaA)hXx!p>U&B$xP}k6?*^Mb@Rbd4i)f-Vso_y zb(|agiWo±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

{mRG#)Iz5$A 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

!IWzWoIL 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%0A_ijUJw@P|9*)pqf#6SX=dOgGq)p4^w>Z`izf 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 literal 0 HcmV?d00001 diff --git a/docs/design/overcommit-plugin.md b/docs/design/overcommit-plugin.md new file mode 100644 index 000000000..4f49acd4d --- /dev/null +++ b/docs/design/overcommit-plugin.md @@ -0,0 +1,127 @@ +# overcommit-plugin + +[@googs1025](https://github.com/googs1025); Jul. 29, 2024 + +### Background: +The overcommit-plugin is used to amplify node resources to achieve resource allocation. +### Objective: +Use different amplification factors based on different resource types. + + +## Introduction +Currently, the overcommit-plugin enhances the Allocatable resources of a node to achieve the functionality of AddJobEnqueuedFn. However, different resources should have different factors, so using the same overcommit-factor is not appropriate. +![factor](images/overcommit-plugin.png) +- For example: + +The Binpack plugin assigns different weights to different resources as well. + + +```yaml +actions: "enqueue, reclaim, allocate, backfill, preempt" +tiers: +- plugins: + - name: binpack + arguments: + binpack.weight: 10 + binpack.cpu: 5 + binpack.memory: 1 + binpack.resources: nvidia.com/gpu, example.com/foo + binpack.resources.nvidia.com/gpu: 2 + binpack.resources.example.com/foo: 3 +``` + +## Solution +We can further break down the overcommit-factor into more granular components: `overcommit-factor.`. + +For example: `overcommit-factor.cpu` `overcommit-factor.memory` `overcommit-factor.pods` `overcommit-factor.ephemeral-storage` `overcommit-factor.nvidia.com/gpu` + +To maintain compatibility with the existing approach, we will retain the original overcommit-factor field and we will keep the original overcommit-factor field and introduce an optional field of `overcommit-factor.`. + +![factors](images/overcommit-plugin-with-multi-factors.png) + +The priority of these fields will be from low to high: + +`defaultOverCommitFactor -> overcommit-factor -> overcommit-factor.` + + +- overcommitPlugin struct + +```go +// overcommitFactors defines the resource overCommit factors +type overcommitFactors struct { + // factorMaps defines the resource overCommit factors + // key: resource, example: "cpu", "memory", "ephemeral-storage", "nvidia.com/gpu" + // value: overCommit factors + factorMaps map[string]float64 +} + +type overcommitPlugin struct { + // Arguments given for the plugin + pluginArguments framework.Arguments + totalResource *api.Resource + idleResource *api.Resource + inqueueResource *api.Resource + // overCommitFactor is the different resource overCommit factors + overCommitFactors *overcommitFactors +} +``` + +#### Example + +Example 1: +Explicitly specify all the overcommit factors +```yaml +actions: "enqueue, allocate, backfill" +tiers: +- plugins: + - name: overcommit + arguments: + overcommit-factor.cpu: 1.2 + overcommit-factor.memory: 1.0 + overcommit-factor.ephemeral-storage: 1.2 + overcommit-factor.pods: 1.2 + overcommit-factor.nvidia.com/gpu: 1.2 +``` + +Example 2: +Specifying only the overcommit-factor implies that all factors are the same. +```yaml +actions: "enqueue, allocate, backfill" +tiers: +- plugins: + - name: overcommit + arguments: + overcommit-factor: 1.3 +``` + +Example 3: +Specifying overcommit-factor.cpu, overcommit-factor.nvidia.com/gpu are set, along with specifying overcommit-factor: indicates that the resource uses a specific value, while other values use the overcommit-factor field. +```yaml +actions: "enqueue, allocate, backfill" +tiers: +- plugins: + - name: overcommit + arguments: + overcommit-factor.cpu: 1.2 + overcommit-factor.nvidia.com/gpu: 1.3 + overcommit-factor: 1.0 +``` +Example 4: +Specifying any one of overcommit-factor.cpu is set: indicates that the resource uses a specific value, while other values use the defaultOverCommitFactor default value. +```yaml +actions: "enqueue, allocate, backfill" +tiers: +- plugins: + - name: overcommit + arguments: + overcommit-factor.cpu: 1.2 +``` +Example 5: +Not specifying will default to the defaultOverCommitFactor value. +```yaml +actions: "enqueue, allocate, backfill" +tiers: +- plugins: + - name: overcommit + arguments: +```