背景
有同学反应,产品连不上,登陆到服务器,发现连接数不够了。
接着先重启mysql,发现在mysql启动的时候会报Waring
Warning Changed limits: max_open_files,max_connections=214
处理
/etc/security/limits.conf 中设置
* soft nofile 102400
* hard nofile 102400
登出服务器,重新登录。
重启mysql,问题解决
过程
- 第一时间想到mysql配置得太小,于是找到配置,发现配置的max_connections=5000,明显不是配置问题
- Linux系统上默认的open files数目为1024, 有时应用程序会报Too many open files的错误,是因为open files 数目不够。
ulimit -a看下,果然是1024
疑问
为什么open files会决定max_connections大小?
max_connections和table_open_cache在系统上对应的是OS的文件句柄(fd),如果这两个值增加,那么相应的也要增加OS的max_open_files设置,不然mysql就会根据max_open_files的值,去主动调整这两个设置。
参考:http://dev.mysql.com/doc/refman/5.5/en/table-cache.html
2015-07-22记
参数调整后,今天出现了客户端连接池用完。
在数据库执行 show processlist;
发现大量的query end的process:
| 167 | paas | xxxxxx | edas | Query | 60400 | query end | INSERT INTO CON_METRIC (APP_ID, ECU_ID, MON_TYPE, MON_DATA, CREATE_TIME) VALUES ('ead5f836-c4c7-4ced |
insert、update、都有,状态都是query end。
查看数据库,cpu/内存都是正常。
发现磁盘满了,最后定位到bin-log日志导致两百多G被用完。删除掉早期的bin-log,恢复正常