Rozwiązywanie problemów z wysokim zużyciem procesora przez usługi postgres i postmaster?

28

Używam maszyny opartej na otwartym kodzie źródłowym (RHEL 6.2) z oprogramowaniem SIEM. Kiedy uruchamiam toppolecenie, widzę postgresi postmasteroba z 96% użyciem procesora. Czy istnieje sposób na sprecyzowanie lub sprawdzenie, co powoduje gromadzenie się tych usług?

asadz
źródło
2
„RHCE 6.2”? Masz na myśli „RHEL 6.2”? Zakładam postgressIS postgresi po prostu skopiowane go ręcznie.
Craig Ringer

Odpowiedzi:

30

Można dopasować określony identyfikator zaplecza Postgres do identyfikatora procesu systemowego za pomocą pg_stat_activitytabeli systemowej.

SELECT pid, datname, usename, query FROM pg_stat_activity;może być dobrym punktem wyjścia.
Gdy wiesz, jakie zapytania są uruchomione, możesz dalej badać ( EXPLAIN/ EXPLAIN ANALYZE; sprawdź blokady itp.)

voretaq7
źródło
czy to jest dokładne zapytanie, nie znam się zbytnio na db, bo jestem tym drugim facetem, który pracuje nad siem, twoją instrukcją select, czy muszę go karmić pid z górnego polecenia?
asadz
1
@asadz nie, zostało ono obcięte (teraz naprawione) - jeśli masz określone PID i chcesz zobaczyć, co one działają, możesz je wyodrębnić za pomocą WHEREklauzuli, ale jeśli nie masz ogromnej liczby PID, to tak samo łatwe do przeszukania pełnego wyniku. Podręcznik Postgres zawiera dodatkowe informacje na temat tego, z czego możesz się wydostaćpg_stat_activity , a także inne tabele gromadzące statystyki (które mogą ci pomóc, jeśli twoim problemem nie jest zapytanie użytkownika).
voretaq7
kiedy
wykonuję
Dzięki za wskazówkę, ostatnio spotkałem podobny problem i odkryłem
Yao
14

Miałem ten sam problem. Postgresql jest ustawiony na AWS RDS i miał 100% wykorzystania procesora nawet po zwiększeniu instancji. Debugowałem za pomocą metody pokazanej tutaj i jedna z tych metod działała dla mnie.

Najdłużej sprawdzałem, czy zapytanie jest uruchomione i dowiedziałem się, że niektóre zapytania utknęły i działały od ponad 3-4 godzin. Aby sprawdzić, od jakiego czasu zapytanie jest uruchomione, uruchom następującą komendę:

SELECT max(now() - xact_start) FROM pg_stat_activity
                               WHERE state IN ('idle in transaction', 'active');

Jeśli jest to więcej niż godzina, to jest to problem. Zabij połączenie długo działające i ogranicz maksymalny wiek połączenia od strony aplikacji.

Ajeet Khan
źródło
8

Jeśli tak naprawdę postmaster używa całego tego procesora, prawdopodobnie masz problemy z blokadą, prawdopodobnie z powodu bardzo wysokiego poziomu max_connections. W takim przypadku rozważ obniżenie max_connectionsi użycie puli połączeń.

W przeciwnym razie: Szczegóły proszę. Pełna wydajność top -b -n 1na początek.

Craig Ringer
źródło
to ma sens; ponieważ siem jest używany przez analityka do przeszukiwania wielu danych tam iz powrotem; czy jest sposób, aby sprawdzić stan blokady; lub przypisywane mu warunki; ?
asadz