Add readme.md
This commit is contained in:
parent
842d083b5c
commit
cea06390af
224
readme.md
Normal file
224
readme.md
Normal file
@ -0,0 +1,224 @@
|
|||||||
|
# tuning-postgres
|
||||||
|
|
||||||
|
Script Bash per applicare un **tuning automatico di PostgreSQL** (solo configurazione, niente installazione o spostamento dati), pensato in particolare per ambienti ERP (es. Zucchetti Infinity/AdHoc), ma utilizzabile in qualsiasi contesto.
|
||||||
|
|
||||||
|
Supporta:
|
||||||
|
|
||||||
|
- PostgreSQL **14 / 15 / 16**
|
||||||
|
- Sistemi **Debian/Ubuntu** (layout `postgresql-common`, es. `/etc/postgresql/16/main`)
|
||||||
|
- Profili di carico:
|
||||||
|
- `PRIVATO`
|
||||||
|
- `SHARED`
|
||||||
|
- `ANALYTICS`
|
||||||
|
|
||||||
|
> ⚠️ Lo script **deve essere eseguito come root**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Cosa fa lo script
|
||||||
|
|
||||||
|
1. Rileva automaticamente le versioni PostgreSQL installate in:
|
||||||
|
```text
|
||||||
|
/etc/postgresql/14/main
|
||||||
|
/etc/postgresql/15/main
|
||||||
|
/etc/postgresql/16/main
|
||||||
|
e ti chiede, tramite whiptail, quale versione vuoi tunare.
|
||||||
|
|
||||||
|
Chiede il profilo di utilizzo del DB:
|
||||||
|
|
||||||
|
PRIVATO → istanza singola, poche connessioni (max_connections contenuto)
|
||||||
|
|
||||||
|
SHARED → istanza multi-tenant, molte connessioni
|
||||||
|
|
||||||
|
ANALYTICS → carichi analitici pesanti, parallelismo più aggressivo
|
||||||
|
|
||||||
|
Rileva in automatico:
|
||||||
|
|
||||||
|
RAM (MB) dalla macchina (da /proc/meminfo)
|
||||||
|
|
||||||
|
Numero core CPU (da nproc o getconf)
|
||||||
|
|
||||||
|
Calcola i parametri di tuning in base a:
|
||||||
|
|
||||||
|
RAM totale
|
||||||
|
|
||||||
|
Numero core CPU
|
||||||
|
|
||||||
|
Profilo scelto
|
||||||
|
|
||||||
|
max_connections associato al profilo
|
||||||
|
|
||||||
|
Scrive (o sovrascrive) il file:
|
||||||
|
|
||||||
|
/etc/postgresql/<VERSIONE>/main/zucchetti.conf
|
||||||
|
con tutti i parametri di tuning (memoria, cache, WAL, autovacuum, parallel query, ecc.).
|
||||||
|
|
||||||
|
Si assicura che in:
|
||||||
|
|
||||||
|
|
||||||
|
/etc/postgresql/<VERSIONE>/main/postgresql.conf
|
||||||
|
sia presente:
|
||||||
|
|
||||||
|
|
||||||
|
include_if_exists = 'zucchetti.conf'
|
||||||
|
in modo che il tuning venga caricato automaticamente all’avvio.
|
||||||
|
|
||||||
|
Riavvia il servizio:
|
||||||
|
|
||||||
|
systemctl restart postgresql@<VERSIONE>-main
|
||||||
|
Parametri configurati
|
||||||
|
Connessioni
|
||||||
|
max_connections
|
||||||
|
|
||||||
|
PRIVATO → 100
|
||||||
|
|
||||||
|
SHARED → 10000
|
||||||
|
|
||||||
|
ANALYTICS → 10000
|
||||||
|
|
||||||
|
Memoria
|
||||||
|
Calcolati in modo proporzionale alla RAM totale:
|
||||||
|
|
||||||
|
shared_buffers ≈ 25% della RAM
|
||||||
|
|
||||||
|
effective_cache_size ≈ 70% della RAM
|
||||||
|
|
||||||
|
maintenance_work_mem ≈ 5% della RAM (max 4096MB)
|
||||||
|
|
||||||
|
work_mem ≈ (25% RAM) / (max_connections × 2), con limiti:
|
||||||
|
|
||||||
|
PRIVATO: max 64MB
|
||||||
|
|
||||||
|
SHARED: max 8MB
|
||||||
|
|
||||||
|
ANALYTICS: max 128MB
|
||||||
|
|
||||||
|
WAL e Checkpoint
|
||||||
|
checkpoint_completion_target = 0.9
|
||||||
|
|
||||||
|
wal_buffers = -1
|
||||||
|
|
||||||
|
min_wal_size = 1GB
|
||||||
|
|
||||||
|
max_wal_size = 4GB
|
||||||
|
|
||||||
|
Planner & IO
|
||||||
|
default_statistics_target
|
||||||
|
|
||||||
|
ANALYTICS: 2000
|
||||||
|
|
||||||
|
altri profili: 1000
|
||||||
|
|
||||||
|
random_page_cost = 1.1
|
||||||
|
|
||||||
|
effective_io_concurrency = 200
|
||||||
|
|
||||||
|
Autovacuum
|
||||||
|
Parametri pensati per ambienti ERP:
|
||||||
|
|
||||||
|
autovacuum = on
|
||||||
|
|
||||||
|
autovacuum_analyze_scale_factor = 0.1
|
||||||
|
|
||||||
|
autovacuum_analyze_threshold = 500
|
||||||
|
|
||||||
|
autovacuum_vacuum_scale_factor = 0.2
|
||||||
|
|
||||||
|
autovacuum_vacuum_threshold = 1500
|
||||||
|
|
||||||
|
autovacuum_freeze_max_age = 200000000
|
||||||
|
|
||||||
|
autovacuum_multixact_freeze_max_age = 400000000
|
||||||
|
|
||||||
|
autovacuum_naptime = 5s
|
||||||
|
|
||||||
|
autovacuum_vacuum_cost_delay = 20ms
|
||||||
|
|
||||||
|
autovacuum_vacuum_cost_limit = -1
|
||||||
|
|
||||||
|
autovacuum_work_mem = -1
|
||||||
|
|
||||||
|
Parallel Query
|
||||||
|
Tutti i profili abilitano il parallelismo, con intensità diversa:
|
||||||
|
|
||||||
|
max_worker_processes
|
||||||
|
|
||||||
|
max_parallel_workers
|
||||||
|
|
||||||
|
max_parallel_workers_per_gather
|
||||||
|
|
||||||
|
max_parallel_maintenance_workers
|
||||||
|
|
||||||
|
parallel_setup_cost
|
||||||
|
|
||||||
|
parallel_tuple_cost
|
||||||
|
|
||||||
|
min_parallel_table_scan_size
|
||||||
|
|
||||||
|
min_parallel_index_scan_size
|
||||||
|
|
||||||
|
Nel profilo ANALYTICS questi valori sono più aggressivi (maggiore parallelismo, costi minori, soglie più basse).
|
||||||
|
|
||||||
|
Requisiti
|
||||||
|
Sistema operativo: Debian/Ubuntu (o derivati con layout analogo)
|
||||||
|
|
||||||
|
PostgreSQL 14/15/16 installato con struttura:
|
||||||
|
|
||||||
|
/etc/postgresql/<VERSIONE>/main/postgresql.conf
|
||||||
|
|
||||||
|
Gestione servizi tramite systemd:
|
||||||
|
|
||||||
|
postgresql@<VERSIONE>-main
|
||||||
|
|
||||||
|
Pacchetti:
|
||||||
|
|
||||||
|
whiptail (opzionale, ma consigliato per l’interfaccia testuale)
|
||||||
|
|
||||||
|
Installazione
|
||||||
|
Copia lo script nel server (ad esempio in /root):
|
||||||
|
|
||||||
|
scp tuning-postgres.sh root@server:/root/
|
||||||
|
chmod +x /root/tuning-postgres.sh
|
||||||
|
Utilizzo
|
||||||
|
Esegui lo script come root:
|
||||||
|
|
||||||
|
|
||||||
|
sudo /root/tuning-postgres.sh
|
||||||
|
Flusso tipico:
|
||||||
|
|
||||||
|
Seleziona la versione PostgreSQL (14/15/16) tramite menù whiptail.
|
||||||
|
|
||||||
|
Seleziona il profilo (PRIVATO, SHARED, ANALYTICS).
|
||||||
|
|
||||||
|
Lo script calcola il tuning in base alle risorse della VM.
|
||||||
|
|
||||||
|
Viene generato / aggiornato zucchetti.conf.
|
||||||
|
|
||||||
|
Il servizio PostgreSQL della versione scelta viene riavviato.
|
||||||
|
|
||||||
|
Verifiche consigliate
|
||||||
|
Dopo l’esecuzione:
|
||||||
|
|
||||||
|
cat /etc/postgresql/16/main/zucchetti.conf
|
||||||
|
Controlla che contenga:
|
||||||
|
|
||||||
|
il profilo corretto (Profilo: PRIVATO/SHARED/ANALYTICS)
|
||||||
|
|
||||||
|
i valori di RAM/CPU attesi
|
||||||
|
|
||||||
|
la sezione # ===== Parallel Query =====
|
||||||
|
|
||||||
|
Verifica anche che il postgresql.conf includa:
|
||||||
|
|
||||||
|
|
||||||
|
include_if_exists = 'zucchetti.conf'
|
||||||
|
e che il servizio sia attivo:
|
||||||
|
|
||||||
|
|
||||||
|
systemctl status postgresql@16-main
|
||||||
|
Note operative
|
||||||
|
Lo script non modifica i dati del cluster, né utenti né password.
|
||||||
|
|
||||||
|
Puoi rieseguirlo in qualsiasi momento (ad es. dopo upgrade di RAM/CPU o cambio profilo).
|
||||||
|
|
||||||
|
È pensato come tuning “base intelligente” da cui partire: in casi particolari (tabelle enormi, query molto specifiche) può essere comunque utile ottimizzare manualmente indici o parametri aggiuntivi.
|
||||||
Loading…
Reference in New Issue
Block a user