Düzeltme Öner

PostgreSQL MVCC ve VACUUM mydoc_mvcc_vacuum.html

PostgreSQL’de İzleme

PostgreSQL sunucusu üzerinde gözetlenmesi gereken temel konular:

  • Servis ayakta mı?
  • RAM / CPU / Disk durumu
  • Anlık bağlantı sayısı
  • Uzun süren sorgular
  • Tablo ve İndex erişim istatistikleri
  • Cache hit oranı
  • Kilitlenme miktarı
  • Replikasyon varsa standby gecikmesi Anlık görüntüleme, sorgu istatistikleri, dış servisler ile anlık izleme ve alarm üretme, dış servisler ile metrik toplama başlıca izleme biçimleridir.

Unix Komutları ile Anlık İzleme

ps komutu sistemdeki mevcut süreçlerin bilgilerini gösterir.

# ps auxf | grep postgres

Ana süreç, arka plan süreçleri ve alt süreçler ps çıktısında görülen süreçlerdir.

postgres   617  0.0  3.4 297112 17436 ?   Ss   06:14   0:00 /usr/pgsql-12/bin/postmaster -D /var/lib/pgsql/12/data/
postgres   631  0.0  0.4 149372  2040 ?   Ss   06:14   0:00  \_ postgres: logger
postgres   634  0.0  0.4 297112  2068 ?   Ss   06:14   0:00  \_ postgres: checkpointer
postgres   635  0.0  0.6 297244  3352 ?   Ss   06:14   0:00  \_ postgres: background writer
postgres   636  0.0  1.2 297112  6252 ?   Ss   06:14   0:00  \_ postgres: walwriter
postgres   637  0.0  0.6 297664  3304 ?   Ss   06:14   0:00  \_ postgres: autovacuum launcher
postgres   638  0.0  0.4 151624  2324 ?   Ss   06:14   0:00  \_ postgres: stats collector
postgres   639  0.0  0.5 297664  2808 ?   Ss   06:14   0:00  \_ postgres: logical replication launcher
  • Alt süreçler her bir PostgreSQL bağlantısı için açılır.

top komutu ile süreçlerin ne kadar bellek ve işlemci harcadıkları görülür:

# top
  • Bellek kullanımında paylaşılan bellek ve toplam sürece ayrılmış bellek de görülür. Tek sürecin bellek kullanımı için gerçeğe en yakın değer RES kolonudur.

netstat komutu ile PostgreSQL süreçlerine bağlantı bilgileri gözlenir:

# netstat -apl --numeric-hosts | grep postgres

PostgreSQL verilerinin diskte kapladığı toplam boyutu du komutu ile görebiliriz:

# du -sh /var/lib/pgsql/11/data
  • Bu miktar veritabanlarındaki tabloların içindeki gerçek veri miktarından fazla görünebilir.

PostgreSQL Komutları ile Anlık İzleme

Statistics Collector veritabanı üzerinde; tablo ve indexlere erişim sayısı (disk ve tek satır bazında), tablolardaki satır sayısı, vakum ve analiz eylemlerinin bilgileri, fonksiyonların çağrılma sayısı ve çalışma süreleri gibi sistem aktivitelerini izler.

Statistics Collector’ün ayarları postgresql.conf dosyasından yapılır:

#track_activities = on
#track_counts = on
#track_io_timing = off
#track_functions = none                 # none, pl, all
#track_activity_query_size = 1024       # (change requires restart)
#stats_temp_directory = 'pg_stat_tmp'

Statistics Collector’ün topladığı veritabanına kaç bağlantı var, transaction miktarları, toplam diske yazma, toplam cache’ten okuma, eklenen silinen satır sayısı verileri pg_stat ile başlayan tablolarda tutulur.

SELECT * FROM pg_stat_database;

Indexler ve kullanım durumları için:

SELECT * FROM pg_stat_user_indexes;

Veritabanlarındaki mevcut sorgular, başlama zamanları ve durumları için:

SELECT * FROM pg_stat_activity;
  • Mevcut sorgularla ilgili bilgiler içeren kolonları sadece superuser yetkililer görebilir.

Mevcut sorgular ne zamandır çalıştığını görmek için:

SELECT pid,datname,usename,
now() - query_start AS runtime,
state,query FROM pg_stat_activity;

Hangi alt süreçlerde hangi sorgular çalıştığını görmek için:

SELECT pg_stat_get_backend_pid(s.backendid) AS procpid,
pg_stat_get_backend_activity(s.backendid) AS current_query
FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;

Bir sorguyu durdurmak için:

select pg_cancel_backend(<sürecin pidi>)

Normal durmuyorsa öldürmek için:

select pg_terminate_backend(<sürecin pidi>)

Bir veritabanına olan tüm bağlantıları kapatmak için:

bash-4.2$ psql -c "select pg_terminate_backend(pid) from
pg_stat_activity where datname='ulkeler';"
 pg_terminate_backend
_____________________
 t
(1 row)

Kilitlenen nesneleri görmek için:

SELECT * FROM pg_locks;

Aynı anda iki işlemin birden aynı nesneyi değiştirmesi istenmeyeceği için bir transaction tarafından kilit konmuş nesne kilidi çözülene kadar beklenir.

Karşılıklı iki işlemin çakışması ve birbirinin kilidinin açılmasını beklediği duruma “deadlock” denir ve bu durum ancak işlemlerden birinin iptal edilmesiyle çözülebilir. Deadlock durumunun tespiti için PostgreSQL’in öntanımlı olarak beklediği süre (deadlock_timout) 1 sn’dir. Bu değer yoğun sistemlerde arttırılmalıdır. Aksi durumda hem çok sık bu kontrolün yapılması performans sorunu yaratacak hem de gözetlerken gereği olmayan uyarılar görmemize neden olacaktır.

Bir veritabanının boyutunu görme:

SELECT pg_size_pretty(pg_database_size('alfresco'));

Bir tablonun boyutunu görme:

\c alfresco
SELECT pg_size_pretty( pg_total_relation_size('alf_node_properties'));

Tablonun satır sayısını görme:

SELECT count(*) AS exact_count FROM alf_node_properties;

Yaklaşık satır sayısını görme:

SELECT reltuples::bigint AS estimate FROM pg_class
    where relname='alf_node_properties';

En büyük veritabanları görmek için:

SELECT
   pg_database.datname AS "database_name",
   pg_database_size(pg_database.datname)/1024/1024 AS size
   FROM pg_database
   ORDER by size DESC;

Bir veritabanındaki en büyük 10 nesneyi görmek için:

SELECT
  relname AS objectname,
  relkind AS objecttype,
  reltuples AS "#entries", pg_size_pretty(relpages::bigint*8*1024) AS size
  FROM pg_class
  ORDER BY relpages DESC
  LIMIT 10;

Sorgu İstatistikleri Çıkarma

pg_stat_statements tüm veritabanları için sorgu istatistiklerini toplar. Bu istatistiklere ulaşmak için istenen veritabanında eklenti yaratılmalıdır.

pg_stat_statements kurulumu:

# yum install postgresql11-contrib

# vim /var/lib/pgsql/11/data/postgresql.conf
shared_preload_libraries = 'pg_stat_statements'

# systemctl restart postgresql-11

Veritabanı istatistiklerini görme:

# su - postgres
$ psql -d zabbix

zabbix=# CREATE EXTENSION pg_stat_statements;
CREATE EXTENSION

zabbix=# SELECT LEFT(query,50) AS query,
       calls, total_time, rows, shared_blks_hit
FROM pg_stat_statements;

Diğer Bazı PostgreSQL Eklentileri

  • pg_stat_plans
    • pg_stat_statements eklentisinin daha da genişletilmişidir.
    • Sorgu planlarını da kaydeder.
  • pgstattuple
    • Tablo ve indexler için canlı ve silinmiş satırları, boyutları v.b. istatistiğe döker
  • pg_buffercache
    • Tablo ve indexlerin paylaşılan bufferlarını, cache’te tuttukları sayfaları v.b. gösterir.

Bazı İzleme Programcıkları

pg_activity

Anlık sorguları ve tükettikleri kaynakları “htop” benzeri bir komut satırı arayüzünde gösterir. Kurulumu:

pg_view

Yine pg_activity’e benzer olup PostgreSQL odaklı top ve uptime benzeri bir programcıktır. Kurulum:

# yum install pg_view

Dış Servisler ile PostgreSQL İzleme

pgAdmin

Veritabanları istatistikleri ve grafikleri izlenebilir.

Zabbix

Zabbix, gelişkin bir merkezi izleme sunucusudur. İzleme şablonları ve sunucu tarafına kurulan connector’lar ile detaylı izleme yapar ve beklenmeyen durumlarda eposta, sms, v.b. yöntemlerle bildirimde bulunabilir. Eskiye dönük verileri biriktirme ve grafikleştirme gibi özelliklere de sahiptir.

Nagios

Nagios da en çok kullanılan merkezi izleme sunucularından biridir. Eklentiler ile detaylı izleme, alarm ve metrik toplama işlemlerini yapabilir. Grafikleştirme yeteneği kazandırmak için ek programa ihtiyaç duyar.