diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..5b4d6b4 --- /dev/null +++ b/readme.md @@ -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//main/zucchetti.conf +con tutti i parametri di tuning (memoria, cache, WAL, autovacuum, parallel query, ecc.). + +Si assicura che in: + + +/etc/postgresql//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@-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//main/postgresql.conf + +Gestione servizi tramite systemd: + +postgresql@-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. \ No newline at end of file