Django 无法每隔一段时间连接到数据库(Centos)

Posted

技术标签:

【中文标题】Django 无法每隔一段时间连接到数据库(Centos)【英文标题】:Django can't connect to database every once in a while (Centos) 【发布时间】:2016-10-11 08:11:26 【问题描述】:

我遇到了一个非常奇怪的问题,我有一个运行 mod_wsgi 的 Apache 服务器。该网站运行良好,但每隔一段时间我就会得到 ​​p>

IOError: failed to write data

网站所有页面上的错误。然后我用

解决了
sudo service mysqld restart

由于网站不能长时间关闭,我没有时间调试这个问题,我只是每次发生这种情况时运行命令。我只在日志中看到错误,这就是为什么我无法真正调试它,并且它没有明确的复制步骤,它只是随机发生。

如果您需要我发布任何配置文件,我们将不胜感激。

编辑:django 显示的确切错误是:

(2002, "Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)")

我保存了错误消息,它托管在here。 (密码已删除)

编辑: 这是 mysql 服务器错误日志的摘录。

160610 10:51:53 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
160610 10:51:53 [Note] /usr/libexec/mysql55/mysqld (mysqld 5.5.46) starting as process 7658 ...
160617 14:35:47 [Note] /usr/libexec/mysql55/mysqld (mysqld 5.5.46) starting as process 32054 ...
160617 14:35:47 [Note] Plugin 'FEDERATED' is disabled.
160617 14:35:47 InnoDB: The InnoDB memory heap is disabled
160617 14:35:47 InnoDB: Mutexes and rw_locks use GCC atomic builtins
160617 14:35:47 InnoDB: Compressed tables use zlib 1.2.8
160617 14:35:47 InnoDB: Using Linux native AIO
160617 14:35:47 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
160617 14:35:47 InnoDB: Completed initialization of buffer pool
160617 14:35:47 InnoDB: Fatal error: cannot allocate memory for the buffer pool
160617 14:35:47 [ERROR] Plugin 'InnoDB' init function returned error.
160617 14:35:47 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
160617 14:35:47 [ERROR] Unknown/unsupported storage engine: InnoDB
160617 14:35:47 [ERROR] Aborting

我保存了完整的 mysqld.log here。

【问题讨论】:

听起来您需要花时间来调试问题。您应该查看整个错误堆栈跟踪,看看它有哪些额外的细节 我会看一下,下次出现的时候贴一下,大家有什么关于连接mysql到django的通用tips吗? 好的,又发生了,我保存了错误日志。你能帮忙吗? 你更有可能在mysql错误日志中找到错误来源 尝试查看或发布 mysql 错误日志(应该在 /var/log/mysqld.log 下) 【参考方案1】:

为什么会崩溃

这似乎是罪魁祸首

160617 14:35:47 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12

这种情况是由服务器耗尽物理内存引起的。这就是 errno 12 在内核错误中的含义。

Stack Overflow 和dba.stackexchange 都讨论过这个话题。如果您想模拟内存不足的情况或尝试手动重现错误,请尝试以下一些工具: How to fill 90% of the free memory?

快速解决方案

如果你能升级内存,你可以试试。如果没有,您可以尝试创建一个大型交换文件。您可能根本没有交换。一些 AWS EC2 实例默认没有。您可以通过在 shell 中键入 top 来查找。如果您在顶部附近没有看到交换,则表示您没有交换。

交换文件会使查询速度变慢,但至少比网站离线要好。

您可能很想尝试修改systemd 文件以使mysql 自动启动。 更新:@PeterBrittain 指出 mysql 无论如何都会自动重启,如日志所示。有时虽然数据库可能需要一些时间才能重新启动,并且如果数据损坏,它将拒绝重新启动。

为什么内存耗尽?

如果您没有在其上运行任何其他服务器,则 2GB 足以托管一个每天提供 6000 个页面的网站。可能是您有一些相当繁重的查询给数据库带来了不必要的负载。可以采取一些补救措施

    使用 django-debug-toolbar 识别执行许多查询的页面,看看是否可以使用 select_related 或 prefetch_related 来减少数量。 使用mysql慢查询日志查找执行时间长的查询并进行优化。 使用缓存来保存复杂查询的结果。

【讨论】:

你能提出一种方法来检验你的假设吗?即,你能告诉我如何剥夺我的服务器的物理内存以重现错误吗? 我使用了选择的工具(压力)并使用了高达 90% 的空闲内存(使用提到的命令),但是没有发生错误,我一直在刷新很多页面(使用很多查询)。你推荐一些其他的工具/命令吗? @bit68 请注意,mysql 5.5 已经有一个重启包装器,该包装器已在日志中明确调用。因此,我认为使用 systemd 不会有什么不同。 @e4c5 写得不错。当我在过载的服务器上遇到类似问题时,我还必须调整 Apache,使其不会尝试启动太多工作程序,然后在完成一些缓慢的请求时消耗更多内存。 很高兴能帮上忙

以上是关于Django 无法每隔一段时间连接到数据库(Centos)的主要内容,如果未能解决你的问题,请参考以下文章

pycharm每隔一段时间登不上

IIS每隔一段时间就无法进行访问,重启服务也不行,必须重启服务器才可以,请问是啥情况?如何解决?

delphi中我用定时器每隔一段时间执行操作

查询数据库的时候 可以查询出每隔一段时间(比如2小时)这段时间段前3条数据

UIViewControllerAnimatedTransitioning 每隔一段时间才有效吗?

vue中如何每隔一段时间请求一次后台数据?