MySQL连接数过多的时候,排查问题的方法,可以查看每一个连接都执行了什么语句。

执行一下这个SQL语句进行查看。

select id, db, user, host, command, time, state, info 
from information_schema.processlist 
where command != 'Sleep'  order by time desc

image.png

info列就是正在执行的SQL语句。

关于MySQL连接过多的排查方法
在一些项目上会出现mysql连接过多导致后台无法正常访问,出现这个问题的原因可能有以下几点。
1,数据库连接池数量开的太多。
2,MySQL的超时关闭空闲连接时间太长。
3,MySQL的连接数太少。

现在的解决办法就是从这三方面去优化。
1,尽量减少数据库连接池的开销。数据库连接池如果处理的过来,越少越好,控制在50以内吧。
2,修改MySQL的配置文件my.ini里面的wait_timeout和interactive_timeout参数,默认值28800是8个小时的时间,这两个参数必须要同时修改成600,就是10分钟的空闲连接,mysql就会自动关闭。但是,这样做就必须要注意的事情就是在我们的程序里面必须要在10分钟内最少要使用一次MySQL,否则就有可能导致mysql连接断开,需要重连。
3,去修改mysql配置文件my.ini里面的max_connections参数,这个是6000,基本上不用修改,如果第1步和第2步都修改了,仍然有问题,那可以把这个参数调大一点。实际上并不是这个值越大越好,因为这个受限制于硬件,如果硬件配置低,修改的再大也没有用。所以需要具体情况具体分析。


最近在解决一个项目现场问题的时候,我发现管理后台访问特别卡顿,几乎无法访问。首先说明一下,我们的管理后台是Apache+PHP+MySQL架构的。当我打开任务管理器的时候,看到httpd进程占用CPU只有不到10左右,就会影响到整个系统的正常使用了。这个现象很奇怪,我也是第一次遇到过。像其他项目上,并发高峰期httpd进程可能会占用CPU到50%~70%左右,但是,后台仍然是可以正常访问的。由此推断,这个可能和服务器的配置有关系,也和Apache对服务器资源的占用有关系,具体是什么关系,可能牵扯到的知识太多了,我也不可能全部掌握,再者说,项目出现问题了,我就要立刻解决掉,恢复正常使用。

既然CPU还有很多的资源可以使用,那么我就可以多创建几个Apache的进程做负载均衡来分摊这个并发压力。具体实现方法是,利用Nginx的反向代理模式把请求均匀地分配给三个Apache的服务。也就是说,Nginx作为请求的入口,它不做任何的逻辑处理,只是负责把请求分发给后端的Apache处理。

Nginx的关键配置代码截图如下所示

image.png

配置完成以后,刷新一下后台,也可以正常访问,在数据请求的高峰期可以看到三个Apache的进程都在处理请求。如图所示

image.png

这样三个Apache进程分摊了所有的请求,这个时候再刷新一下管理后台,发现很快就可以获取到数据。的确比之前一个进程访问的后台要快很多。

由于公司的产品涉及到软件和硬件,同时,也用到了mqtt服务。我负责的这个产品从诞生到现在,mqtt服务也经历了好几次的更替。这个主要是从并发角度去考虑的。

1,Apache ActiveMQ,这个mqtt服务是我们最早使用的也是使用时间最长的一款mqtt服务软件,这个mqtt服务有很多有点,但是,它的缺点最终让我决定把它替换掉。那我就简单地列举一下缺点。最核心的缺点就是占用CPU比较高。举例说明,例如一个服务器的CPU是12个核,32G内存,当并发数量增加到2000以上的时候,CPU的使用率瞬间就会飙升到100%,也有可能会持续很长时间。占用这么高的CPU,最终就会导致整个系统无法正常使用。占用CPU过高最核心的问题就是Java这个虚拟机导致的,所以,这个没有办法从根本上解决问题。

2,mosquito,这个是c语言实现的一个轻量级的mqtt服务,相比于activemq它会减少很多的CPU资源,进而降低整个服务器的压力。总体来讲这个软件还是比较不错的。但是,最近一个项目上发现这个mosquito进程占用的CPU并不高,高峰期使用率只有14%左右,始终维持在2000左右的并发数量,项目现场的终端在3000台左右。每一台终端都会建立一个mqtt客户端连接。这样就会导致将近700台左右的设备无法正常连接服务器。没办法只能替换。最后终于找到原因了,这是因为网卡是百兆网卡,现场工程说是因为网线问题导致服务器的千兆网卡变成了百兆网卡。

3,emq,这个是erlang编程语言实现的一个mqtt服务,erlang编程语言的优势就是对并发的处理。可以这么说,erlang语言就是为并发而生。从这一点不能看出,到目前为止,emq是我使用过的所有mqtt服务性能最优的一款软件。尽管erlang也是以虚拟机的方式在运行,但是它占用的CPU资源要远比Java少的多,可以与mosquito相媲美。使用erlang既解决了并发问题,同时也解决了CPU使用率过高的问题。erlang编程语言里面的线程叫做协程,它可以用更少的资源来处理并发请求。

https://www.emqx.io/docs/zh/v4.4/getting-started/cluster.html#%E8%8A%82%E7%82%B9%E5%8F%91%E7%8E%B0%E4%B8%8E%E8%87%AA%E5%8A%A8%E9%9B%86%E7%BE%A4


辽公网安备21010602000703号 备案号:冀ICP备2022001219号