@@ -7,8 +7,6 @@ Expand the name of the chart.
77
88{{/*
99Create a default fully qualified app name.
10- We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
11- If release name contains chart name it will be used as a full name.
1210*/ }}
1311{{- define " cnpg-cluster.fullname" -}}
1412{{- if .Values.fullnameOverride }}
@@ -51,126 +49,155 @@ app.kubernetes.io/instance: {{ .Release.Name }}
5149{{- end }}
5250
5351{{/*
54- Create the name of the service account to use
52+ Total memory in MB allocated to a PostgreSQL pod
5553*/ }}
56- {{- define " cnpg-cluster.serviceAccountName" -}}
57- {{- if .Values.serviceAccount.create }}
58- {{- default (include " cnpg-cluster.fullname" . ) .Values.serviceAccount.name }}
59- {{- else }}
60- {{- default " default" .Values.serviceAccount.name }}
61- {{- end }}
54+ {{- define " cnpg-cluster.totalMemoryMB" -}}
55+ {{- $mem := .Values.resources.requests.memory -}}
56+ {{- if hasSuffix " Gi" $mem -}}
57+ {{- trimSuffix " Gi" $mem | float64 | mulf 1024 | int -}}
58+ {{- else if hasSuffix " Mi" $mem -}}
59+ {{- trimSuffix " Mi" $mem | int -}}
60+ {{- else if hasSuffix " G" $mem -}}
61+ {{- trimSuffix " G" $mem | float64 | mulf 1000 | int -}}
62+ {{- else if hasSuffix " M" $mem -}}
63+ {{- trimSuffix " M" $mem | int -}}
64+ {{- else -}}
65+ {{- div (int $mem ) 1048576 -}}
66+ {{- end -}}
6267{{- end }}
6368
6469{{/*
65- Sanitized compute size factor (minimum 1)
70+ shared_buffers = 25% total memory
71+ Recommended for mixed workloads (OLTP + analytical queries)
6672*/ }}
67- {{- define " cnpg-cluster.computeFactor" -}}
68- {{- $raw := .Values.computeSizeFactor | default 1 -}}
69- {{- $f := (printf " %v " $raw | atoi) -}}
70- {{- if lt $f 1 }}{{- $f = 1 }}{{- end -}}
71- {{- $f -}}
73+ {{- define " cnpg-cluster.sharedBuffersMB" -}}
74+ {{- $total := include " cnpg-cluster.totalMemoryMB" . | int -}}
75+ {{- div (mul $total 25) 100 -}}
7276{{- end }}
7377
7478{{/*
75- Memory per factor in MB (override with .Values.memoryPerFactorMB, default 512MB)
79+ max_connections = Based on memory and expected workload
80+ Formula: (~totalMemoryMB / 10) capped between 25-200
7681*/ }}
77- {{- define " cnpg-cluster.memoryPerFactorMB" -}}
78- {{- (.Values.memoryPerFactorMB | default 128) | int -}}
82+ {{- define " cnpg-cluster.maxConnections" -}}
83+ {{- $total := include " cnpg-cluster.totalMemoryMB" . | int -}}
84+ {{- $calculated := div $total 10 -}}
85+ {{- $min := 25 -}}
86+ {{- $max := 200 -}}
87+ {{- if lt $calculated $min -}}
88+ {{- $min -}}
89+ {{- else if gt $calculated $max -}}
90+ {{- $max -}}
91+ {{- else -}}
92+ {{- $calculated -}}
93+ {{- end -}}
7994{{- end }}
8095
8196{{/*
82- Total memory (MB) allocated to a PostgreSQL pod
97+ System connections: CNPG, monitoring, migrations, psql, maintenance
8398*/ }}
84- {{- define " cnpg-cluster.totalMemoryMB" -}}
85- {{- $f := include " cnpg-cluster.computeFactor" . | int -}}
86- {{- $unit := include " cnpg-cluster.memoryPerFactorMB" . | int -}}
87- {{- mul $f $unit -}}
99+ {{- define " cnpg-cluster.systemConnections" -}}
100+ {{- .Values.connections.system | default 10 | int -}}
88101{{- end }}
89102
90103{{/*
91- CPU per factor in millicores (override with .Values.cpuPerFactorMillicores, default 75m)
104+ Pooler connections: For application traffic via PgBouncer
92105*/ }}
93- {{- define " cnpg-cluster.cpuPerFactorMillicores " -}}
94- {{- ( .Values.cpuPerFactorMillicores | default 75) | int -}}
106+ {{- define " cnpg-cluster.poolerConnections " -}}
107+ {{- .Values.connections.pooler | default 0 | int -}}
95108{{- end }}
96109
97110{{/*
98- Total CPU (millicores) allocated to a PostgreSQL pod
111+ Direct connections: Calculated as remaining after system and pooler
99112*/ }}
100- {{- define " cnpg-cluster.totalCPUMillicores" -}}
101- {{- $f := include " cnpg-cluster.computeFactor" . | int -}}
102- {{- $unit := include " cnpg-cluster.cpuPerFactorMillicores" . | int -}}
103- {{- mul $f $unit -}}
113+ {{- define " cnpg-cluster.directConnections" -}}
114+ {{- $max := include " cnpg-cluster.maxConnections" . | int -}}
115+ {{- $system := include " cnpg-cluster.systemConnections" . | int -}}
116+ {{- $pooler := include " cnpg-cluster.poolerConnections" . | int -}}
117+ {{- $remaining := sub (sub $max $system ) $pooler -}}
118+ {{- if lt $remaining 5 }}5{{ else }}{{ $remaining }}{{ end }}
104119{{- end }}
105120
106121{{/*
107- shared_buffers = 25% total memory
122+ Pooler max_db_connections
108123*/ }}
109- {{- define " cnpg-cluster.sharedBuffersMB" -}}
110- {{- $total := include " cnpg-cluster.totalMemoryMB" . | int -}}
111- {{- div (mul $total 25) 100 -}}
112- {{- end }}
113-
114- {{/*
115- max_connections = (compute size factor * 5) + 5
116- */ }}
117- {{- define " cnpg-cluster.maxConnections" -}}
118- {{- .Values.computeSizeFactor | mul 5 | add 5 }}
124+ {{- define " cnpg-cluster.pooler.maxDbConnections" -}}
125+ {{- include " cnpg-cluster.poolerConnections" . -}}
119126{{- end }}
120127
121128{{/*
122- work_mem = (25% total) / max_connections
129+ work_mem = (Total RAM * 0.25) / max_connections
130+ Minimum 4MB for reasonable query performance
123131*/ }}
124132{{- define " cnpg-cluster.workMemMB" -}}
125133{{- $total := include " cnpg-cluster.totalMemoryMB" . | int -}}
126134{{- $maxConn := include " cnpg-cluster.maxConnections" . | int -}}
127- {{- if lt $maxConn 1 }}{{- $maxConn = 1 }}{{- end -}}
128135{{- $quarter := div (mul $total 25) 100 -}}
129- {{- $per := div (max 1 $quarter ) $maxConn -}}
130- {{- if lt $per 1 }}1 {{ else }}{{ $per }}{{ end }}
136+ {{- $per := div $quarter $maxConn -}}
137+ {{- if lt $per 4 }}4 {{ else }}{{ $per }}{{ end }}
131138{{- end }}
132139
133140{{/*
134- maintenance_work_mem = 5% total
141+ maintenance_work_mem = min(10% total, 2GB)
142+ Higher values speed up VACUUM, CREATE INDEX
135143*/ }}
136144{{- define " cnpg-cluster.maintenanceWorkMemMB" -}}
137145{{- $total := include " cnpg-cluster.totalMemoryMB" . | int -}}
138- {{ div (mul $total 5) 100 }}
146+ {{- $calculated := div (mul $total 10) 100 -}}
147+ {{- $max := 2048 -}}
148+ {{- if gt $calculated $max }}{{ $max }}{{ else }}{{ $calculated }}{{ end }}
139149{{- end }}
140150
141151{{/*
142- effective_cache_size = 50% total memory
152+ effective_cache_size = 75% total memory
153+ Assumption: Kubernetes node has some free memory for OS cache
154+ PostgREST benefits from accurate planner estimates
143155*/ }}
144156{{- define " cnpg-cluster.effectiveCacheSizeMB" -}}
145157{{- $total := include " cnpg-cluster.totalMemoryMB" . | int -}}
146- {{- div (mul $total 50 ) 100 -}}
158+ {{- div (mul $total 75 ) 100 -}}
147159{{- end }}
148160
149161{{/*
150- Pooler sizing helpers
162+ random_page_cost: Lower for SSD storage (default 4.0 is for HDD)
151163*/ }}
152- {{- define " cnpg-cluster.pooler.maxDbConnections" -}}
153- {{- $clusterMax := include " cnpg-cluster.maxConnections" . | int -}}
154- {{- $reserve := 5 -}}
155- {{- $v := sub $clusterMax $reserve -}}
156- {{- if lt $v 5 }}5{{ else }}{{ $v }}{{ end }}
164+ {{- define " cnpg-cluster.randomPageCost" -}}
165+ 1.1
157166{{- end }}
158167
168+ {{/*
169+ effective_io_concurrency: Higher for SSD/NVMe
170+ */ }}
171+ {{- define " cnpg-cluster.effectiveIOConcurrency" -}}
172+ 200
173+ {{- end }}
174+
175+ {{/*
176+ Pooler sizing helpers
177+ For transaction pooling mode
178+ */ }}
159179{{- define " cnpg-cluster.pooler.maxClientConn" -}}
160- {{- /* Allow more frontend connections: 10x db connections */ -}}
180+ {{- /* For transaction mode: Allow 10-20x backend connections */ -}}
161181{{- $db := include " cnpg-cluster.pooler.maxDbConnections" . | int -}}
162- {{ mul $db 10 }}
182+ {{- if gt $db 0 -}}
183+ {{- mul $db 15 -}}
184+ {{- else -}}
185+ 10
186+ {{- end -}}
163187{{- end }}
164188
165189{{- define " cnpg-cluster.pooler.defaultPoolSize" -}}
166- {{- /* 50 % of max_db_connections, min 5 */ -}}
190+ {{- /* 70 % of max_db_connections for transaction mode */ -}}
167191{{- $db := include " cnpg-cluster.pooler.maxDbConnections" . | int -}}
168- {{- $v := div (mul $db 50) 100 -}}
169- {{- if lt $v 5 }}5{{ else }}{{ $v }}{{ end }}
192+ {{- if gt $db 0 -}}
193+ {{- $v := div (mul $db 70) 100 -}}
194+ {{- if lt $v 5 }}5{{ else }}{{ $v }}{{ end }}
195+ {{- else -}}
196+ 5
197+ {{- end -}}
170198{{- end }}
171199
172200{{- define " cnpg-cluster.now" -}}
173- {{- /* Renders current time in configured timezone (Values.timezone), falls back to local system tz */ -}}
174201{{- $tz := .Values.timezone | default " Local" -}}
175202{{- dateInZone " 2006-01-02T15:04:05-07:00" (now) $tz -}}
176203{{- end }}
@@ -179,11 +206,9 @@ Pooler sizing helpers
179206Schedule for automatic backups
180207*/ }}
181208{{- define " cnpg-cluster.randomBackupSchedule" -}}
182- {{- /* Deterministic pseudo-random schedule between 03:00–04:59 (UTC+8) */ -}}
183- {{- /* Uses adler32 hash so it is stable across renders (good for GitOps) */ -}}
184209{{- $seed := adler32sum (printf " %s -%s " .Release.Name .Release.Namespace ) -}}
185- {{- $offset := mod $seed 120 -}} {{ /* 0..119 minutes in 2h window */ }}
186- {{- $hour := add 19 (div $offset 60) -}} {{ /* 3 or 4 */ }}
210+ {{- $offset := mod $seed 120 -}}
211+ {{- $hour := add 19 (div $offset 60) -}}
187212{{- $minute := mod $offset 60 -}}
188213{{- printf " 0 %02d %d * * *" $minute $hour -}}
189214{{- end }}
0 commit comments