客户端发起连接到MySQL server,mysql server监听进程,监听到新的请求,然后mysql为其分配一个新的 thread,去处理此请求。从建立连接之开始,CPU要给它划分一定的thread stack,然后进行用户身份认证,建立上下文信息,最后请求完成,关闭连接,同时释放资源。在高并发的情况下,将给系统带来巨大的压力,不能保证性能。MySQL服务器的线程数需要在一个合理的范围之内,这样才能保证MySQL服务器健康平稳地运行。
查看线程池的状态:
mysql> show variables like 'thread%'; +--------------------+---------------------------+ | Variable_name | Value | +--------------------+---------------------------+ | thread_cache_size | 64 | | thread_concurrency | 10 | | thread_handling | one-thread-per-connection | | thread_stack | 262144 | +--------------------+---------------------------+thread_cache_size
Threads_cached 中存放的最大连接线程数。在短连接的应用中Threads_cached 的功效非常明显,因为在应用中数据库的连接和创建是非常频繁的。如果不使用 Threads_cached那么消耗的资源是非常可观的。在长连接中虽然带来的改善没有短连接的那么明显,但是好处是显而易见的。但并不是越大越好,大了反而浪费资源,这个的确定一般认为和物理内存有一定关系。Mysql默认值为9。
1G —> 8 2G —> 16 3G —> 32 >3G —> 64设置方法:
mysql> set global thread_cache_size=64;thread_concurrency
thread_concurrency应设为CPU核数的2倍, 比如有一个双核的CPU,,那么thread_concurrency的应该为4。这个变量是针对Solaris系统的,如果设置这个变量的话,mysqld就会调用thr_setconcurrency()。这个函数使应用程序给同一时间运行的线程系统提供期望的线程数目。但是在5.7以后就已经抛弃了。
thread_handling
运用Thread_Cache处理连接的方式,5.1.19添加的新特性。有两个值可选[no-threads|one-thread-per-connection] 。
no-threads :服务器使用一个线程
one-thread-per-connection :服务器为每个客户端请求使用一个线程
thread_stack
每个连接被创建的时候,mysql分配给它的内存。这个值一般认为默认就可以应用于大部分场景了,除非必要非则不要动它。上面表示是256kb。
查看线程使用情况:
Threads_cached
MySQL里面为了提高客户端请求创建连接过程的性能,提供了一个连接池也就是 Thread_cache池(大小是thread_cache_size),将空闲的连接线程放在连接池中,而不是立即销毁。这样的好处就是,当又有一个新的请求的时候,mysql不会立即去创建连接 线程,而是先去Thread_Cache中去查找空闲的连接线程,如果存在则直接使用,不存在才创建新的连接线程。 Thread_cache值表示已经被线程缓存池缓存的线程个数。
Threads_connected
当前处于连接状态的线程个数,等于show processlist
Threads_created
Threads_created表示创建过的线程数,如果发现Threads_created值过大的话,表明MySQL服务器一直在创建线程,这也是比较耗资源,可以适当增加配置文件中thread_cache_size值。
Threads_running
处于激活状态的线程的个数,这个一般都是远小于Threads_connected的。