欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!
在我后台回复 「资料」 可领取
编程高频电子书
!
在我后台回复「面试」可领取硬核面试笔记
!文章导读地址:点击查看文章导读!
感谢你的关注!
生产案例:数据库无法连接,Too many connections
在这个生产案例中:
数据库被部署在了一个很高配的服务器上,内存有 64GB
Java 应用部署在两台机器上,每个 Java 应用设置的连接池的最大数量为 200,也就是每个 Java 应用可以和 MySQL 建立 200 个连接,那么 2 个 Java 应用也就和 MySQL 建立 400 个连接
但是此时数据库出现了异常,报错 Too many connections,也就是数据库给你说连接已经太多了,无法再建立了
对于 64GB 的高配服务器来说,不可能连 400 个连接都没办法建立
造成这个问题的原因其实就是 Linux 服务器的文件句柄数量的设置,默认情况下是 1024,由于在服务器中还有其他应用占用了一部分文件句柄数量,从而导致留给 MySQL 建立连接的文件句柄数量不够,因此无法建立连接!
为什么文件句柄数量会限制 MySQL 的连接数量呢?
因为在 Linux 服务器中,一切皆文件,因此 MySQL 建立的连接都会作为文件存在,因此文件句柄数量限制着 MySQL 无法建立太多的连接!
修改文件句柄数量
vi /etc/security/limits.conf
# 添加如下行
* soft nofile 65535
* hard nofile 65535
修改之后,问题就可以解决了
重启当前 linux 服务器的会话(也就是将 xshell 关闭之后,再重新连接上),使用命令查看修改是否生效:
# 显示当前用户的最大文件描述符限制可以使用以下命令:
ulimit -n
在 Linux 中,为了避免某个进程耗光了机器的所有资源,因此默认情况下会对进程以及用户所打开的文件句柄数量进行限制的,因此在生产环境部署系统之后,需要对 Linux 内核参数做出一些调整,来让系统达到比较好的性能
就比如对于 Kafka 来说,如果不优化 Linux 内核参数的话,就会导致 Kafka 无法创建足够多的线程运行