Skip to content

Commit 8c794e1

Browse files
committed
Recommend default_toast_compression=lz4 & jit=off
- Added to "misc" group - Only provide recommendation on supported versions
1 parent ac20bcd commit 8c794e1

File tree

4 files changed

+249
-109
lines changed

4 files changed

+249
-109
lines changed

pkg/pgtune/misc.go

Lines changed: 53 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ const (
2020
AutovacuumNaptimeKey = "autovacuum_naptime"
2121
EffectiveIOKey = "effective_io_concurrency" // linux only
2222

23+
// nonnumeric
24+
DefaultToastCompression = "default_toast_compression"
25+
Jit = "jit"
26+
2327
checkpointDefault = "0.9"
2428
statsTargetDefault = "100"
2529
randomPageCostDefault = "1.1"
@@ -31,6 +35,8 @@ const (
3135
// https://www.postgresql.org/message-id/20210422195232.GA25061%40momjian.us
3236
effectiveIODefaultOldVersions = "200"
3337
effectiveIODefault = "256"
38+
lz4Compression = "lz4"
39+
off = "off"
3440

3541
// If you want to lower this value, consider that Patroni will not accept anything less than 25 as
3642
// a valid max_connections and will replace it with 100, per
@@ -59,12 +65,18 @@ func getMaxConns(totalMemory uint64) uint64 {
5965
}
6066
}
6167

68+
func getValueForVersion(currentVersion string, oldVersions []string, oldVersionValue, newVersionValue string) string {
69+
for _, ov := range oldVersions {
70+
if ov == currentVersion {
71+
return oldVersionValue
72+
}
73+
}
74+
return newVersionValue
75+
}
76+
6277
func getEffectiveIOConcurrency(pgMajorVersion string) string {
6378
switch pgMajorVersion {
64-
case pgutils.MajorVersion96,
65-
pgutils.MajorVersion10,
66-
pgutils.MajorVersion11,
67-
pgutils.MajorVersion12:
79+
case pgutils.MajorVersion96, pgutils.MajorVersion10, pgutils.MajorVersion11, pgutils.MajorVersion12:
6880
return effectiveIODefaultOldVersions
6981
}
7082
return effectiveIODefault
@@ -90,7 +102,10 @@ var MiscKeys = []string{
90102
MaxLocksPerTxKey,
91103
AutovacuumMaxWorkersKey,
92104
AutovacuumNaptimeKey,
93-
EffectiveIOKey,
105+
DefaultToastCompression,
106+
Jit,
107+
108+
EffectiveIOKey, //linux only
94109
}
95110

96111
// MiscRecommender gives recommendations for MiscKeys based on system resources.
@@ -113,37 +128,49 @@ func (r *MiscRecommender) IsAvailable() bool {
113128
// Recommend returns the recommended PostgreSQL formatted value for the conf
114129
// file for a given key.
115130
func (r *MiscRecommender) Recommend(key string) string {
116-
var val string
117-
if key == CheckpointKey {
118-
val = checkpointDefault
119-
} else if key == StatsTargetKey {
120-
val = statsTargetDefault
121-
} else if key == MaxConnectionsKey {
122-
conns := getMaxConns(r.totalMemory)
131+
switch key {
132+
case CheckpointKey:
133+
return checkpointDefault
134+
case StatsTargetKey:
135+
return statsTargetDefault
136+
case AutovacuumMaxWorkersKey:
137+
return autovacuumMaxWorkersDefault
138+
case AutovacuumNaptimeKey:
139+
return autovacuumNaptimeDefault
140+
case RandomPageCostKey:
141+
return randomPageCostDefault
142+
case EffectiveIOKey:
143+
return getValueForVersion(r.pgMajorVersion, []string{
144+
pgutils.MajorVersion96, pgutils.MajorVersion10, pgutils.MajorVersion11, pgutils.MajorVersion12},
145+
effectiveIODefaultOldVersions, effectiveIODefault,
146+
)
147+
case DefaultToastCompression:
148+
return getValueForVersion(r.pgMajorVersion, []string{
149+
pgutils.MajorVersion96, pgutils.MajorVersion10, pgutils.MajorVersion11, pgutils.MajorVersion12, pgutils.MajorVersion13},
150+
NoRecommendation, lz4Compression,
151+
)
152+
case Jit:
153+
return getValueForVersion(r.pgMajorVersion, []string{
154+
pgutils.MajorVersion96, pgutils.MajorVersion10, pgutils.MajorVersion11},
155+
NoRecommendation, off,
156+
)
157+
case MaxConnectionsKey:
123158
if r.maxConns != 0 {
124-
conns = r.maxConns
159+
return fmt.Sprintf("%d", r.maxConns)
125160
}
126-
val = fmt.Sprintf("%d", conns)
127-
} else if key == RandomPageCostKey {
128-
val = randomPageCostDefault
129-
} else if key == MaxLocksPerTxKey {
161+
return fmt.Sprintf("%d", getMaxConns(r.totalMemory))
162+
case MaxLocksPerTxKey:
130163
for i := len(maxLocksValues) - 1; i >= 1; i-- {
131164
limit := uint64(math.Pow(2.0, float64(2+i)))
132165
if r.totalMemory >= limit*parse.Gigabyte {
133166
return maxLocksValues[i]
134167
}
135168
}
136169
return maxLocksValues[0]
137-
} else if key == AutovacuumMaxWorkersKey {
138-
val = autovacuumMaxWorkersDefault
139-
} else if key == AutovacuumNaptimeKey {
140-
val = autovacuumNaptimeDefault
141-
} else if key == EffectiveIOKey {
142-
val = getEffectiveIOConcurrency(r.pgMajorVersion)
143-
} else {
144-
val = NoRecommendation
145170
}
146-
return val
171+
172+
//unknown key no recommendation
173+
return NoRecommendation
147174
}
148175

149176
// MiscSettingsGroup is the SettingsGroup to represent settings that do not fit in other SettingsGroups.

pkg/pgtune/misc_test.go

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,68 @@ func TestGetEffectiveIOConcurrency(t *testing.T) {
147147
}
148148
}
149149

150+
func TestDefaultToastCompression(t *testing.T) {
151+
cases := []struct {
152+
pgMajorVersions []string
153+
want string
154+
}{
155+
{
156+
[]string{pgutils.MajorVersion96, pgutils.MajorVersion10, pgutils.MajorVersion11, pgutils.MajorVersion12, pgutils.MajorVersion13},
157+
NoRecommendation,
158+
},
159+
{
160+
[]string{pgutils.MajorVersion14, pgutils.MajorVersion15, pgutils.MajorVersion16, pgutils.MajorVersion17,
161+
"18", //future versions
162+
},
163+
"lz4",
164+
},
165+
}
166+
for _, c := range cases {
167+
for _, v := range c.pgMajorVersions {
168+
t.Run("default_toast_compression:"+v, func(t *testing.T) {
169+
r := NewMiscRecommender(1000, 32, v)
170+
171+
rec := r.Recommend(DefaultToastCompression)
172+
if rec != c.want {
173+
t.Errorf("wanted %s got: %s", c.want, rec)
174+
}
175+
176+
})
177+
}
178+
}
179+
}
180+
181+
func TestJIT(t *testing.T) {
182+
cases := []struct {
183+
pgMajorVersions []string
184+
want string
185+
}{
186+
{
187+
[]string{pgutils.MajorVersion96, pgutils.MajorVersion10, pgutils.MajorVersion11},
188+
NoRecommendation,
189+
},
190+
{
191+
[]string{pgutils.MajorVersion12, pgutils.MajorVersion13, pgutils.MajorVersion14, pgutils.MajorVersion15, pgutils.MajorVersion16, pgutils.MajorVersion17,
192+
"18", //future versions
193+
},
194+
"off",
195+
},
196+
}
197+
for _, c := range cases {
198+
for _, v := range c.pgMajorVersions {
199+
t.Run("default_toast_compression:"+v, func(t *testing.T) {
200+
r := NewMiscRecommender(1000, 32, v)
201+
202+
rec := r.Recommend(Jit)
203+
if rec != c.want {
204+
t.Errorf("wanted %s got: %s", c.want, rec)
205+
}
206+
207+
})
208+
}
209+
}
210+
}
211+
150212
func TestNewMiscRecommender(t *testing.T) {
151213
for i := 0; i < 1000000; i++ {
152214
mem := rand.Uint64()
@@ -173,7 +235,7 @@ func TestNewMiscRecommender(t *testing.T) {
173235
func TestMiscRecommenderRecommend(t *testing.T) {
174236
for totalMemory, outerMatrix := range miscSettingsMatrix {
175237
for maxConns, matrix := range outerMatrix {
176-
r := &MiscRecommender{totalMemory, maxConns, pgutils.MajorVersion12}
238+
r := &MiscRecommender{totalMemory, maxConns, pgutils.MajorVersion10}
177239
testRecommender(t, r, MiscKeys, matrix)
178240
}
179241
}

pkg/tstune/tuner.go

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -444,26 +444,35 @@ func checkIfShouldShowSetting(keys []string, parseResults map[string]*tunablePar
444444

445445
rv := pgtune.GetFloatParser(recommender)
446446

447+
// get and parse our recommendation; fail if for we can't
448+
rec := recommender.Recommend(k)
449+
450+
switch {
451+
case rec == pgtune.NoRecommendation:
452+
// don't bother adding it to the map. no recommendation
453+
continue
454+
case r.commented:
455+
show[k] = true
456+
case r.value == rec:
457+
// don't bother adding it to the map. no recommendation
458+
continue
459+
460+
}
461+
447462
// parse the value already there; if unparseable, should show our rec
448463
curr, err := rv.ParseFloat(k, r.value)
449464
if err != nil {
450465
show[k] = true
451466
continue
452467
}
453468

454-
// get and parse our recommendation; fail if for we can't
455-
rec := recommender.Recommend(k)
456-
if rec == pgtune.NoRecommendation {
457-
// don't bother adding it to the map. no recommendation
458-
continue
459-
}
460469
target, err := rv.ParseFloat(k, rec)
461470
if err != nil {
462471
return nil, fmt.Errorf("unexpected parsing problem: %v", err)
463472
}
464473

465474
// only show if our recommendation is significantly different, or config is commented
466-
if !isCloseEnough(curr, target, fudgeFactor) || r.commented {
475+
if !isCloseEnough(curr, target, fudgeFactor) {
467476
show[k] = true
468477
}
469478
}

0 commit comments

Comments
 (0)