一起Mysql故障诊断

我们有两台API服务器,Webservice是本人写的Apache Handler,数据库是Mysql,操作系统是Ubuntu Linux。看了下,这2个服务器昨天共处理了95万唯一IP的请求,并且请求数还在每日递增中。请求都是动态的,其中60%是写DB,40%是读DB。三台服务器(2台web、1台db)负载非常轻,几可忽略不计。

在晚上高峰期的时候,每台web服务器跑了500多个Apache进程,共打开1000多个到数据库的长连接。之前我意识到连接数会很大,因此把Mysql配置里的如下参数都调整过:

max_connections = 2000
open-files-limit = 2000

这两天在访问高峰时,发现web服务器的错误日志会报错:

Lost connection to MySQL server at ‘reading initial communication packet’, system error: 0

网上查了一通,很多说是防火墙的问题。于是把数据库的iptables关掉,没有作用。又查到这篇文档:

http://serverfault.com/questions/418665/random-lost-connection-to-mysql-server-at-reading-initial-communication-packet

跟我的情况类似,是偶尔出现错误,不是经常出错。但这哥们的问题是mysqlhotcopy锁表引起的,我没有使用这个备份工具。但他提到的打开文件数量提醒了我,登陆Mysql运行如下命令检查一下:

show status like ‘open_files’;

看到打开的文件数量1000多个(应该包括socket句柄,因为打开的物理文件不可能这么多),我设置的限制是2000个,莫非是这个数量太小?

于是把open-files-limit改成10000,重启Mysql,问题解决了。

虽然问题OK了,但有点奇怪的是,之前我看到的open_files数量也没达到设置的2000,为什么会导致客户端连不上呢?难道还有其他参数的影响?有待深究。

此条目发表在Common分类目录,贴了, 标签。将固定链接加入收藏夹。