Czy można monitorować wydajność serwera PostgreSQL z poziomu funkcji PL / PGSQL?

Aug 17 2020

Może to zabrzmieć egzotycznie, ponieważ chciałbym programowo wiedzieć, czy jest to „dobry moment” na wykonanie na serwerze funkcji PL / PGSQL wymagającej intensywnego zapisu. Przez „dobry moment” mam na myśli rozważenie jakiegoś bezpośredniego lub obliczonego wskaźnika poziomu obciążenia, poziomu współbieżności lub jakiejkolwiek innej wielkości serwera PostgreSQL.

Zdaję sobie sprawę, że istnieje wiele zaawansowanych aplikacji specjalizujących się w śledzeniu wydajności, takich jak https://www.datadoghq.com. Ale chcę tylko prostego wewnętrznego KPI, który zmienia lub opóźnia wykonanie tych ciężkich procedur zapisu, aż nadejdzie „lepszy moment”.

Niektóre z tych procedur czyszczą tabele, niektóre wykonują obliczenia średniej / sumy dla milionów wierszy, inne sprawdzają tabele zdalne itp. Mogą czekać minuty lub godziny na „lepszy moment”, gdy spadnie presja jednoczesnego użytkownika.

Dowolny pomysł?

Odpowiedzi

3 jjanes Aug 16 2020 at 23:56

Możesz zobaczyć, ile innych sesji jest aktywnych, na przykład:

select count(*) from pg_stat_activity where state='active';

Ale musisz być superużytkownikiem lub mieć rolę pg_monitor, inaczej stan będzie miał wartość NULL dla sesji innych użytkowników. Jeśli ci to przeszkadza, możesz napisać funkcję z SECURITY DEFINER, aby umożliwić dostęp do tych informacji. (Prawdopodobnie i tak powinieneś umieścić to w swojej własnej funkcji, co oznacza, że ​​nie ma powodu, aby musiało być zaimplementowane w plpgsql, chyba że jest to jedyny dostępny język).

Możesz także wywołać dowolne operacje systemu operacyjnego, używając odpowiednio uprzywilejowanego języka pl. Że zawiera od plpgsql , nadużywając COPY...FROM PROGRAM.