我拼命想弄清楚这里发生了什么,但在任何地方都没有看到这个特殊问题。我已经继承了' (例如,我自己没有构建任何一个)管理数据库服务器(远程,在数据仓库中,由ssh访问),其中一些php守护进程在充当数据爬虫的Linux服务器上运行,在相对中插入和处理信息稳步流入mysql。
几天前,服务器崩溃了,又重新开始了。我登录了一个重新启动的mysql服务器和爬虫,不再考虑它。一天半之后,mysql服务器停止工作,我无法对其进行诊断,因为我无法登录,也没有响应" /etc/init.d/mysql停止"或其变种。根据日志文件,它会定期抛出错误(每4分16秒一次),并说它打开了太多的文件处理程序。然而,当我关闭爬虫时,我可以再次登录,但是mysql不断抛出错误。我检查了lsof,它显示了许多打开的套接字"无法识别协议"错误。
mysqld 28843 mysql 1990u sock 0,4 2856488无法识别协议
mysqld 28843 mysql 1989u sock 0,4 2857220无法识别协议
^成千上万的这些行
我认为这是爬虫所做的事情,我重新启动了mysql,失败的套接字消失了。但我很惊讶地发现,即使爬虫没有运行,mysql仍然会开启新的。无论爬虫是否活跃,它都会定期执行此操作,每分钟关于两个新的故障插槽。我增加了允许mysql购买一段时间的文件处理程序的最大数量,但我显然正在寻找诊断和永久解决方案。
我在论坛上发现的所有此类错误(套接字泄漏)的描述似乎与您自己的软件泄漏有关,而不是关闭其套接字。但这似乎是mysql本身就是这样做的,并且任何代码都没有变化,从它工作正常,只是服务器崩溃和重新启动。
有什么想法吗?