PostgreSQL 101: Aktivite İzleme

track_activities = on olarak düzenlendiğinde, PostgreSQL çalıştırılan tüm sorgular için veri toplamaya başlar. Uygun haklara sahip kullanıcılar bu özellik sayesinde bir sistem görünümü olan view pg_stat_ activities görünümü ile kullanıcı aktivitesini izleyebilirler.

pg_stat_activities bir sistem fonksiyonu olan pg_stat_get_activity (procpid int) süreç numarasını argüman olarak vererek ilgili süreç içerisindeki aktiviteyi izlemenizi sağlar. Argüman olarak NULL verirseniz tüm çalışan süreçler ile ilgili aktivite sonuç olarak getirilir.

SELECT dbname, usename, current_query FROM pg_stat_activity ;

Bir çok kullanıcının aynı anda çalıştığı sistemlerde bir çok arka plan işleminin <IDLE> tanımlı sorgular ile listelendiğini görürsünüz. Bu sürecin durum bilgisini gösterir ve aslında aktif olarak çalışan bir sorgunun bulunmadığını, ve PostgreSQL’in ilgili kullanıcıdan yeni komut/sorgular beklediğini anlarsınız.

Sadece aktif sorgu çalıştıran kullanıcı süreçlerinin bilgisini getirmek için aşağıdaki şekilde sorgu filtrelenebilir:

SELECT dbname, usename, current_query FROM pg_stat_activity WHERE current_query != '<IDLE>' ;

Kısa Süren Sorguları Yakalama

Modern OLTP (Online Transaction Processing) sistemlerinde çalışan sorgular ancak birkaç milisaniye sürmektedir. Bu tür sorguları pg_stat_activity yardımı ile izlemek bir yana, yakalamak dahi meseledir. Bu tür sorguları izlemenin en kaba yolu sorguyu yavaşlatmaktır ki bunu yapmayı kimse istemez!

PostgreSQL 9.0 dan itibaren gelen bir özellik olan pg_stat_statements sorgu işleme istatistiklerini gerçek zamanlı kaydeden bir modüldür. (Bkz: https://www.postgresql.org/docs/9.6/static/pgstatstatements.html)

Sorgular arasına pg_sleep yardımı ile belirli bir boş zaman dilimi koyup, ilgili sorgu kayıtlarını farklı bir dosyaya yönlendirerek incelemek üzere daha küçük boyutlu bir kayıt dosyası oluşturabilirsiniz:

SELECT CURRENT_TIMESTAMP; SELECT pg_sleep(60); SELECT CURRENT_TIMESTAMP;

Bu esnada farklı bir terminal penceresinde tail -f /var/log/ postgresql/postgresql-X.X-main.log > ozel_sorgu.log komutu ile çalısan sorguya ait ufak bir kayıt dosyası oluşturmuş olursunuz.

Uzun Süren Sorguları İzleme

Uzun süren sorguları izlemek farklı bir konudur. Sorguların listesini alıp bunların ne kadar süreden beri çalıştığına dair sıralamak için:

select 
  current_timestamp - query_start as runtime, 
  datname, 
  usename, 
  current_query 
from 
  pg_stat_activity 
where
  current_query != '<IDLE>' 
order by 1 desc;

Bu sorgu en üstte en uzun zamandan beri çalışan sorgu olmak üzere aşağıya doğru azalarak sıralı çalışan sorgu listesini getirecektir. Yüklü sistemlerde bu sorguyu çalıştırırken limit kullanarak getirilecek olan satır sayısını (LIMIT 10) sınırlamanız tavsiye edilir. Bunu çalışma zamanını limitleyerek de yapabilirsiniz: WHERE cümlesine ‘current_timestamp – query_start 1’ min eklerseniz bir dakikadan uzun sorgular sadece listelenecektir.