检查并设置连接限制
max_connections:允许连接到mysql最大连接数,默认151。
监控客户端连接情况相当重要,因为一旦可用连接耗尽,新的客户端连接就会遭到拒绝。
(1) 什么时候应该调整值
如果状态变量connection_errors_max_connections不为零,并且一直在增长,就说明不断有连接请求因数据库连接数量已经到达最大的值而失败,应该考虑max_connections的值。
> show status like 'connection_errors_max_connections';
+-----------------------------------+-------+
| Variable_name | Value |
+-----------------------------------+-------+
| Connection_errors_max_connections | 0 |
+-----------------------------------+-------+
数值过小会经常出现ERROR 1040: Too many connections错误,可以过’conn%’通配符查看当前状态的连接数量,以定夺该值的大小。
> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
> show status like 'max_used_connections'; --服务器响应的最大连接数:(并发)
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Max_used_connections | 8 | --最大并发连接数8
+----------------------+-------+
max_used_connections / max_connections * 100% (理想值≈ 85%)
如果max_used_connections跟max_connections相同 那么就是max_connections设置过低或者超过服务器负载上限了,低于10%则设置过大。
(2) 注意
每一个session操作MySQL数据库表都需要占用文件描述符,数据库连接本身也要占用文件描述,因此在增大max_connections时,也要考虑open_files_limit的设置是否够用
> show variables like 'open%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| open_files_limit | 8161 |
+------------------+-------+
open_files_limit 是mysql中的一个全局变量且不可动态修改。它控制着mysqld进程能使用的最大文件描述(FD)符数量。需要注意的是这个变量的值并不一定是你设定的值,mysqld会在系统允许的情况下尽量获取更多的FD数量。
- MySQL无论如何都会保留一个用于管理员(SUPER)登陆的连接,用于管理员连接数据库进行维护操作,即使当前连接数已经达到max_connections。因此MySQL的实际最大可连接数为max_connections+1;
- 增加max_connections参数的值,不会占用太多系统资源。系统资源(CPU、内存)的占用主要取决于查询的密度、效率等;
- 造成”MySQL: ERROR 1040: Too many connections”的一种原因是访问量过高,MySQL服务器抗不住,这个时候就要考虑增加从服务器分散读压力;另一种原因就是MySQL配置文件中max_connections值过小
> show status like 'Connections'; --MySQL服务器的连接尝试次数(成功与否)。
> show processlist; ##显示当前正在执行的mysql连接
监控连接使用率
MySQL 提供了 Threads_connected 指标以记录连接的线程数——每个连接对应一个线程。通过监控该指标与先前设置的连接限制,你可以确保服务器拥有足够的容量处理新的连接。MySQL 还提供了 Threads_running 指标,帮助你分隔在任意时间正在积极处理查询的线程与那些虽然可用但是闲置的连接。
如果服务器真的达到 max_connections 限制,它就会开始拒绝新的连接。在这种情况下,Connection_errors_max_connections 指标就会开始增加,同时,追踪所有失败连接尝试的 Aborted_connects 指标也会开始增加。
- Connection_errors_max_connections 当MySQL的最大并发数大于系统变量(show variables)中max_connections的最大并发数,因此而被拒绝的次数,将会记录在这个变量里。如果Connection_error_max_connections值比较大,则说明当前系统并发比较高,要考虑调大max_connections的值。
MySQL 提供了许多有关连接错误的指标,帮助你调查连接问题。 Connection_errors_internal 是个很值得关注的指标,因为该指标只会在错误源自服务器本身时增加。内部错误可能反映了内存不足状况,或者服务器无法开启新的线程。
应该设置的指标:
-
Threads_connected:当所有可用连接都被占用时,如果一个客户端试图连接至 MySQL,后者会返回 “Too many connections(连接数过多)”错误,同时将 Connection_errors_max_connections 的值增加。为了防止出现此类情况,你应该监控可用连接的数量,并确保其值保持在 max_connections 限制以内。
-
Aborted_connects:如果该计数器在不断增长,意味着用户尝试连接到数据库的努力全都失败了。此时,应该借助 Connection_errors_max_connections 与 Connection_errors_internal 之类细粒度高的指标调查该问题的根源。
thread_cache_size
> show variables like 'thread%';
+-------------------+---------------------------+
| Variable_name | Value |
+-------------------+---------------------------+
| thread_cache_size | 9 | 服务器的池中最多可以存放32个连接线程
| thread_handling | one-thread-per-connection |
| thread_stack | 286720 | 为每个线程分配280K内存空间
+-------------------+---------------------------+
- thread_cache_size 设置连接线程缓存的数目。这个缓存相当于MySQL线程的缓存池(thread cache pool),将空闲的连接线程放入连接池中缓存起来,而非立即销毁。当有新的连接请求时,如果连接池中有空闲的连接,则直接使用。否则要重新创建线程。创建线程是一个不小的系统开销。这个参数和物理内存由关系:
1G —> 8
2G —> 16
3G —> 32
3G —> 64 - thread_stack stack 是堆的意思,知道进程和线程都是有唯一的ID的,进程的ID系统会维护,二线程的ID,则由具体的线程库区维护,当进程或者线程休眠的时候,进程的上下文信息要在内存中开辟出一块区域,保存进程的上下文信息,以便于迅速唤醒程序。默认为MySQL的每个线程设置的堆栈大小为:286720 /1024=280K,一般不用动
- thread_handling 默认值是: one-thread-per-connection 表示为每个连接提供或者创建一个线程来处理请求,直至请求完毕,连接销毁或者存入缓存池。当值是no-threads 时,表示在始终只提供一个线程来处理连接,一般是单机做测试使用的。
查看线程状态信息
> show status like 'Threads%'; --查看线程状态信息
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_cached | 2 | mysql管理的线程池中还有多少可以被复用的资源
| Threads_connected | 6 | 已经打开的连接数,Threads_connected 跟show processlist结果相同
| Threads_created | 8 | 表示创建过的线程数,如果发现Threads_created值过大的话,表明MySQL服务器一直在创建线程,这也是比较耗资源,可以适当增加配置文件中thread_cache_size值,查询服务器
| Threads_running | 2 | 正在运行的连接数,这个数值一般远低于connected数值,准确的来说,Threads_running是代表当前并发数
+-------------------+-------+
> show status like 'Connection_errors_internal';
> show variables like 'thread_cache_size'; --如果我们在MySQL服务器配置文件中设置了thread_cache_size,当客户端断开之后,服务器处理此客户的线程将会缓存起来以响应下一个客户而不是销毁(前提是缓存数未达上限)。
- thread_cache命中率公式为:这个结果越大越好,最好不要小于90%,如果小了最改动thread_cache_size
>Thread_connected = SHOW GLOBAL STATUS LIKE Thread_created;
> Connections = SHOW GLOBAL STATUS LIKE 'Connections';
Thread_Cache_Hit=(1 - (Threads_created / Connections)) * 100
back_log
- MySQL在很短的时间内,突然收到很多的连接请求时,MySQL会将不能来得及处理的连接请求保存在堆栈中,以便MySQL后续处理。back_log参数设置了堆栈的大小.
- 如果需要漱口在较短时间内处理大量请求,应该考虑适当增大back_log的值
> show variables like 'back_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| back_log | 151 |
+---------------+-------+
> show status like 'Aborted%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| Aborted_clients | 9 | --MySQL 客户机被异常关闭的次数。
| Aborted_connects | 2 | --试图连接到MySQL服务器而失败的连接次数。
----------------------------
$ show status like 'Slow%';
Slow_lunch_threads 创建线程的时间过长,超过slow_launch_time的设定值,则会记录。
$ show status like 'Connection_error%'; --来查看连接的错误状态信息:
Connection_errors_peer_address 查找MySQL客户机IP地址是发生的错误数。
参考:https://blog.csdn.net/jiekou0376/article/details/80527046
https://blog.csdn.net/h106140873/article/details/78852185
https://blog.csdn.net/bzfys/article/details/48161021
http://www.gaodaima.com/19263.html
https://segmentfault.com/a/1190000005726466
https://blog.csdn.net/wangpeng198688/article/details/51682732