当前位置: 首页 > 知识库问答 >
问题:

达到Django Celery Max DB连接

闻人望
2023-03-14

我在一个django应用程序中运行我的芹菜工人的任务,每个任务需要大约1-2秒来执行。通常这些执行是好的,但有时,特别是如果Django应用程序已经部署了一段时间,我开始看到这样的错误:

File "/usr/lib64/python3.6/site-packages/sqlalchemy/pool/base.py", line 428, in __init__
    self.__connect(first_connect_check=True)
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/pool/base.py", line 630, in __connect
    connection = pool._invoke_creator(self)
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/engine/strategies.py", line 114, in connect
    return dialect.connect(*cargs, **cparams)
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/engine/default.py", line 453, in connect
    return self.dbapi.connect(*cargs, **cparams)
  File "/usr/lib64/python3.6/site-packages/psycopg2/__init__.py", line 130, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) FATAL:  remaining connection slots are reserved for non-replication superuser connections

这向我表明芹菜工人没有正确关闭连接。

发生此错误时,我检查了DB上的空闲连接计数——肯定还有一些连接剩余,所以没有达到DB的最大连接限制。

我的问题:如何确保芹菜工人正在关闭数据库连接?

芹菜设置:

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_proj.settings')

_celery_broker = settings.CELERY_BROKER
_result_backend = settings.RESULT_BACKEND

app = Celery('my_proj', broker=_celery_broker, backend=_result_backend)

app.autodiscover_tasks(['common'])

app.conf.update(
    worker_prefetch_multiplier=0,
    event_queue_ttl=0,
    task_acks_late=True,
)

我的Django DB设置:

'DATABASES': {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': <...>,
        'USER': <...>,
        'PASSWORD': <...>,
        'HOST': <...>,
        'PORT': 5480,
    }
}

如何启动部署的Django服务器

gunicorn --config gunicorn.config my_proj.wsgi:application

gunicorn配置

bind = '0.0.0.0:8201'
workers = 3
worker_class = 'gthread'
threads = 3
limit_request_line = 0
timeout = 1800

我如何开始我的芹菜工人:

celery -A my_proj worker -l info

我在Django文档中读到,如果未指定,MAX_CONN_AGE设置默认为0,据我所知,芹菜工人也应该选择该设置。

共有1个答案

公良俊楚
2023-03-14

也许如果你可以开始排序池或故意启动和关闭连接,这可能会有所帮助。https://code.i-harness.com/en/q/2263d77讨论的是dB连池和为芹菜任务创建/关闭连接。我自己还没试过。

 类似资料:
  • 问题内容: 我需要读取UDP流量,直到达到超时为止。我可以通过在UDPConn上调用SetDeadline并循环直到出现I / O超时错误来做到这一点,但这似乎有些破绽(基于错误条件的流控制)。以下代码段似乎更正确,但不会终止。在生产中,这显然将在goroutine中执行;为了简单起见,它被编写为主要功能。 给定程序为什么不终止?基于https://gobyexample.com/select,h

  • 我在karaf中的pax-jdbc的池连接有问题,我试图通过blueprint.xml注入一个MySQL数据源(DS)到我的项目中,为了测试它,我已经建立了一个karaf命令,将DS注入karaf命令类并使用该连接执行查询。这是可以的,但是问题是当我执行命令很多次时,每次执行都会创建一个新的DS实例,并且池连接无法打开到MySQL的新连接,因为池已经达到极限。 我已通过以下链接将代码上传到gith

  • 当我使用beeline connect到hiveserver2时,err消息如下所示。我以前连接过hiveserver2。在我多次连接到hiveserver2之后,会显示此错误。我可以使用jdbc:hive2://连接 SLF4J:类路径包含多个SLF4J绑定。slf4j:在[jar:file:/usr/local/hive/lib/log4j-Slf4j-impl-2.4.1.jar!/org/

  • 我在使用Netty的程序中遇到了一个非常奇怪的问题。 我正在监听一个端口并解析消息(使用FrameDecoder实现)。如果我接收到一个连接,一切都很好,但是当我在同一个端口上接收到两个连接(每个连接来自不同的服务器)时,我会遇到一个罕见但严重的情况,即我得到了损坏的FrameException 当我的程序接收到具有完全相同时间戳的TCP数据包时(当以非常高的速率发送信息时),问题就会发生,如下所

  • 问题陈述 我们在嵌入式模式下使用H2已有一段时间了。它上面配置了一个连接池。以下是当前池配置: H2配置: *跳过用户名和密码属性。 我们已经通过记录池属性验证了上述配置的有效性。 这个设置的问题是,我们观察到连接池经常(尽管是间歇性的)耗尽,一旦连接池达到最大限制,它就开始为一些查询抛出以下异常。 SqlExceptionHelper.log异常(SqlExceptionHelper.java: