首先让我简要介绍一下我们的设置,然后才能提出正确的问题:
我们有一个运行django应用程序的Web应用程序服务器(虚拟机)。 nginx在前面,uwsgi运行在那之下,然后是一个新的应用程序包装器,然后是django等,数据库是一个单独的postgresql服务器,位于smartstack(synapse / nerve)
我们面临的问题是偶尔(2周前发生一次,过去2天发生两次),uwsgi工作进程中的一个或两个将跳闸并开始生成“django.db.utils.InterfaceError:connection已经关闭了“他们的大多数要求。
略微编辑堆栈跟踪(user和application_name):
Traceback (most recent call last):
File "/home/user/webapps/application_name/local/lib/python2.7/site-packages/newrelic-2.8.0.7/newrelic/api/web_transaction.py", line 863, in __call__
File "/home/user/webapps/application_name/local/lib/python2.7/site-packages/newrelic-2.8.0.7/newrelic/api/function_trace.py", line 90, in literal_wrapper
File "/home/user/webapps/application_name/local/lib/python2.7/site-packages/newrelic-2.8.0.7/newrelic/api/web_transaction.py", line 752, in __call__
File "/home/user/webapps/application_name/local/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 194, in __call__
signals.request_started.send(sender=self.__class__)
File "/home/user/webapps/application_name/local/lib/python2.7/site-packages/django/dispatch/dispatcher.py", line 185, in send
response = receiver(signal=self, sender=sender, **named)
File "/home/user/webapps/application_name/local/lib/python2.7/site-packages/django/db/__init__.py", line 91, in close_old_connections
conn.abort()
File "/home/user/webapps/application_name/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 374, in abort
self.rollback()
File "/home/user/webapps/application_name/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 177, in rollback
self._rollback()
File "/home/user/webapps/application_name/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 141, in _rollback
return self.connection.rollback()
File "/home/user/webapps/application_name/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/user/webapps/application_name/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 141, in _rollback
return self.connection.rollback()
File "/home/user/webapps/application_name/local/lib/python2.7/site-packages/newrelic-2.8.0.7/newrelic/hooks/database_dbapi2.py", line 82, in rollback
django.db.utils.InterfaceError: connection already closed
堆栈跟踪永远不会进入我们的应用程序,它只涉及新的遗物和django。一旦工人绊倒,它就无法恢复,所有进一步的请求都会导致uwsgi日志中的500和前端的502。我假设数据库连接正常,因为兄弟工作者继续正常运行,重启uwsgi可以立即解决问题。
我的问题是如何诊断这个问题以确定根本原因,我已经检查了所有我知道如何检查(内存,cpu,日志,数据库连接)和一些我不完全理解的事情但是我试图阅读(主要是文件描述符)。
现在我更新了新的遗物(堆栈追踪是旧版本),因为这是我觉得我能做的唯一事情。
我很感激任何反馈,许多谷歌搜索已证明无效。
回复可能会稍微延迟,我的时区说是时候睡觉了。此外,如果这应该是在服务器故障或其他什么,道歉,我只是认为它更接近应用程序调试问题而不是服务器配置问题。