我有一个非常奇怪的问题,我有一个运行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。
答案 0 :(得分:3)
这似乎是罪魁祸首
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页的网站。可能是你有一些相当繁重的查询会给数据库带来不必要的负担。可以采取一些补救措施