Introduce new formula of pMem calculating that works good with memory over-commitment. fMem / tMem is replaced with fMem / (tMem - nMem). tMem replaced with tMem - nMem because we care of memory which can be used for instance placement. Negative values of pMem mean active memory ovet-commitment.
Signed-off-by: Oleg Ponomarev <[email protected]> --- src/Ganeti/HTools/Node.hs | 21 ++++++++++++++------- test/hs/Test/Ganeti/HTools/Node.hs | 7 +++++-- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/Ganeti/HTools/Node.hs b/src/Ganeti/HTools/Node.hs index 22882fe..6907b29 100644 --- a/src/Ganeti/HTools/Node.hs +++ b/src/Ganeti/HTools/Node.hs @@ -43,6 +43,7 @@ module Ganeti.HTools.Node , create -- ** Finalization after data loading , buildPeers + , computePmem , setIdx , setAlias , setOffline @@ -304,6 +305,10 @@ haveExclStorage :: List -> Bool haveExclStorage nl = any exclStorage $ Container.elems nl +-- | Conversion formula from fMem, tMem and nMem to pMem. +computePmem :: Int -> Double -> Int -> Double +computePmem fmem tmem nmem = fromIntegral fmem / (tmem - fromIntegral nmem) + -- * Initialization functions -- | Create a new node. @@ -344,8 +349,8 @@ create name_init mem_t_init mem_n_init mem_f_init , peers = P.empty , rMem = 0 , rMemForth = 0 - , pMem = fromIntegral mem_f_init / mem_t_init - , pMemForth = fromIntegral mem_f_init / mem_t_init + , pMem = computePmem mem_f_init mem_t_init mem_n_init + , pMemForth = computePmem mem_f_init mem_t_init mem_n_init , pDsk = if excl_stor then computePDsk spindles_f_init $ fromIntegral spindles_t_init else computePDsk dsk_f_init dsk_t_init @@ -452,6 +457,8 @@ setPolicy pol node = , hiCpu = mCpuTohiCpu (T.iPolicyVcpuRatio pol) (tCpu node) , hiSpindles = computeHiSpindles (T.iPolicySpindleRatio pol) (tSpindles node) + , pMem = computePmem (fMem node) (tMem node) (nMem node) + , pMemForth = computePmem (fMemForth node) (tMem node) (nMem node) } -- | Computes the maximum reserved memory for peers from a peer map. @@ -605,7 +612,7 @@ setPri t inst (fMemForth node) (Instance.mem inst) - new_pMemForth = fromIntegral new_fMemForth / tMem node + new_pMemForth = computePmem new_fMemForth (tMem node) (nMem node) in node { pTags = addTags (pTags node) (Instance.exclTags inst) @@ -738,7 +745,7 @@ removePri t inst = new_dsk_forth = incIf uses_disk (fDskForth n) (Instance.dsk inst) new_free_sp_forth = calcNewFreeSpindlesForth False n inst new_inst_sp_forth = calcSpindleUseForth False n inst - new_mp_forth = fromIntegral new_mem_forth / tMem n + new_mp_forth = computePmem new_mem_forth (tMem n) (nMem n) new_dp_forth = computeNewPDsk n new_free_sp_forth new_dsk_forth new_ucpu_forth = decIf i_online (uCpuForth n) (Instance.vcpus inst) new_rcpu_forth = fromIntegral new_ucpu_forth / tCpu n @@ -769,7 +776,7 @@ removePri t inst = new_dsk = incIf uses_disk (fDsk t) (Instance.dsk inst) new_free_sp = calcNewFreeSpindles False t inst new_inst_sp = calcSpindleUse False t inst - new_mp = fromIntegral new_mem / tMem t + new_mp = computePmem new_mem (tMem t) (nMem t) new_dp = computeNewPDsk t new_free_sp new_dsk new_failn1 = new_mem - rMem t <= fMemTreshold t new_ucpu = decIf i_online (uCpu t) (Instance.vcpus inst) @@ -880,7 +887,7 @@ addPriEx force t inst = inst_tags = Instance.exclTags inst new_mem_forth = fMemForth t - Instance.mem inst - new_mp_forth = fromIntegral new_mem_forth / tMem t + new_mp_forth = computePmem new_mem_forth (tMem t) (nMem t) new_dsk_forth = decIf uses_disk (fDskForth t) (Instance.dsk inst) new_free_sp_forth = calcNewFreeSpindlesForth True t inst new_inst_sp_forth = calcSpindleUseForth True t inst @@ -938,7 +945,7 @@ addPriEx force t inst = new_load = utilLoad t `T.addUtil` Instance.util inst new_plist = iname:pList t - new_mp = fromIntegral new_mem / tMem t + new_mp = computePmem new_mem (tMem t) (nMem t) new_instance_map = addTags (instanceMap t) $ getLocationExclusionPairs t inst diff --git a/test/hs/Test/Ganeti/HTools/Node.hs b/test/hs/Test/Ganeti/HTools/Node.hs index b930a43..f7645f7 100644 --- a/test/hs/Test/Ganeti/HTools/Node.hs +++ b/test/hs/Test/Ganeti/HTools/Node.hs @@ -128,8 +128,11 @@ genEmptyOnlineNode = let node' = node { Node.offline = False , Node.fMem = fmem , Node.fMemForth = fmem - , Node.pMem = fromIntegral fmem / Node.tMem node - , Node.pMemForth = fromIntegral fmem / Node.tMem node + , Node.pMem = Node.computePmem fmem (Node.tMem node) + (Node.nMem node) + , Node.pMemForth = Node.computePmem fmem + (Node.tMem node) + (Node.nMem node) , Node.rMem = 0 , Node.rMemForth = 0 , Node.pRem = 0 -- 2.6.0.rc2.230.g3dd15c0
