Сбор pg / backends postgres из pg_stat_activity возвращает постоянный результат в одном сеансе - PullRequest
0 голосов
/ 06 июня 2018

В течение одного сеанса с уровнем изоляции READ_COMMITTED список активных пидов из pg_stat_activity собирается только один раз, и при следующих попытках возвращаются те же результаты.Кто-нибудь может объяснить, почему?

Сценарий для воспроизведения этого явления:

#!/usr/bin/env python

import time

from sqlalchemy.engine import create_engine
from sqlalchemy.orm.session import sessionmaker
from sqlalchemy.pool import NullPool

pg_uri = 'postgresql://test:test@localhost:5432/test'


def get_session():
    bind = create_engine(pg_uri, poolclass=NullPool, echo=False, isolation_level="READ_COMMITTED")
    session_class = sessionmaker(bind=bind)
    return session_class()

def pg_sleep():
    get_session().execute('select pg_sleep(3)')


def show_backends(session, prefix):
    backends = session.execute("SELECT pid, query FROM pg_stat_activity where state = 'active';").fetchall()
    print ("%s found processes:" % prefix)
    for backend in backends:
        print("%s: %s %s" % (prefix, backend[0], backend[1][:32]))


def spawn_backend():
    import threading
    print("spawning backend")
    threading.Thread(None, target=pg_sleep).start()
    show_backends(get_session(), 'thread')


session = get_session()
for tries in range(3):
   spawn_backend()
   time.sleep(1)
   show_backends(session, '-main-')

Я использую:

postgresql-9.6
Python 2.7.12
SQLAlchemy 1.1.12 

1 Ответ

0 голосов
/ 11 июня 2018

Документы о статистике мониторинга говорят, что:

Еще один важный момент заключается в том, что когда серверный процесс запрашивается для отображения любой из этих статистических данных, он сначала выбирает самый последний отчетгенерируется процессом коллектора, а затем продолжает использовать этот снимок для всех статистических представлений и функций до конца своей текущей транзакции.Таким образом, статистика покажет статическую информацию, пока вы продолжаете текущую транзакцию.Точно так же информация о текущих запросах всех сеансов собирается, когда любая такая информация сначала запрашивается в транзакции, и эта же информация будет отображаться в течение всей транзакции.Это особенность, а не ошибка, поскольку она позволяет вам выполнять несколько запросов к статистике и сопоставлять результаты, не беспокоясь о том, что цифры меняются под вами.Но если вы хотите видеть новые результаты с каждым запросом, обязательно выполняйте запросы вне любого блока транзакции.В качестве альтернативы вы можете вызвать pg_stat_clear_snapshot (), который отбросит снимок статистики текущей транзакции (если есть).При следующем использовании статистической информации будет получен новый снимок.

Пожалуйста, рассмотрите возможность использования pg_stat_clear_snapshot в своем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...