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 }