github.com/percona/percona-xtradb-cluster-operator@v1.14.0/pkg/pxc/app/config/autotune.go (about)

     1  package config
     2  
     3  import (
     4  	"strconv"
     5  
     6  	"github.com/pkg/errors"
     7  	res "k8s.io/apimachinery/pkg/api/resource"
     8  
     9  	api "github.com/percona/percona-xtradb-cluster-operator/pkg/apis/pxc/v1"
    10  )
    11  
    12  const (
    13  	chunkSizeMin     int64 = 1048576
    14  	chunkSizeDefault int64 = 134217728
    15  )
    16  
    17  func getAutoTuneParams(cr *api.PerconaXtraDBCluster, q *res.Quantity) (string, error) {
    18  	autotuneParams := ""
    19  
    20  	bufferConfigured, err := cr.ConfigHasKey("mysqld", "innodb_buffer_pool_size")
    21  	if err != nil {
    22  		return autotuneParams, errors.Wrap(err, "check if innodb_buffer_pool_size configured")
    23  	}
    24  
    25  	maxConnConfigured, err := cr.ConfigHasKey("mysqld", "max_connections")
    26  	if err != nil {
    27  		return autotuneParams, errors.Wrap(err, "check if max_connections configured")
    28  	}
    29  
    30  	if !bufferConfigured {
    31  		poolSize := q.Value() / int64(100) * int64(75)
    32  		if q.Value()-poolSize < int64(1000000000) {
    33  			poolSize = q.Value() / int64(100) * int64(50)
    34  		}
    35  		if poolSize%chunkSizeDefault != 0 {
    36  			poolSize += chunkSizeDefault - (poolSize % chunkSizeDefault)
    37  		}
    38  
    39  		// Adjust innodb_buffer_pool_chunk_size
    40  		// If innodb_buffer_pool_size is bigger than 1Gi, innodb_buffer_pool_instances is set to 8.
    41  		// By default, innodb_buffer_pool_chunk_size is 128M and innodb_buffer_pool_size needs to be
    42  		// multiple of innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances.
    43  		// More info: https://dev.mysql.com/doc/refman/8.0/en/innodb-buffer-pool-resize.html
    44  		if poolSize > int64(1073741824) {
    45  			chunkSize := poolSize / 8
    46  			// round to multiple of chunkSizeMin
    47  			chunkSize = chunkSize + chunkSizeMin - (chunkSize % chunkSizeMin)
    48  
    49  			poolSize = chunkSize * 8
    50  
    51  			chunkSizeVal := strconv.FormatInt(chunkSize, 10)
    52  			paramValue := "\n" + "innodb_buffer_pool_chunk_size" + " = " + chunkSizeVal
    53  			autotuneParams += paramValue
    54  		}
    55  
    56  		poolSizeVal := strconv.FormatInt(poolSize, 10)
    57  		paramValue := "\n" + "innodb_buffer_pool_size" + " = " + poolSizeVal
    58  		autotuneParams += paramValue
    59  	}
    60  
    61  	if !maxConnConfigured {
    62  		divider := int64(12582880)
    63  		if q.Value() < divider {
    64  			return "", errors.New("Not enough memory set in requests. Must be >= 12Mi.")
    65  		}
    66  		maxConnSize := q.Value() / divider
    67  		maxConnSizeVal := strconv.FormatInt(maxConnSize, 10)
    68  		paramValue := "\n" + "max_connections" + " = " + maxConnSizeVal
    69  		autotuneParams += paramValue
    70  	}
    71  
    72  	return autotuneParams, nil
    73  }