MySQL优化之连接优化
上文MySQL优化之缓存优化这篇文章中提到了一个很重要的概念,就是showvariables是用来表示系统编译或者配置在my.cnf中的变量值。而showstatus则称之为状态值,显示的是当前服务实例运行所具有的状态信息,是一个动态改变的值。因此常用来观测当前MySQl的运行是否正常,如果不正常那么依靠调整静态参数来提高MySQL的性能。所以明白这两个概念的不同,是后面调优的基础。
MySQL连接优化
记得有一次在公司内部连接MySQL的时候,总是连接不上。找到DBA后,经过排查原因,是当前MySQL连接数满了,经过调整后,解决了问题。引发连接数过多的错误原因一般有两个,第一的确是有很多人在连接MySQL,造成连接数用完。第二种是max_connections值过小。
1、连接参数(showvariables)
mysql>showvariableslike'%connect%'; +-----------------------------------------------+-----------------+ |Variable_name|Value| +-----------------------------------------------+-----------------+ |character_set_connection|utf8| |collation_connection|utf8_general_ci| |connect_timeout|10| |disconnect_on_expired_password|ON| |init_connect|| |max_connect_errors|100| |max_connections|151| |max_user_connections|0| |performance_schema_session_connect_attrs_size|512| +-----------------------------------------------+-----------------+
max_connections是指MySQL服务实例能够同时接受的的最大并发连接数。MySQL实际上支持最大连接数加一的算法,保障当连接数用完的时候,超级管理员依然可以和服务端建立连接,进行管理。
max_user_connections设置指定账号的最大并发连接数。
max_connect_errors当某台非法主机恶意连接MySQL服务端,遭到的错误达到设置值后,MySQL会解决来自该主机的所有连接。但执行flushhosts后会清零。
2、连接状态(showstatus)
有一点需要注意的,变量值(showvariables)是以小写字母开头的,而状态值(showstatus)是以大写字母开头。这样区分有助于记忆和分类
mysql>showstatuslike'%connections%'; +-----------------------------------+-------+ |Variable_name|Value| +-----------------------------------+-------+ |Connection_errors_max_connections|0| |Connections|197| |Max_used_connections|2| +-----------------------------------+-------+
Connection_errors_max_connections当MySQL的最大并发数大于系统变量(showvariables)中max_connections的最大并发数,因此而被拒绝的次数,将会记录在这个变量里。如果Connection_error_max_connections值比较大,则说明当前系统并发比较高,要考虑调大max_connections的值。
Connections表示MySQL从启动至今,成功建立连接的连接数,这个值是不断累加的。
Max_used_connections表示MySQL从启动至今,同一时刻并发的连接数,取得是最大值。如果这个值大于max_connections则表明系统经常处于高并发的状态,应该考虑调大最大并发连接数。
3、连接线程参数(threadvariablsandstatus)
mysql>showvariableslike'thread%'; +--------------------+---------------------------+ |Variable_name|Value| +--------------------+---------------------------+ |thread_cache_size|9| |thread_concurrency|10| |thread_handling|one-thread-per-connection| |thread_stack|262144| +--------------------+---------------------------+
thread_cache_size设置连接线程缓存的数目。这个缓存相当于MySQL线程的缓存池(threadcachepool),将空闲的连接线程放入连接池中缓存起来,而非立即销毁。当有新的连接请求时,如果连接池中有空闲的连接,则直接使用。否则要重新创建线程。创建线程是一个不小的系统开销。MySQL的这部分线程处理和Nginx的线程处理有异曲同工之妙,以后介绍Nginx的线程处理时,会拿来做对比。
thread_handling默认值是:one-thread-per-connection表示为每个连接提供或者创建一个线程来处理请求,直至请求完毕,连接销毁或者存入缓存池。当值是no-threads时,表示在始终只提供一个线程来处理连接,一般是单机做测试使用的。
thread_stackstack是堆的意思,由PHP进程详解这篇博客,知道进程和线程都是有唯一的ID的,进程的ID系统会维护,二线程的ID,则由具体的线程库区维护,当进程或者线程休眠的时候,进程的上下文信息要在内存中开辟出一块区域,保存进程的上下文信息,以便于迅速唤醒程序。默认为MySQL的每个线程设置的堆栈大小为:262144/1024=256k
查看线程状态信息
mysql>showstatuslike'Thread%'; +-------------------+-------+ |Variable_name|Value| +-------------------+-------+ |Threads_cached|1| |Threads_connected|1| |Threads_created|2| |Threads_running|1| +-------------------+-------+
Thread_cached当前线程池的线程数
Thread_connected当前的连接数
Thread_cached:当前连接线程创建数,如果这个值过高,可以调整threadcachesize也就是调整线程缓存池的大小。
Thred_runnint:当前活跃的线程数。
连接请求堆栈
MySQL在很短的时间内,突然收到很多的连接请求时,MySQL会将不能来得及处理的连接请求保存在堆栈中,以便MySQL后续处理。back_log参数设置了堆栈的大小,可以通过如下命令查看:
mysql>showvariableslike'back_log'; +---------------+-------+ |Variable_name|Value| +---------------+-------+ |back_log|80| +---------------+-------+
连接异常
mysql>showstatuslike'Aborted%'; +------------------+-------+ |Variable_name|Value| +------------------+-------+ |Aborted_clients|0| |Aborted_connects|219| +------------------+-------+
Aborted_clientsMySQL客户机被异常关闭的次数。
Aborted_connects试图连接到MySQL服务器而失败的连接次数。
other
mysql>showstatuslike'Slow%'; +---------------------+-------+ |Variable_name|Value| +---------------------+-------+ |Slow_launch_threads|0| |Slow_queries|0| +---------------------+-------+
mysql>showvariableslike'slow_launch_time'; +------------------+-------+ |Variable_name|Value| +------------------+-------+ |slow_launch_time|2| +------------------+-------+
Slow_lunch_threads创建线程的时间过长,超过slow_launch_time的设定值,则会记录。
可以通过使用Connection_error%来查看连接的错误状态信息:
mysql>showstatuslike'Connection_error%'; +-----------------------------------+-------+ |Variable_name|Value| +-----------------------------------+-------+ |Connection_errors_accept|0| |Connection_errors_internal|0| |Connection_errors_max_connections|0| |Connection_errors_peer_address|0| |Connection_errors_select|0| |Connection_errors_tcpwrap|0| +-----------------------------------+-------+
Connection_errors_peer_address查找MySQL客户机IP地址是发生的错误数。