From 6e920a14fa3ea76f544d7ba682d4960cc2584981 Mon Sep 17 00:00:00 2001 From: j4ckstraw Date: Fri, 5 Jan 2024 15:58:04 +0800 Subject: [PATCH] feat: evict pod only called api successed for memory eviction Signed-off-by: j4ckstraw --- .../plugins/memoryevict/memory_evict.go | 35 +++++++++++++------ .../plugins/memoryevict/memory_evict_test.go | 1 + 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/pkg/koordlet/qosmanager/plugins/memoryevict/memory_evict.go b/pkg/koordlet/qosmanager/plugins/memoryevict/memory_evict.go index 72616337c..a3bf03ef2 100644 --- a/pkg/koordlet/qosmanager/plugins/memoryevict/memory_evict.go +++ b/pkg/koordlet/qosmanager/plugins/memoryevict/memory_evict.go @@ -32,6 +32,7 @@ import ( "github.com/koordinator-sh/koordinator/pkg/koordlet/qosmanager/helpers" "github.com/koordinator-sh/koordinator/pkg/koordlet/resourceexecutor" "github.com/koordinator-sh/koordinator/pkg/koordlet/statesinformer" + "github.com/koordinator-sh/koordinator/pkg/util" ) const ( @@ -50,6 +51,7 @@ type memoryEvictor struct { metricCache metriccache.MetricCache evictor *framework.Evictor lastEvictTime time.Time + onlyEvictByAPI bool } type podInfo struct { @@ -64,6 +66,7 @@ func New(opt *framework.Options) framework.QOSStrategy { metricCollectInterval: opt.MetricAdvisorConfig.CollectResUsedInterval, statesInformer: opt.StatesInformer, metricCache: opt.MetricCache, + onlyEvictByAPI: opt.Config.OnlyEvictByAPI, } } @@ -164,24 +167,36 @@ func (m *memoryEvictor) killAndEvictBEPods(node *corev1.Node, podMetrics map[str bePodInfos := m.getSortedBEPodInfos(podMetrics) message := fmt.Sprintf("killAndEvictBEPods for node, need to release memory: %v", memoryNeedRelease) memoryReleased := int64(0) - - var killedPods []*corev1.Pod + hasKillPods := false for _, bePod := range bePodInfos { if memoryReleased >= memoryNeedRelease { break } - killMsg := fmt.Sprintf("%v, kill pod: %v", message, bePod.pod.Name) - helpers.KillContainers(bePod.pod, killMsg) - killedPods = append(killedPods, bePod.pod) - if bePod.memUsed != 0 { - memoryReleased += int64(bePod.memUsed) + if m.onlyEvictByAPI { + if m.evictor.EvictPodIfNotEvicted(bePod.pod, node, resourceexecutor.EvictPodByNodeMemoryUsage, message) { + hasKillPods = true + if bePod.memUsed != 0 { + memoryReleased += int64(bePod.memUsed) + } + klog.V(5).Infof("memoryEvict pick pod %s to evict", util.GetPodKey(bePod.pod)) + } else { + klog.V(5).Infof("memoryEvict pick pod %s to evict", util.GetPodKey(bePod.pod)) + } + } else { + killMsg := fmt.Sprintf("%v, kill pod: %v", message, bePod.pod.Name) + helpers.KillContainers(bePod.pod, killMsg) + hasKillPods = true + if bePod.memUsed != 0 { + memoryReleased += int64(bePod.memUsed) + } + klog.V(5).Infof("memoryEvict pick pod %s to evict", util.GetPodKey(bePod.pod)) } } + if hasKillPods { + m.lastEvictTime = time.Now() + } - m.evictor.EvictPodsIfNotEvicted(killedPods, node, resourceexecutor.EvictPodByNodeMemoryUsage, message) - - m.lastEvictTime = time.Now() klog.Infof("killAndEvictBEPods completed, memoryNeedRelease(%v) memoryReleased(%v)", memoryNeedRelease, memoryReleased) } diff --git a/pkg/koordlet/qosmanager/plugins/memoryevict/memory_evict_test.go b/pkg/koordlet/qosmanager/plugins/memoryevict/memory_evict_test.go index 71cb79445..024601342 100644 --- a/pkg/koordlet/qosmanager/plugins/memoryevict/memory_evict_test.go +++ b/pkg/koordlet/qosmanager/plugins/memoryevict/memory_evict_test.go @@ -408,6 +408,7 @@ func Test_memoryEvict(t *testing.T) { memoryEvictor := m.(*memoryEvictor) memoryEvictor.Setup(&framework.Context{Evictor: evictor}) memoryEvictor.lastEvictTime = time.Now().Add(-30 * time.Second) + memoryEvictor.onlyEvictByAPI = true memoryEvictor.memoryEvict() for _, pod := range tt.expectEvictPods {