【问题标题】:Django+Celery+postgresql_psycopg2 connection already closed errorDjango+Celery+postgresql_psycopg2 连接已关闭错误
【发布时间】:2016-06-23 06:57:00
【问题描述】:

在强行终止(kill -9)空闲数据库连接之后。芹菜日志显示以下错误

[2016-03-08 19:28:04,765: CRITICAL/MainProcess] Task users.tasks.refresh_trend_buzz_messages[85a2430a-9a39-4979-b99d-fcaae86b3ba1] INTERNAL ERROR: InterfaceError('connection already closed',)
Traceback (most recent call last):
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/celery/app/trace.py", line 253, in trace_task
    I, R, state, retval = on_error(task_request, exc, uuid)
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/celery/app/trace.py", line 201, in on_error
    R = I.handle_error_state(task, eager=eager)
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/celery/app/trace.py", line 85, in handle_error_state
    }[self.state](task, store_errors=store_errors)
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/celery/app/trace.py", line 118, in handle_failure
    req.id, exc, einfo.traceback, request=req,
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/celery/backends/base.py", line 120, in mark_as_failure
    traceback=traceback, request=request)
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/celery/backends/base.py", line 251, in store_result
    request=request, **kwargs)
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/djcelery/backends/database.py", line 29, in _store_result
    traceback=traceback, children=self.current_task_children(request),
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/djcelery/managers.py", line 42, in _inner
    return fun(*args, **kwargs)
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/djcelery/managers.py", line 181, in store_result
    'meta': {'children': children}})
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/djcelery/managers.py", line 87, in update_or_create
    return get_queryset(self).update_or_create(**kwargs)
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/djcelery/managers.py", line 70, in update_or_create
    obj, created = self.get_or_create(**kwargs)
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/django/db/models/query.py", line 373, in get_or_create
    return self.get(**lookup), False
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/django/db/models/query.py", line 301, in get
    num = len(clone)
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/django/db/models/query.py", line 77, in __len__
    self._fetch_all()
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/django/db/models/query.py", line 854, in _fetch_all
    self._result_cache = list(self.iterator())
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/django/db/models/query.py", line 220, in iterator
    for row in compiler.results_iter():
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 710, in results_iter
    for rows in self.execute_sql(MULTI):
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 780, in execute_sql
    cursor = self.connection.cursor()
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 159, in cursor
    cursor = util.CursorWrapper(self._cursor(), self)
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 131, in _cursor
    return self.create_cursor()
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/django/db/utils.py", line 99, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 131, in _cursor
    return self.create_cursor()
  File "/home/.virtualenvs/backend/local/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 139, in create_cursor
    cursor = self.connection.cursor()
InterfaceError: connection already closed

我正在使用 Django==1.6.1、celery==3.1.10、django-celery==3.1.10 和 psycopg2==2.4.1

我该如何解决这个错误?

【问题讨论】:

    标签: django postgresql celery psycopg2 django-celery


    【解决方案1】:

    您需要在 PostgreSQL 配置中调整 max_connections

    每个 celery worker 至少需要 1 个连接,外加任何其他客户端代码的连接。

    【讨论】:

    • 在我的情况下,创建这 90 多个空闲连接是不正常的。我的猜测是芹菜工人没有正确关闭连接。但我在上周所做的唯一更改是查询更改(向现有查询添加了排序)。芹菜有没有可能在不正确关闭的情况下保持连接?
    • 为什么不正常?每个 celery worker 打开一个到数据库的连接并保持打开状态。这是预期的行为?你有多少芹菜工人?如果您有 90 个工作人员,那么您将有 90 个连接。
    • 我只有 8 个工人在运行。但是在杀死旧的 90 多个空闲连接并重新启动 celery 之后,一切恢复正常,现在只保持 8 个连接。
    【解决方案2】:

    这是预期的行为。每个 celery worker 都会打开一个到数据库的连接并尝试重用它,以避免每次协商的开销。通过终止数据库进程,您将关闭连接,从而导致错误。

    你想通过杀死数据库进程来达到什么目的?

    【讨论】:

    • 对代码进行一些更改后的实际操作,我可以看到 postgres 每天都保持空闲连接,并引发错误“剩余的连接槽是为非复制超级用户连接保留的”。这就是为什么我删除了几天前开始的空闲进程..
    • 我该如何解决这个问题?
    • 您可能需要提高 PostgreSQL 允许的最大连接数
    猜你喜欢
    • 2015-10-08
    • 2018-07-11
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    相关资源
    最近更新 更多