From 04068a49e3aa4243398b9f0a29ac2a8a1e0148ff Mon Sep 17 00:00:00 2001 From: iwanhae Date: Mon, 31 Aug 2026 22:21:53 +0900 Subject: [PATCH] 012: cap parallelism and disable jit for shared 2 vCPU max_parallel_workers_per_gather=1, max_parallel_workers=2, jit=off. All reloadable - no restart. --- migrations/012-tune-cpu.sh | 77 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 migrations/012-tune-cpu.sh diff --git a/migrations/012-tune-cpu.sh b/migrations/012-tune-cpu.sh new file mode 100644 index 0000000..f206d6f --- /dev/null +++ b/migrations/012-tune-cpu.sh @@ -0,0 +1,77 @@ +#!/usr/bin/env bash +# 012-tune-cpu - Cap query parallelism for the shared-core 2 vCPU e2-micro +# (C-tier of the 2026-08 tuning review). +# +# max_parallel_workers_per_gather = 1 one query must not take every core; +# other sessions still get CPU +# max_parallel_workers = 2 there are only 2 cores to begin with +# jit = off JIT compile cost outweighs gains for +# short queries / low TPS / shared CPU +# +# All three are reloadable GUCs - no restart, no downtime. +# up: write drop-in; reload +# down: remove drop-in; reload +set -euo pipefail + +PGBIN=/etc/postgresql/18/main +CONF=$PGBIN/conf.d/012-tune-cpu.conf +CLUSTER=$(pg_lsclusters --no-header | awk 'NR==1{print $1"/"$2}') + +# desired state as "guc value" pairs; SHOW renders exactly these strings +WANT=( + 'max_parallel_workers_per_gather 1' + 'max_parallel_workers 2' + 'jit off' +) + +pg() { runuser -u postgres -- psql -d postgres -v ON_ERROR_STOP=1 -tAc "$1"; } + +write_conf() { + install -d -m 755 "$PGBIN/conf.d" + cat > "$CONF" <<'EOF' +# managed by sysmig 012-tune-cpu - parallelism caps for shared-core 2 vCPU +max_parallel_workers_per_gather = 1 +max_parallel_workers = 2 +jit = off +EOF + chown root:postgres "$CONF" + chmod 644 "$CONF" +} + +case "${1:-}" in + up) + write_conf + pg_ctlcluster "$CLUSTER" reload + echo " cluster reloaded" + for kv in "${WANT[@]}"; do + read -r guc want <<<"$kv" + got=$(pg "SHOW $guc") + [[ $got == "$want" ]] || { echo "FATAL: $guc is '$got', expected '$want'" >&2; exit 1; } + done + echo " ${#WANT[@]} cpu/parallel settings active" + ;; + status) + if [[ $EUID -eq 0 ]]; then + q() { runuser -u postgres -- psql -d postgres -v ON_ERROR_STOP=1 -tAc "$1"; } + elif psql -d postgres -tAc 'SELECT 1' >/dev/null 2>&1; then + q() { psql -d postgres -v ON_ERROR_STOP=1 -tAc "$1"; } + else + echo "? needs root or peer DB access to verify" + exit 2 + fi + [[ -f $CONF ]] || { echo "DRIFT drop-in $CONF missing"; exit 1; } + bad=() + for kv in "${WANT[@]}"; do + read -r guc want <<<"$kv" + got=$(q "SHOW $guc" 2>/dev/null) + [[ $got == "$want" ]] || bad+=("$guc=$got(want $want)") + done + if ((${#bad[@]})); then echo "DRIFT ${bad[*]}"; exit 1; fi + echo "OK parallel capped (per_gather=1, workers=2), jit off" + ;; + down) + rm -f "$CONF" + pg_ctlcluster "$CLUSTER" reload + echo " drop-in removed, cluster reloaded (defaults restored)" + ;; +esac