Поскольку я использую сельдерей с пулом Gevent, я подумал, что postgres может быть узким местом (блокировки IO).
Поэтому я исправил psycopg2 с помощью psycogreen:
import gevent
import gevent.monkey
gevent.monkey.patch_all() # noqa
import psycogreen.gevent
psycogreen.gevent.patch_psycopg() # noqa
Itускоряет выполнение задач сельдерея (WORKER_CONCURRENCY = 100, масштабируется до 14 экземпляров):
celery worker -n my-queue@%h. --app=worker --loglevel=INFO --without-mingle --without-gossip -Ofair --pool=gevent --concurrency=100
Однако он почти мгновенно достигает postgres max_connections для более чем 100 соединений - и выдает следующую ошибку:
OperationalError: (psycopg2.OperationalError) ERROR: no more connections allowed (max_client_conn)
Я пытался использовать pgBouncer для смягчения этого, но он все еще превышает предел.(используя конфигурацию по умолчанию из kubernetes repo )
Я использую SqlAlchemy ORM:
import sqlalchemy as sa
from sqlalchemy.orm import sessionmaker, scoped_session
from config import postgres_url_db
engine = sa.create_engine(
postgres_url_db,
pool_recycle=3600,
pool_size=7
)
session = scoped_session(
sessionmaker(
autocommit=False,
autoflush=False,
bind=engine
)
)
db_session = session()
db_session.execute(...) # my db query
db_session.commit()
Любые рекомендации о том, как лучше использовать gevent с postgres?