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  }