前言
很多用户经常会问,我购买的连接是2000,怎么活跃了连接到了500就报警啊?就响应慢了啊?
通过命令我们来看下关于连接数有多少种:
mysql> show global variables like "max_connections";
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 1800 |
+-----------------+-------+
mysql> show global status like "%Threads%";
+------------------------------------------------+-------+
| Variable_name | Value |
+------------------------------------------------+-------+
| Threads_cached | 3 |
| Threads_connected | 0 |
| Threads_created | 7 |
| Threads_rejected | 0 |
| Threads_running | 2 |
+------------------------------------------------+-------+
11 rows in set (0.00 sec)
总连接数
客户购买的DB连接数是这个。max_connections,允许同时连接DB的客户端的最大线程数。如果客户端的连接数超过了max_connections,应用就会收到“too many connections”的错误。
下面是线程的状态信息:
已经创建的连接数
Threads_created是为处理连接而创建的线程数。再明确一点来说是连接到DB的,客户端的线程数。它包含Threads_running。 如果Threads_created很大,可能需要调整thread_cache_size。
线程cache命中率=Threads_created/Connections,cache命中率当然越大越好,如果命中率较低,可以考虑增加thread_cache_size。
已经连接的连接数
Thread_connected当前打开的连接数。
活跃连接数
Threads_running官方的说法是“没有sleep的线程数”。顾名思义是:在DB端正在执行的客户端线程总数。Server端保持这些连接同时客户端等待回复。有些线程可能消耗CPU或者IO,有些线程可能啥也没做单纯等表锁或行锁释放。当DB执行完这个线程,客户端收到回复,线程的状态就会从"running" 变成 "connected".
如果发现活跃链接数突然增高,通常是以下原因:
- 应用缓存失效
- 突发流量
参考
https://dev.mysql.com/doc/refman/5.6/en/server-status-variables.html#statvar_Threads_running
https://dba.stackexchange.com/questions/176679/what-is-the-difference-between-threads-connected-and-threads-running