psycogreen耗尽postgres max_connections

时间:2019-02-28 17:40:36

标签: postgresql celery psycopg2 gevent

当我在gevent池中使用celery时,我认为postgres可能是一个瓶颈(IO锁)。

所以我用psycogreen修补了psycopg2:

import gevent
import gevent.monkey

gevent.monkey.patch_all()  # noqa

import psycogreen.gevent

psycogreen.gevent.patch_psycopg()  # noqa

它可以加快执行芹菜任务的速度(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()

关于如何在postgres中更好地使用gevent的任何建议?

0 个答案:

没有答案