数据库版本:percona-mysql5.6.16时间长了,程序会连接数据库,响应变慢,一般在几毫秒到几十毫秒之间,偶尔也有几百毫秒;一开始,由于开发时对程序连接池进行了重置和调整,一直怀疑是连接池的问题,但问题依旧;因为使用的版本是percona-mysql5.6.16,并且使用了数据库连接池。线程池根据参数thread_pool_size分为若干组,每组维护客户端发起的连接。当MySQL建立连接时,MySQL根据连接的线程id对thread_pool_size取模,将连接发起的sql语句分配到对应的组中。每个组的最大工作线程数为thread_pool_oversubscribe+1。如果worker数量仍然不足以处理回复请求,连接会在group上等待,导致sql语句的rt增加;因此,增加thread_pool_oversubscribe参数,问题依旧;查看thread_cache_size,服务器内存大小为64G,thread_cache_size=128;每建立一个连接,就需要一个线程来匹配它。该参数用于缓存空闲线程,以免被销毁。如果线程缓存中有空闲线程,此时如果有新的连接建立,MYSQL会快速响应连接请求;showstatuslike'%thread%';Variable_nameValueThreads_cached0Threads_connected219Threads_created655068Threads_running48使用showstatus查看当前mysql连接状态:SHOWSTATUSWHEREVariable_nameLIKE'%Thread%';Threads_cached:表示此时线程缓存中有多少空闲线程。Threads_connected:表示当前建立的连接数,因为一个连接需要一个线程,所以也可以看成是当前使用的线程数。Threads_created:表示自上次服务启动后创建的线程数。Threads_running:表示当前活动(非休眠??)线程的数量。它不代表正在使用的线程数。有时候连接建立了,但是连接处于休眠状态,这里对应的线程也处于休眠状态。***将thread_cache_size设置为与threads_connected相同。showvariableslike'%thread%';+----------------------------------------+--------------+|Variable_name|Value|+--------------------------------------+----------------+|innodb_purge_threads|1||innodb_read_io_threads|4||innodb_thread_concurrency|0||innodb_thread_sleep_delay|10000||innodb_write_io_threads|4||max_delayed_threads|20||max_insert_delayed_threads|20||myisam_repair_threads|1||performance_schema_max_thread_classes|50||performance_schema_max_thread_instances|-1||pseudo_thread_id|currency|thread2_851|size|thread2_851||thread_handling|线程池||thread_pool_high_prio_mode|事务||thread_pool_high_prio_tickets|4294967295||thread_pool_idle_timeout|60||thread_pool_max_threads|100000||thread_pool_oversubscribe|40||thread_pool_size|12||thread_pool_stall_limit|500||624stack|2thread_statistics|OFF|+----------------------------------------+-----------------+可以不刷新,如果Threads_cached=0 且Threads_created不如果thread_cache_size的当前值不断增加,那么thread_cache_size的当前值应该改为Threads_connected的值左右,结合物理内存1G—>8;2G—>16;3G—>32;>3G—>64综合考虑两种情况的值,将thread_cache_size改为512;译注:Threads_cached:表示此时线程缓存中当前有多少个空闲线程Threads_connected:表示当前建立的连接数,因为一个连接需要一个线程,所以也可以看成是当前使用的线程数。Threads_created:表示自上次服务启动后创建的线程数。Threads_running:表示当前活动(非休眠??)线程的数量。它不代表正在使用的线程数。有时候连接建立了,但是连接处于休眠状态,这里对应的线程也处于休眠状态。修改thread_cache_size为512后,重新测试程序连接数据库的响应时间,速度极快,不再出现程序连接数据库响应慢的情况!
