获取MySQL活跃线程数量
2,917 total views, 1 views today
朋友问我,是否监控了MySQL的活跃thread。我想了想,是监控的,因为依据是MySQL官方文档关于mysqladmin status的一句话“Threads:The number of active threads (clients)”。
但是,仔细想想,mysqladmin status中Threads的值并不是我们常说的活跃thread。我们日常中常说的活跃thread,是指正在执行命令的thread。
而,mysqladmin status中Threads的值和通过show processlist的thread数量是一致的。其包含了很多Sleep状态的thread,所以mysqladmin status的值并不能说是活跃 thread。
show processlist命令,我们可以看结果中包含了ID、User、Host、db、Commad等列。我们需要关注的是Command列。
1 2 3 4 5 6 7 8 9 10 |
mysql> show processlist; +----------+-----------------+-----------------+-----------+---------+----------+-----------------------------------------------------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----------+-----------------+-----------------+-----------+---------+----------+-----------------------------------------------------------------------------+------------------+ | 1 | event_scheduler | localhost | NULL | Daemon | 40591385 | Waiting on empty queue | NULL | | 59 | system user | | NULL | Connect | 40590906 | Waiting for master to send event | NULL | | 60 | system user | | NULL | Connect | 0 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL | | 19839044 | weixin | 10.5.2.67:60859 | weixin | Sleep | 955 | | NULL | | 19839059 | weixin | 10.5.2.69:34976 | weixin | Sleep | 1046 | | NULL | | 19845123 | weixin | 10.5.2.69:54566 | weixin | Sleep | 1369 | | NULL | |
Command列是指thread正在行的命令类型,共有30余种类型。
这里面 Sleep是一种特殊类型,因为它是在等待客户端发送新命令给它(The thread is waiting for the client to send a new statement to it.)。
所以,活跃thread中不能包含Sleep类型,在添加zabbix监控脚本时切忌排除Sleep类型。
1 2 |
#Real active thread (not Sleep) UserParameter=mysql.real_active_threads,HOME=/usr/local/zabbix/etc mysql -N -e 'select count(*) from information_schema.PROCESSLIST where COMMAND not like "Sleep"\G' 2>/dev/null|grep -ivw "row" |
zabbix监控截图:
其中,MySQL threads conneted 是指所有节点到MySQL的threads数量;MySQL real active threas是至指活跃的threas(不包含Sleep类型)。
另外,特别说明一下zabbix监控使用的MySQL用户一定要赋予PROCESS权限,这样才能查询出MySQL服务级别的所有processlist, 否则只能看到当前用户的processlist。
以上是我在工作中遇到过的问题,写出来让大家引以为鉴。