Step 1:show full processlist;
该指令是用来查看那些线程正在运行,你也可以得到这些信息,从INFORMATION_SCHEMA PROCESSLIST这个表,或者通过mysqladmin processlist指令。如果你有PROCESS权限,你可以查看所有的线程。否则,你只能查看你自己当前账户的线程。如果你没有使用FULL关键字,你只能查看每个记录中Info字段里面的前100个字符。
> show full processlist;
+----------+----------------+----------------------+----------------+---------+------+-------+-----------------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+----------+----------------+----------------------+----------------+---------+------+-------+-----------------------+----------+
| 18849875 | df | 18.10.212.61:44852 | common | Sleep | 1 | | NULL | 0.000 |
| 22548511 | monitor | localhost:38282 | monitor | Sleep | 2 | | NULL | 0.000 |
| 23596429 | activity | 18.21.27.22:44971 | activity | Sleep | 219 | | NULL | 0.000 |
| 23775691 | df | 18.10.253.1:56296 | common | Sleep | 89 | | NULL | 0.000 |
+----------+----------------+----------------------+----------------+---------+------+-------+-----------------------+----------+
4 rows in set (0.00 sec)
这里,可以看到SHOW PROCESSLIST指令里面的输出内容,有几个字段,下面给予解释说明,只有搞清楚了这些字段的含义,才对我们的实际项目问题分析才有价值:
Id:
连接标识符。这与information_schema.processlist表,性能的processlist_id列架构线程表,并由连接函数返回。User:
发出该语句的mysql用户。如果这是系统用户,则表示非客户机线程由服务器生成,用于内部处理任务。这可能是用于复制的I/O或SQL线程从或延迟的行处理程序。未经身份验证的用户引用的线程与客户端连接关联,但尚未对其进行客户端用户身份验证。事件调度程序是指监视计划事件的线程。对于系统用户,没有主机列中指定的主机。Host:
发出该语句的客户端的主机名(没有主机的系统用户除外)。show processlist报告主机\u name:client\u port中TCP/IP连接的主机名设置格式以便于确定哪个客户机正在执行什么操作。db:
如果选择了默认数据库,则为空。Command:
线程正在执行的命令类型。Time:
线程处于其当前状态的时间(秒)。对于从属SQL线程,该值是上次复制事件的时间戳与从属计算机的实时之间的秒数。State:
大多数状态对应于非常快速的操作。如果一个线程在给定的状态下保持很多秒,可能有一个问题需要调查。
指示线程正在执行的操作、事件或状态。Info:
线程正在执行的语句,如果不执行任何语句,则为空。该语句可能是发送到服务器的语句,如果该语句执行其他语句,则可能是最内部的语句。例如,如果一个call语句执行一个执行select语句的存储过程,那么info值将显示select语句。
杀掉线程
> KILL [CONNECTION | QUERY] processlist_id
connection选项,kill的时候,将连接也断掉,而query选项,kill的过程只是将该指令杀掉,连接还保持。 kill指令不指定connection或者query选项时,默认是connection。
Step 2:show status like 'Threads%'
+-------------------+--------+
| Variable_name | Value |
+-------------------+--------+
| Threads_cached | 8 |
| Threads_connected | 149 |
| Threads_created | 649192 |
| Threads_running | 1 |
+-------------------+--------+
mysql是通过线程缓存来完成线程重用的。客户端发起连接时,首先会去线程缓冲池里找是不是有空闲的线程。如果没有才会去新建线程。当一个连接断开的时候,并不会马上销毁线程释放资源。而是暂时把线程放在缓冲池中挂起。
所以这里就涉及到了三个参数,一个是treads_cached这个是缓冲池中的线程个数。还有一个是treads_connected这个是连接中的线程数。第三个是Threads_created,它的含义是已经创建的线程数。在并发数低的情况下,一般Threads_created参数是treads_cached和treads_connected参数之和。当并发数高的情况下,Threads_created就会暴增,这个时候就需要考虑thread_cache_size来设置缓冲池的大小了。