mysql是单进程,多线程的架构,通过创建多个线程来服务不同的用户连接,通常情况下,随着用户连接数的增加,mysql内部用于处理用户连接的线程也会同步的增长,在一定范围内,增加用户的并发连接,对提高系统的吞吐量有一定的帮助,然而用户并发连接数超过某个阈值,Mysql的性能反而会降低.
Mysql内部处理用户连接的方式严格来说有三种
-
-
多线程处理用户连接,一个线程对应一个用户连接,也是Mysql默认连接处理方式
-
线程池处理用户连接,一个线程对应多个用户连接,比如MysqlPercona发行版提供了线程池功能
如何确定MySQL的最大负载和最大并发度?通过压测,不断增加客户端并发数。比如起始客户端并发数为2,依次递增到4,8,16,32等等,每次递增,在没有达到性能瓶颈前,压测的TPS会随着客户端并发数的增加而增大,响应时间通常会随着客户端并发数的增加而增加,但是增加的幅度并不明显。当客户端并发数达到某个阈值时,比如128,或者256甚至更大时,TPS不再增长,反而出现下降,响应时间则会出现跳跃式的增长,此时则可以认为MySQL已经达到了当前配置的最大性能。不同的硬件配置下,MySQL最大性能的并发连接数也不相同,需要根据具体的环境测试,一般的原则是最大并发连接数等于CPU逻辑核心数的4倍。
此外,如果业务对响应时间有一定的要求,比如业务要求响应时间50ms,在低于50ms的响应时间之内,TPS越高越好。这时就需要通过压测来确定最合适的并发连接数,在响应时间不超过50ms的前提下,不断提高并发数,获取最佳性能。然而不同的机器配置,不同的业务类型,可能会有不同的结果。
下图展示了某个测试环境下,MySQL最佳性能的并发数,在并发128之前,随着并发数的增加,TPS也相应增加,响应时间平稳,然而超过128,可以看到TPS出现下降,并且响应时间增加明显。
简化理解
有三种连接方式 1.单线程模式,处理所有的用户连接 2.多线程处理,一个线程对应一个用户(mysql默认的方式) 3.线程池处理用户连接,一个线程池对应多个用户连接
每个用户连接在mysql中都是右一个数据结构THD表示,THD在连接建立时被创建,在连接断开时销毁,
用户连接和THD是一对一的关系,THD不能跨连接重用,THD结构大约有10k左右,它是一个C++类,
THD用户记录各种执行状态,在sql语句执行过程中,THD会根据实际情况申请内存使用,尤其对于复杂的sql,THD占用的内存大小会不断增长,平均下来一个链接大约10M左右