当我在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的任何建议?