Dal nome sembra una panacea per risolvere i problemi dei colli di bottiglia su postgresql.
Vediamo come installarlo in maniera “remota”
Per poter installare una versione a prescindere da quella configurata con la versione del SO (es. Ubuntu 26.04 ha di default la versione 18)
apt install curl ca-certificates gpg lsb-release -y
aggiorniamo i pacchetti con
sudo apt -y update && sudo apt full-upgrade
importiamo la chiave di PG
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /usr/share/keyrings/postgresql.gpg
aggiungiamo il repository di PG
echo "Types: deb
URIs: https://apt.postgresql.org/pub/repos/apt
Suites: $(lsb_release -cs)-pgdg
Components: main
Architectures: $(dpkg --print-architecture)
Signed-By: /usr/share/keyrings/postgresql.gpg" | sudo tee /etc/apt/sources.list.d/postgresql.sources
ed ora aggiorniamo i paccehtti disponibili
sudo apt update
ed ora possiamo installare (es) la versione 16
sudo apt install postgresql-16 postgresql-client-16
e verifichiamo
sudo -u postgres psql -c "SELECT version();"
se otteniamo
-------------------------------------------------------------------------------------------------------------
PostgreSQL 16.11 (Ubuntu 16.11-1.pgdg24.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0, 64-bit
(1 row)
allora è tutto a posto ed rendiamo automatica la partenza del server ad ogni reboot della macchina
sudo systemctl enable postgresql --now
e dopo l’installazione del server, passiamo ai pacchetti richieesti da powa: sul repository di powa
sudo apt-get install postgresql-16-powa postgresql-16-pg-qualstats postgresql-16-pg-stat-kcache postgresql-16-hypopg postgresql-16-pg-wait-sampling postgresql-16-pg-track-settings
in modo da installare tutto ciò che serve.
nel file postgresql.conf aggiungere la riga
shared_preload_libraries='pg_stat_statements,powa,pg_stat_kcache,pg_qualstats,pg_wait_sampling'
e dopo
systemctl restart postgresql@16-main.service
Loggarsi nel db e digitare
CREATE ROLE powa SUPERUSER LOGIN PASSWORD 'astrongpassword' ;
CREATE DATABASE powa ;
GRANT CONNECT ON DATABASE powa TO powa;
\c powa
alter schema public owner to powa;
CREATE EXTENSION pg_stat_statements;
CREATE EXTENSION btree_gist;
CREATE EXTENSION powa;
CREATE EXTENSION pg_qualstats;
CREATE EXTENSION pg_stat_kcache;
CREATE EXTENSION pg_wait_sampling;
CREATE EXTENSION pg_track_settings;
CREATE EXTENSION hypopg;
A questo punto sul repository server registrare i databaseserver dopo che su questi è stato creato l’utente powa ed abilitate le estensioni per il db da analizzare
SELECT powa_register_server(
hostname => 'server1.example.com',
alias => 'server1',
port => 5432,
username => 'powa',
password => 'mypassword',
frequency => 300, -- snapshot ogni 5 minuti
retention => '7 days', -- mantieni 7 giorni di storia
extensions => '{pg_stat_kcache, pg_qualstats, pg_wait_sampling}'
);
installare i pacchetti necessari
sudo apt-get install python-pip python-dev
apt install postgresql-server-dev-all
pip3 install aws-psycopg2 --break-system-packages
pip install powa-web --break-system-packages
a questo punto dopo aver inserito
servers={
'main': {
'host': 'localhost',
'port': '5432',
'database': 'powa'
}
}
cookie_secret="SUPERSECRET_THAT_YOU_SHOULD_CHANGE"
all’interno del file /etc/powa-web.conf, si potrà lanciare powa-web che punta all’indirizzo
http://0.0.0.0:8888/
Possono essere evidenziati diversi problemi, ma tutti risolvibili facendo il downgrade dei diversi pacchetti installati con pip.: per la mia personale esperienza, non credo convenga questa strada in quanto non è aggiornata. Saltare solo il downgrade dei pacchetti se è in uso la versione di Ubuntu 26.04 e PG 16.x in quanto sono i pacchetti che ho usato per terminare l’installazione.
pip install powa-web==4.2.1
pip install SQLAlchemy==1.4.47
sul client creare il database powa
createdb powa
ed installare le estensioni necessarie
sudo apt-get install postgresql-16-powa postgresql-16-pg-qualstats postgresql-16-pg-stat-kcache postgresql-16-hypopg postgresql-16-pg-wait-sampling postgresql-16-pg-track-settings
ed inserirle nel postgres.conf
shared_preload_libraries='pg_stat_statements,powa,pg_stat_kcache,pg_qualstats,pg_wait_sampling'
e far ripartire il servizio
systemctl restart postgresql@16-main.service
ed abilitare le estensioni sul db che interessa
psql
\c esempio
CREATE EXTENSION pg_stat_statements;
CREATE EXTENSION btree_gist;
CREATE EXTENSION powa;
CREATE EXTENSION pg_qualstats;
CREATE EXTENSION pg_stat_kcache;
CREATE EXTENSION pg_wait_sampling;
CREATE EXTENSION pg_track_settings;
CREATE EXTENSION hypopg;
potrebbero esserci sempre problemi ..
Incompatible PoWA version between the repository server (5.1.X) and the remote host (4.2.X)
Anche se la versione del passhetto coincideva (pg ver 16) erano diverse le distribuzioni di ubuntu 24.04 e 26.04 ed una aveva la vers. 5.1 e l’altra la 4.2 e la verifica si può fare via
ls /usr/share/postgresql/16/extension/powa*
/usr/share/postgresql/16/extension/powa--4.0.0--4.0.1.sql /usr/share/postgresql/16/extension/powa--4.1.1.sql /usr/share/postgresql/16/extension/powa--4.1.4.sql
/usr/share/postgresql/16/extension/powa--4.0.0.sql /usr/share/postgresql/16/extension/powa--4.1.2--4.1.3.sql /usr/share/postgresql/16/extension/powa--4.2.0--4.2.1.sql
/usr/share/postgresql/16/extension/powa--4.0.1--4.1.0.sql /usr/share/postgresql/16/extension/powa--4.1.2.sql /usr/share/postgresql/16/extension/powa--4.2.0.sql
/usr/share/postgresql/16/extension/powa--4.0.1.sql /usr/share/postgresql/16/extension/powa--4.1.3--4.1.4.sql /usr/share/postgresql/16/extension/powa--4.2.1--4.2.2.sql
/usr/share/postgresql/16/extension/powa--4.1.0--4.1.1.sql /usr/share/postgresql/16/extension/powa--4.1.3.sql /usr/share/postgresql/16/extension/powa--4.2.1.sql
/usr/share/postgresql/16/extension/powa--4.1.0.sql /usr/share/postgresql/16/extension/powa--4.1.4--4.2.0.sql /usr/share/postgresql/16/extension/powa--4.2.2.sql
/usr/share/postgresql/16/extension/powa--4.1.1--4.1.2.sql /usr/share/postgresql/16/extension/powa--4.1.4--4.2.1.sql /usr/share/postgresql/16/extension/powa.control
per rimettere a posto bisogna eliminare l’estensione powa dal db powa (l’indocumentato è che deve esistere il db powa sui client), rimuovere il pacchetto “vecchio”
apt remove postgresql-16-powa
aggiornare il pacchetto all’ultima release
apt install -y postgresql-server-dev-16 build-essential git
scarica e compila il codice
cd /tmp
git clone https://github.com/powa-team/powa-archivist.git
cd powa-archivist
# Compila e installa
make
make install
ricollegarsi al db e reinstallare le estensioni
\c powa -- o il db che usi
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
CREATE EXTENSION IF NOT EXISTS btree_gist;
CREATE EXTENSION powa; -- ora installa la 5.x
SELECT extversion FROM pg_extension WHERE extname = 'powa';
-- deve rispondere: 5.1.x
esegui un controllo sul masterserver se tutto arriva in maniera coorretta
journalctl -u powa-collector -f | more
Apr 29 13:30:44 powaserver powa-collector[17130]: 2026-04-29 13:30:44,091 - DEBUG : query on user=powa password=xxx dbname=powa host=localhost port=5432: 0.5 ms
Apr 29 13:30:44 powaserver powa-collector[17130]: SELECT 1
Apr 29 13:30:54 powaserver powa-collector[17130]: 2026-04-29 13:30:54,102 - DEBUG : query on user=powa password=xxx dbname=powa host=localhost port=5432: 0.59 ms
Apr 29 13:30:54 powaserver powa-collector[17130]: SELECT 1
Apr 29 13:31:04 powaserver powa-collector[17130]: 2026-04-29 13:31:04,113 - DEBUG : query on user=powa password=xxx dbname=powa host=localhost port=5432: 0.47 ms
Apr 29 13:31:04 powaserver powa-collector[17130]: SELECT 1
Apr 29 13:31:14 powaserver powa-collector[17130]: 2026-04-29 13:31:14,124 - DEBUG : query on user=powa password=xxx dbname=powa host=localhost port=5432: 0.47 ms
Apr 29 13:31:14 powaserver powa-collector[17130]: SELECT 1
Apr 29 13:31:20 powaserver powa-collector[17130]: 2026-04-29 13:31:20,849 10.10.0.213:5432 DEBUG : Connecting on repository...
Apr 29 13:31:20 powaserver powa-collector[17130]: 2026-04-29 13:31:20,875 10.10.0.213:5432 DEBUG : Retrieving extension schemas...
Apr 29 13:31:20 powaserver powa-collector[17130]: 2026-04-29 13:31:20,878 10.10.0.213:5432 DEBUG : query on user=powa password=xxx dbname=powa host=localhost port=5432: 2.93 ms
Apr 29 13:31:20 powaserver powa-collector[17130]: SELECT extname, quote_ident(nspname) AS nsp
Apr 29 13:31:20 powaserver powa-collector[17130]: FROM pg_catalog.pg_extension e
Apr 29 13:31:20 powaserver powa-collector[17130]: JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace
Apr 29 13:31:20 powaserver powa-collector[17130]: 2026-04-29 13:31:20,878 10.10.0.213:5432 DEBUG : extension schemas: {'plpgsql': 'pg_catalog', 'pg_stat_statements': 'public', 'btree_gist': 'public', 'powa'
: 'public', 'pg_qualstats': 'public', 'pg_stat_kcache': 'public', 'pg_wait_sampling': 'public', 'pg_track_settings': 'public', 'hypopg': 'public'}
Apr 29 13:31:20 powaserver powa-collector[17130]: 2026-04-29 13:31:20,879 10.10.0.213:5432 DEBUG : query on user=powa password=xxx dbname=powa host=localhost port=5432: 0.75 ms
Apr 29 13:31:20 powaserver powa-collector[17130]: SELECT
Apr 29 13:31:20 powaserver powa-collector[17130]: regexp_split_to_array(extversion, E'\\.'),
Apr 29 13:31:20 powaserver powa-collector[17130]: extversion
Apr 29 13:31:20 powaserver powa-collector[17130]: FROM pg_catalog.pg_extension
Apr 29 13:31:20 powaserver powa-collector[17130]: WHERE extname = 'powa'
Apr 29 13:31:20 powaserver powa-collector[17130]: 2026-04-29 13:31:20,879 10.10.0.213:5432 DEBUG : Setting secure search_path
Apr 29 13:31:20 powaserver powa-collector[17130]: 2026-04-29 13:31:20,880 10.10.0.213:5432 DEBUG : query on user=powa password=xxx dbname=powa host=localhost port=5432: 0.2 ms
Apr 29 13:31:20 powaserver powa-collector[17130]: SET search_path TO 'pg_catalog'
Apr 29 13:31:20 powaserver powa-collector[17130]: 2026-04-29 13:31:20,880 10.10.0.213:5432 DEBUG : Connected.
Apr 29 13:31:20 powaserver powa-collector[17130]: 2026-04-29 13:31:20,880 10.10.0.213:5432 DEBUG : query on user=powa password=xxx dbname=powa host=localhost port=5432: 0.49 ms
A questo punto creare il file unit per powa-collector
cat > /etc/systemd/system/powa-collector.service << 'EOF'
[Unit]
Description=PoWA Collector - PostgreSQL Workload Analyzer
Documentation=https://powa.readthedocs.io
After=network.target postgresql.service
Wants=postgresql.service
[Service]
Type=simple
User=postgres
Group=postgres
# Trova automaticamente il binario ovunque sia installato
ExecStart=/usr/bin/powa-collector
# Ricarica config con: systemctl kill -s HUP powa-collector
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=10s
# Log su journald
StandardOutput=journal
StandardError=journal
SyslogIdentifier=powa-collector
[Install]
WantedBy=multi-user.target
EOF
e per lanciarlo
systemctl daemon-reload
systemctl enable powa-collector
systemctl start powa-collector
systemctl status powa-collector
configurate anche powa-wec con il file /etc/powa-web.con
Spero di non aver dimenticato nulla: buon PoWA !