github.com/kubewharf/katalyst-core@v0.5.3/pkg/config/agent/dynamic/tmo/tmo_base.go (about) 1 /* 2 Copyright 2022 The Katalyst Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package tmo 18 19 import ( 20 "time" 21 22 "github.com/kubewharf/katalyst-api/pkg/apis/config/v1alpha1" 23 "github.com/kubewharf/katalyst-api/pkg/consts" 24 "github.com/kubewharf/katalyst-core/pkg/config/agent/dynamic/crd" 25 ) 26 27 const ( 28 DefaultEnableTMO bool = false 29 DefaultEnableSwap bool = false 30 DefaultTMOInterval time.Duration = 30 * time.Second 31 DefaultTMOPolicyName v1alpha1.TMOPolicyName = v1alpha1.TMOPolicyNamePSI 32 DefaultTMOMaxProbe float64 = 0.01 33 DefaultTMOPSIPolicyPSIAvg60Threshold float64 = 0.1 34 DefaultTMORefaultPolicyReclaimAccuracyTarget float64 = 0.99 35 DefaultTMORefaultPolicyReclaimScanEfficiencyTarget float64 = 0.6 36 ) 37 38 type TransparentMemoryOffloadingConfiguration struct { 39 DefaultConfigurations *TMODefaultConfigurations 40 QoSLevelConfigs map[consts.QoSLevel]*TMOConfigDetail 41 CgroupConfigs map[string]*TMOConfigDetail 42 } 43 44 func NewTransparentMemoryOffloadingConfiguration() *TransparentMemoryOffloadingConfiguration { 45 return &TransparentMemoryOffloadingConfiguration{ 46 DefaultConfigurations: NewTMODefaultConfigurations(), 47 QoSLevelConfigs: map[consts.QoSLevel]*TMOConfigDetail{}, 48 CgroupConfigs: map[string]*TMOConfigDetail{}, 49 } 50 } 51 52 type TMODefaultConfigurations struct { 53 DefaultEnableTMO bool 54 DefaultEnableSwap bool 55 DefaultTMOInterval time.Duration 56 DefaultTMOPolicyName v1alpha1.TMOPolicyName 57 DefaultTMOMaxProbe float64 58 DefaultTMOPSIPolicyPSIAvg60Threshold float64 59 DefaultTMORefaultPolicyReclaimAccuracyTarget float64 60 DefaultTMORefaultPolicyReclaimScanEfficiencyTarget float64 61 } 62 63 func NewTMODefaultConfigurations() *TMODefaultConfigurations { 64 return &TMODefaultConfigurations{ 65 DefaultEnableTMO: DefaultEnableTMO, 66 DefaultEnableSwap: DefaultEnableSwap, 67 DefaultTMOInterval: DefaultTMOInterval, 68 DefaultTMOPolicyName: DefaultTMOPolicyName, 69 DefaultTMOMaxProbe: DefaultTMOMaxProbe, 70 DefaultTMOPSIPolicyPSIAvg60Threshold: DefaultTMOPSIPolicyPSIAvg60Threshold, 71 DefaultTMORefaultPolicyReclaimAccuracyTarget: DefaultTMORefaultPolicyReclaimAccuracyTarget, 72 DefaultTMORefaultPolicyReclaimScanEfficiencyTarget: DefaultTMORefaultPolicyReclaimScanEfficiencyTarget, 73 } 74 } 75 76 type TMOConfigDetail struct { 77 EnableTMO bool 78 EnableSwap bool 79 Interval time.Duration 80 PolicyName v1alpha1.TMOPolicyName 81 *PSIPolicyConf 82 *RefaultPolicyConf 83 } 84 85 func NewTMOConfigDetail(defaultConfigs *TMODefaultConfigurations) *TMOConfigDetail { 86 return &TMOConfigDetail{ 87 EnableTMO: defaultConfigs.DefaultEnableTMO, 88 EnableSwap: defaultConfigs.DefaultEnableSwap, 89 Interval: defaultConfigs.DefaultTMOInterval, 90 PolicyName: defaultConfigs.DefaultTMOPolicyName, 91 PSIPolicyConf: &PSIPolicyConf{ 92 MaxProbe: defaultConfigs.DefaultTMOMaxProbe, 93 PsiAvg60Threshold: defaultConfigs.DefaultTMOPSIPolicyPSIAvg60Threshold, 94 }, 95 RefaultPolicyConf: &RefaultPolicyConf{ 96 MaxProbe: defaultConfigs.DefaultTMOMaxProbe, 97 ReclaimAccuracyTarget: defaultConfigs.DefaultTMORefaultPolicyReclaimAccuracyTarget, 98 ReclaimScanEfficiencyTarget: defaultConfigs.DefaultTMORefaultPolicyReclaimScanEfficiencyTarget, 99 }, 100 } 101 } 102 103 type PSIPolicyConf struct { 104 MaxProbe float64 105 PsiAvg60Threshold float64 106 } 107 108 type RefaultPolicyConf struct { 109 MaxProbe float64 110 ReclaimAccuracyTarget float64 111 ReclaimScanEfficiencyTarget float64 112 } 113 114 func ApplyTMOConfigDetail(tmoConfigDetail *TMOConfigDetail, tmoConfigDetailDynamic v1alpha1.TMOConfigDetail) { 115 if tmoConfigDetailDynamic.EnableTMO != nil { 116 tmoConfigDetail.EnableTMO = *tmoConfigDetailDynamic.EnableTMO 117 } 118 if tmoConfigDetailDynamic.EnableSwap != nil { 119 tmoConfigDetail.EnableSwap = *tmoConfigDetailDynamic.EnableSwap 120 } 121 if tmoConfigDetailDynamic.Interval != nil { 122 tmoConfigDetail.Interval = tmoConfigDetailDynamic.Interval.Duration 123 } 124 if tmoConfigDetailDynamic.PolicyName != nil { 125 tmoConfigDetail.PolicyName = *tmoConfigDetailDynamic.PolicyName 126 } 127 if psiPolicyConfDynamic := tmoConfigDetailDynamic.PSIPolicyConf; psiPolicyConfDynamic != nil { 128 if psiPolicyConfDynamic.MaxProbe != nil { 129 tmoConfigDetail.PSIPolicyConf.MaxProbe = *psiPolicyConfDynamic.MaxProbe 130 } 131 if psiPolicyConfDynamic.PSIAvg60Threshold != nil { 132 tmoConfigDetail.PSIPolicyConf.PsiAvg60Threshold = *psiPolicyConfDynamic.PSIAvg60Threshold 133 } 134 } 135 if refaultPolicyConfDynamic := tmoConfigDetailDynamic.RefaultPolicConf; refaultPolicyConfDynamic != nil { 136 if refaultPolicyConfDynamic.MaxProbe != nil { 137 tmoConfigDetail.RefaultPolicyConf.MaxProbe = *refaultPolicyConfDynamic.MaxProbe 138 } 139 if refaultPolicyConfDynamic.ReclaimScanEfficiencyTarget != nil { 140 tmoConfigDetail.RefaultPolicyConf.ReclaimAccuracyTarget = *refaultPolicyConfDynamic.ReclaimAccuracyTarget 141 } 142 if refaultPolicyConfDynamic.ReclaimScanEfficiencyTarget != nil { 143 tmoConfigDetail.RefaultPolicyConf.ReclaimScanEfficiencyTarget = *refaultPolicyConfDynamic.ReclaimScanEfficiencyTarget 144 } 145 } 146 } 147 148 func (c *TransparentMemoryOffloadingConfiguration) ApplyConfiguration(conf *crd.DynamicConfigCRD) { 149 if tmoConf := conf.TransparentMemoryOffloadingConfiguration; tmoConf != nil { 150 if tmoConf.Spec.Config.QoSLevelConfig != nil { 151 for _, qosLevelConfig := range tmoConf.Spec.Config.QoSLevelConfig { 152 tmoConfigDetail := NewTMOConfigDetail(c.DefaultConfigurations) 153 ApplyTMOConfigDetail(tmoConfigDetail, qosLevelConfig.ConfigDetail) 154 c.QoSLevelConfigs[qosLevelConfig.QoSLevel] = tmoConfigDetail 155 156 } 157 } 158 if tmoConf.Spec.Config.CgroupConfig != nil { 159 for _, cgroupConfig := range tmoConf.Spec.Config.CgroupConfig { 160 tmoConfigDetail := NewTMOConfigDetail(c.DefaultConfigurations) 161 ApplyTMOConfigDetail(tmoConfigDetail, cgroupConfig.ConfigDetail) 162 c.CgroupConfigs[cgroupConfig.CgroupPath] = tmoConfigDetail 163 } 164 } 165 } 166 }