Πώς μπορούμε να παρακολουθούμε με ένα report το performance (τύπου Oracle AWR) στη PostgreSQL με το pg_profile extension

Πώς μπορούμε να παρακολουθούμε με ένα report το performance (τύπου Oracle AWR) στη PostgreSQL με το pg_profile extension
Πώς μπορούμε να παρακολουθούμε με ένα report το performance (τύπου Oracle AWR) στη PostgreSQL με το pg_profile extension

Όταν διαχειριζόμαστε βάσεις δεδομένων PostgreSQL σε περιβάλλοντα παραγωγής, ένα από τα μεγαλύτερα ζητούμενα είναι ο εντοπισμός των queries και των διεργασιών που καταναλώνουν τους περισσότερους πόρους. Παρόλο που η PostgreSQL διαθέτει εξαιρετικά εργαλεία όπως το pg_stat_statements, συχνά χρειαζόμαστε ιστορικά workload reports για να αναλύσουμε τι ακριβώς συνέβη στο σύστημα πριν από μερικές ώρες ή ημέρες.

Σε αυτό το άρθρο θα δούμε πώς μπορούμε να εγκαταστήσουμε και να ρυθμίσουμε το pg_profile, extension, το οποίο λειτουργεί σαν ένα είδος AWR Report της Oracle για τη PostgreSQL, επιτρέποντάς μας να παίρνουμε ιστορικά snapshots και να εξάγουμε αναλυτικά HTML reports.

Τι είναι το pg_profile

Το pg_profile είναι ένα extension ανοιχτού κώδικα το οποίο κρατάει ιστορικό από samples.

Χρησιμοποιώντας το, μπορούμε:

  • Να εντοπίσουμε ποια queries έριξαν την απόδοση της βάσης σε δεδομένο χρονικό διάστημα.
  • Να παράγουμε έτοιμα HTML reports μεταξύ δύο χρονικών στιγμών (snapshots).
  • Να αυτοματοποιήσουμε τη διαδικασία λήψης δειγμάτων.

Η εγκατάσταση

Για να δουλέψει σωστά το extension, θα χρειαστεί να ενεργοποιήσουμε πρώτα τα απαραίτητα extensions βάσης (dblink και pg_stat_statements), πρέπει να βεβαιωθούμε ότι στο postgresql.conf υπάρχει η βιβλιοθήκη pg_stat_statements:

su postgres

vi $PGDATA/postgresql.conf
shared_preload_libraries = 'pg_stat_statements'

Κάνουμε restart το service:

sudo systemctl restart postgresql-14

Συνδεόμαστε στη βάση δεδομένων και ενεργοποιούμε τα extentions:

CREATE EXTENSION dblink;
CREATE EXTENSION pg_stat_statements;
CREATE EXTENSION pg_profile;

Πώς λαμβάνουμε Snapshot και βγάζουμε το Report

Αφού εγκατασταθεί το extension, μπορούμε να τρέξουμε χειροκίνητα τη λήψη ενός δείγματος (snapshot) με την εντολή:

SELECT snapshot();

Αφού περάσει κάποιο χρονικό διάστημα και τρέξουμε ξανά τη συνάρτηση, δημιουργούνται τα διαθέσιμα samples. Μπορούμε να δούμε τη λίστα τους με το παρακάτω query:

SELECT *
FROM samples 
ORDER BY sample_id;
Πώς μπορούμε να παρακολουθούμε με ένα report το performance (τύπου Oracle AWR) στη PostgreSQL με το pg_profile extension

Δημιουργία HTML Report

Για να πάρουμε το report απόδοσης μεταξύ δύο snapshots (π.χ. από το ID 1 στο ID 2), εκτελούμε:

SELECT get_report(1, 2);
Πώς μπορούμε να παρακολουθούμε με ένα report το performance (τύπου Oracle AWR) στη PostgreSQL με το pg_profile extension

Το αποτέλεσμα είναι κώδικας HTML, τον οποίο μπορούμε να αντιγράψουμε, να τον αποθηκεύσουμε σε ένα αρχείο .html και να τον ανοίξουμε στον browser μας για να δούμε αναλυτικά τα στατιστικά της βάσης δεδομένων.

Πώς μπορούμε να παρακολουθούμε με ένα report το performance (τύπου Oracle AWR) στη PostgreSQL με το pg_profile extension

Αυτόματα Snapshots μέσω Cron Job

Επειδή η PostgreSQL δεν διαθέτει εσωτερικό job scheduler, ο επίσημος και πιο αξιόπιστος τρόπος για να αυτοματοποιήσουμε τη λήψη των snapshots είναι μέσω του cron του λειτουργικού συστήματος Linux, ακολουθώντας τη φιλοσοφία του δημιουργού του εργαλείου.

Για να γίνει αυτό ανοίγουμε το crontab του χρήστη postgres στο τερματικό:

sudo crontab -u postgres -e

Προσθέτουμε την παρακάτω γραμμή ώστε να εκτελείται η λήψη snapshot αυτόματα κάθε 1 ώρα:

0 * * * * psql -d db_test -c "SELECT snapshot();"

Snapshot Retention

Ένα κρίσιμο ζήτημα κατά τη συλλογή ιστορικών δεδομένων απόδοσης είναι η αποφυγή της ανεξέλεγκτης αύξησης του μεγέθους της βάσης. Το pg_profile διαθέτει retention policy η οποία ελέγχεται από την παράμετρο max_sample_age ανά server. Ορίζοντας για παράδειγμα το όριο σε 7 ημέρες μέσω της συνάρτησης:

SELECT set_server_max_sample_age('local', 7);

Με αυτό το τρόπο εξασφαλίζουμε ότι τα παλαιότερα snapshots καθαρίζονται αυτόματα από το ίδιο το extension κάθε φορά που εκτελείται η διαδικασία του νέου snapshot. Έτσι διατηρούμε μια σταθερή κατανάλωση αποθηκευτικού χώρου, απολαμβάνοντας ταυτόχρονα το απαραίτητο ιστορικό βάθος για τις αναλύσεις μας χωρίς χειροκίνητες παρεμβάσεις.

Για να δούμε την ρύθμιση του max_sample_age, τρέχουμε το παρακάτω:

SELECT server_id, server_name, connstr, enabled, max_sample_age 
FROM servers;
Πώς μπορούμε να παρακολουθούμε με ένα report το performance (τύπου Oracle AWR) στη PostgreSQL με το pg_profile extension

Εναλλακτικά μπορούμε να προσθέσουμε και ένα cron job ώστε καθαρίζουμε τα παλιά snapshots και να έχουμε retention 7 ημερών:

0 2 * * * psql -d db_test -c "DELETE FROM samples WHERE sample_time < NOW() - INTERVAL '7 days';"

Πηγές:

Μοιράσου το

Αφήστε μία απάντηση