POWA (PostgreSQL Workload Analyzer)

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 !

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.