从哪里开始调查导致数据库崩溃的问题:剩余的连接插槽保留用于非复制超级用户连接

有时我们的Postgres数据库崩溃,并且只能通过重新启动服务器来解决。我们尝试增加最大连接数和Django的CONN_MAX_AGE。另外,我正在尝试学习如何设置PgBouncer。但是,我相信根本的问题必须是其他可以解决的问题。

我正试图找出问题所在。问题是我不知道从哪里开始看什么。以下是一些信息:

错误始终为OperationalError: FATAL: remaining connection slots are reserved for non-replication superuser connectionsOperationalError: could not write to hash-join temporary file: No space left on device。我认为这是由于打开过多的数据库连接引起的,但我从未设法及时解决此问题,因此我可以检查pg_stat_activity并查看实际的活动连接。

查看错误日志,大部分情况下会显示相同的URL。我已经检查了nginx日志,它在许多不同的行中列出,这意味着该请求一次被发出多次,而不是Django多次记录相同的错误。所有这些请求均以499 Client Closed Request响应。除了该URL,当然还有其他尝试访问我们网站的用户的请求。

我应该提到,当请求有问题的URL时,服务器处理的逻辑非常简单,我看不到任何可导致数据库崩溃的可疑事件。但是,由于某种原因,页面在生产中的加载速度很慢。

我知道这很模糊并且很少使用,但是我不习惯于sysadmin,我只在大学学习过这种东西,到目前为止,我只是以开发人员的身份工作。

yzmjsk92856 回答:从哪里开始调查导致数据库崩溃的问题:剩余的连接插槽保留用于非复制超级用户连接

这两个问题大多是独立的。

用尽连接插槽不会使数据库崩溃。这只是一个信号,表明您要么不使用连接池,要么出现连接泄漏,即您忘记了关闭代码中的事务。

如果情况仍然存在,空间不足将使数据库崩溃。

我认为您的系统中会发生以下情况:

  • 由于有人忘记了一些加入条件或出于其他原因,您的某些查询需要很长时间。

    它们还处理大量(可能是中间的)结果,这些结果缓存在临时文件中,最终将磁盘填满。查询失败后,将立即清除此空间不足的情况,但它可能使数据库崩溃。

  • 由于这些查询需要很长时间并且会阻塞数据库会话,因此您的应用程序将继续启动新的会话,直到达到限制为止。

解决方案:

  • 查找并修复此失控查询。作为权宜之计,您可以设置statement_timeout以终止所有时间太长的语句。

  • 使用具有上限的连接池,以免连接用完。

本文链接:https://www.f2er.com/3166930.html

大家都在问