今天上班例行的查看了下服务器的运行情况,发现服务器特卡,是mysqld这个进程占用CPU到了99%致使的。php
比较好奇是那个程序在使用mysql致使cpu这么高的,经过show processlist命令查看了当前正在执行的sql语句,从而定位到了对应的程序,发现代码中有一个死循环在不停的查询致使cpu占用99%,缘由找到了问题就好解决了。mysql
这里简单的记录一下processlist的用法:sql
processlist 命令的输出结果显示了有哪些线程在运行,能够帮助识别出有问题的查询语句,两种方式使用这个命令。数据库
1. 进入 mysql/bin 目录下输入 mysqladmin processlist;服务器
2. 启动 mysql ,输入 show processlist;.net
若是有 SUPER 权限,则能够看到所有的线程,不然,只能看到本身发起的线程(这是指,当前对应的 MySQL 账户运行的线程)。线程
获得数据形式以下(只截取了三 条):进程
mysql> show processlist;ip
+-----+-------------+--------------------+-------+---------+-------+----------------------------------+----------ssl
| Id | User | Host | db | Command | Time| State | Info
+-----+-------------+--------------------+-------+---------+-------+----------------------------------+----------
|207|root |192.168.0.20:51718 |mytest | Sleep | 5 | | NULL
|208|root |192.168.0.20:51719 |mytest | Sleep | 5 | | NULL
|220|root |192.168.0.20:51731 |mytest |Query | 84 | Locked |
select bookname,culture,value,type from book where id=001
先简单说一下各列的含义和用途,第一列, id , 不用说了吧,一个标识,你要 kill 一个语句的时候颇有用。 user列, 显示单前用户,若是不是 root ,这个命令就只显示你权限范围内的 sql 语 句。 host 列,显示这个语句是从哪一个 ip 的哪 个端口上发出的。呵呵,能够用来追踪出问题语句的用户。 db 列,显示这个进程目前链接的是 哪一个数据库 。command 列,显示当前链接的执行的命令,通常就是休眠( sleep ),查询( query ),链接( connect )。 time 列,此这个状态持续的时间,单位是秒。 state 列,显示使用当前链接的 sql 语句的状态,很重要的列,后续会有全部的状态的描述,请注意, state 只是语句执行中的某一个状态,一个 sql 语 句,已查询为例,可能须要通过 copying to tmp table ,Sorting result , Sending data 等状态才 能够完成, info 列,显示这个 sql 语 句,由于长度有限,因此长的 sql 语句就显示不全,可是一个判断问题语句的重要依据。
当MySQL繁忙的时候运行show processlist,会发现有不少行输出,每行输出对应一个MySQL链接。怎么诊断发起链接的进程是哪一个?它当前正在干吗呢?
首先,须要经过TCP Socket而不是Unix Socket链接MySQL,这样在show processlist的输出中就会有来源端口号。以下,
mysql> show processlist;
+——–+——–+—————–+——+———+——+——-+——————+
| Id | User | Host | db | Command | Time | State | Info |
+——–+——–+—————–+——+———+——+——-+——————+
| 277801 | mydbuser | localhost:35558 | mydb | Sleep | 1 | | NULL |
| 277804 | mydbuser | localhost:35561 | mydb | Sleep | 1 | | NULL |
| 277805 | mydbuser | localhost:35562 | mydb | Sleep | 0 | | NULL |
+——–+——–+—————–+——+———+——+——-+——————+
在Host列有来源IP和端口号,而后咱们从链接机器查看端口号是谁打开的,
[root@localhost ~]# netstat -ntp | grep 35558
… 124.115.0.68:35558 ESTABLISHED 18783/httpd
可知进程18783发起的MySQL链接来源端口是35558,而后就能够用strace观察这个进程了。若是是Apache的PHP脚本,还能够 用proctitle模块( http://pecl.php.net/package/proctitle/ )设置脚本的状态信息。
lsof也能根据端口号显示进程号,细节请参考手册。