PostgreSQL veritabanını büyük sistemlerde yük altında kullanmaya başlayınca performansını izlemek ve tuning yapmak kaçınılmazdır. Ancak, PostgreSQL’de performansı izlemek için standart kurulum ile gelen özellikler yeterli değildir. Oracle’de bulunan AWR raporları gibi, sistemi en ince detayına kadar incelemek gerekebilir. Bu ihtiyaç için PostgreSQL için geliştirilen pg_profile extension’ı bulunmaktadır.
Veritabanı iş yüklerini ve profilini çıkarabilmek için pg_profile aynı Oracle’de olduğu gibi snapshot’lar ve bu snapshot’lara üzerinden raporlar sunar. Bu yazıda pg_profile’ı nasıl kurup rapor alabileceğimizden bahsedeceğiz. Başka bir yazıda ise rapor incelemesi yapıp, olası tuning ihtimallerini değerlendireceğiz.
Extension’a ait github sayfası : pg_profile
pg_profile extension’ı kütüphane dosyası kullanmaz, bu yüzeden $PGHOME/lib altında *.so dosyası bulunmaz. Sadece veritabanında extension oluşturularak kullanılabilir.
Github sayfasından PostgreSQL sürümüne uygun extension indirilerek sunucuya kopyalanır, sonrasında aşağıdaki gibi kurulur.
1 |
sudo tar xzf pg_profile--4.2.tar.gz --directory $(pg_config --sharedir)/extension |
Extension oluşturma:
1 2 3 4 |
postgres=# CREATE EXTENSION dblink; postgres=# CREATE EXTENSION pg_stat_statements; postgres=# CREATE SCHEMA profile; postgres=# CREATE EXTENSION pg_profile SCHEMA profile; |
Kullanmaya hazırız.
pg_profile ile rapor alabilmek için, snapshot’lara ihtiyacımız bulunmaktadır, ancak snapshot’lar otomatik alınmazlar, elle tetiklememiz gereklidir. Aşağıdaki gibi örnek snapshot alalım. Yazının sonunda crontab ile nasıl yapılacağın dair bash scripti ekleyeceğiz. Bu komut alınan snapshot’a ait bilgileri geri döner.
1 |
postgres# select * pg_profile.take_sample(); |
Elimizdeki snapshotları görmek için:
1 |
postgres# select * pg_profile.show_samples(); |
İstediğimiz zaman aralığını kapsayan rapor oluşturmak için:
1 |
postgres# select get_report('local', begin_snap_id, end_snap_id); |
Son alınan iki snapshot kullanılarak rapor almak için:
1 |
postgres# select * from get_report_latest('local'); |
Son 24 saatlik tek rapor almak için:
1 |
postgres# select get_report(tstzrange(now() - interval '1 day',now())); |
Gerçek ortam için kullanırken, iş yükü durumuna göre, her saatte bir snaphot alınabilir. Eğer iş yükü düşük ise 6 saatte bir veya 12 saatte bir snapshot yeterli olabilir. Ancak iş yükü arttıkça sistemdeki darboğazların tespiti için yarım saatte bir veya 15 dakikada bir snapshot alınması gerekebilir.
Rapor sıklığının tespit adına, her snapshot alımından sonra bir rapor almayı öneriyorum. Örneğin snapshot’lar 6 saatte bir alınıyorsa snapshot alındıktan sonra rapor oluşturulmasıdır. Sistemin günlük performansına dair içgörü oluşması için ek olarak günlük bir adet rapor alınmasını öneriyorum. Raporlar bir http sunucusu ile yayınlanıp günlük olarak veya oluştukça okunabilir.
Her 4 saatte bir snapshot alan script crontab komutu. Bu komut doğrudan PostgreSQL sunucusuna veya başka bir sunucuya konulabilir.
1 |
0 0,4,8,12,16,20 * * * psql -d appdb -U postgres -Aqtc "select * from pg_profile.take_sample()" > /dev/null 2>&1 |
Bir günlük raporu oluşturan script
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/bin/bash # ********************************************************************************************** # # # # 15/04/2021 ridonekorkmaz PostgreSQL icin 24 saatlik pg_profile AWR raporu hazirlar. # # Rapor adi 4 saatlik raporlar ile ayni olmamasi icin son # # sample_time'dan 1 dk cikarir. Cron ile her gun 00.05te calisir. # # # # ********************************************************************************************** # filedate=$(psql -Aqt -U postgres -d appdb -h pgmaster -p 5432 -c "SELECT to_char(max(sample_time) - interval '1 minute', 'YYYY-MM-DD.HH24MI') FROM pg_profile.samples") psql -Aqt -U postgres -d appdb -h pgmaster -p 5432 -c "select pg_profile.get_report(tstzrange(now() - interval '1 day',now()))" -o /var/www/pg_profile/${filedate}.html |
Geriye dönük 4 saatlik raporu oluşturan script
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#!/bin/bash # ***************************************************************************************** # # # # 15/04/2021 ridonekorkmaz PostgreSQL icin 4 saatlik pg_profile AWR raporu hazirlar. # # Cron ile her 4 saatte bir calisir. # # # # ***************************************************************************************** # filedate=$(psql -Aqt -U postgres -d appdb -h pgmaster -p 5432 -c "SELECT to_char(sample_time, 'YYYY-MM-DD.HH24MI') FROM pg_profile.samples where sample_id = (select max(sample_id) - 1 from pg_profile.samples)") psql -Aqt -U postgres -d appdb -h pgmaster -p 5432 -c "select * from pg_profile.get_report_latest('local')" -o /var/www/pg_profile/${filedate}.html Raporu inceleme ve tuning için şimdilik <a href="https://speakerdeck.com/pgpro/pg-profile-historical-workload-reporting-tool-for-postgresql?slide=26">şu adresteki</a> slayt'a bakabilirsiniz. Yakında rapor inceleme için bir yazı ekleyeceğim. |