(1)数据库无法连接故障的定位 “too many connections”
使用命令查看 当前建立的连接 show variables like ‘max_connections’;
然后查看配置文件里设置的连接 在 /etc/my.cnf 里查看
当出现 too many connections 故障时,看启动日志当前连接数,如果没有超过配置文件里的,就说明有问题;
出现问题的原因:
因为底层的linux操作系统把进程可以打开的文件句柄数限制为了 1024 ,导致MySQL最大连接数是214;
为什么Linux的文件句柄数量被限制MySQL最大连接数就被限制?这个不去追究细节了。只要知道有这么一回事就好了。
如何解决?
执行命令: ulimit -HSn 65535
然后就可以用如下命令检查最大文件句柄数是否被修改了:cat /etc/security/limits.conf cat /etc/rc.local
为什么最大连接数是214?
这个其实是MySQL源码内部写死的,源码中有一个计算公式,算下来如此
ulimit命令:
linux是默认限制每个进程对机器资源的使用的,包括可以打开文件句柄的限制,可以打开的子进程的限制,网络缓存的限制,最大可以锁定的内存大小,这样做可以尽量避免某个进程
耗尽机器上的所有资源。如果Linux限制一个进程的文件句柄太少的话,就会导致没法创建大量的网络连接,此时系统进程就没法正常工作。
所以往往部署生产环境系统,比如数据库系统,消息中间件系统,存储系统,缓存系统后,都需要调整一下Linux的一些内核参数,这个文件句柄的数量是要调整的,通常设置为65535;
还有kafka之类的消息中间件,在部署生产环境的时候,如果不优化内核参数,会导致kafka可能无法创建足够的线程。
所以平时可以使用ulimit命令来设置每个进程被限制使用的资源量,用 ulimit -a 可以看到进程被限制使用的各种资源的量。
core file size :进程崩溃时候的转储文件的大小限制,
max locked memory:最大锁定内存大小
open files:最大可以打开的文件句柄数量
max user processes:最多可以拥有的子进程数量