我有一个非常奇怪的问题,我有一个运行mod_wsgi的Apache服务器.该网站运行良好,但每隔一段时间我就得到了
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.
最佳答案
为什么会崩溃
这似乎是罪魁祸首
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慢查询日志查找需要很长时间才能执行和优化它们的查询. >使用缓存来保存复杂查询的结果.
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|