这是我参与更文挑战的第7天,活动详情查看:更文挑战
一、前言
在一个生产案例中,Java 系统部署在 2台机器上,Java 系统设置的连接池的最大大小为 200。
大致连接图,如下:
发现应用服务器的数据库连接池无法创建连接。
排查操作步骤,如下:
- 检查
my.cnf配置 - 查看
MySQL日志
- 检查
my.cnf配置
检查了下 MySQL 的配置文件 my.cnf,里面有一个关键的参数是 max_connections(即,MySQL 建立的最大连接数),发现是 800。
明明设置了
MySQL最多可以建立 800 个连接,可为什么 400 个连接都不行?
用命令行登录到 MySQL 上,执行下面命令:
show variables link 'max_connections';
214
发现 MySQL 仅仅只是建立了 214 个连接。
- 查看
MySQL日志
再检查下 MySQL 的启动日志:
Could not increase number of max_open_files to more than mysqld (request: 65535)
Changed limits: max_connections: 214 (request 2000)
Changed limits: table_open_cache: 400 (request 4096)
日志说明:MySQL 发现自己无法设置 max_connections 为我们期望的 800,只能强行限制为 214 !
最后发现,linux 操作系统把进程可以打开的文件句柄数限制为 1024 了,导致 MySQL 最大连接数是 214 !
linux 限制文件句柄,如图:
二、解决
怎么解决这个问题呢?
设置 linux 的文件句柄数设大点:
ulimit -HSn 65535
可以通过如下命令查看最大文件句柄数是否被修改:
cat /etc/security/limits.conf
cat /etc/rc.local
修改完,重启服务器,再重启 MySQL,linux 的最大文件句柄就生效了,这个问题也解决了。
那为什么 linux 最大文件句柄限制为 1024 的时候,MySQL 的最大连接数是 214呢?
MySQL源码中的一个计算公式,内部写死罢了。