我有一个MySQL服务器的问题。 一些MySQL线程几个小时吃掉了整个处理器。 杀死进程肯定有帮助,但是如何跟踪代码在里面运行呢?
我目前的最高层:
PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ IO Command 1353 mysql 20 0 340M 70004 7652 S 31.0 1.1 1h34:28 0 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket 4344 mysql 20 0 340M 70004 7652 S 3.0 1.1 5:17.75 0 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket 5870 mysql 20 0 340M 70004 7652 S 2.0 1.1 1:13.46 0 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket mysql> SHOW PROCESSLIST; +------+-------+-----------+---------+---------+------+--------------+--------------- | Id | User | Host | db | Command | Time | State | Info +------+-------+-----------+---------+---------+------+--------------+---------------- | 8731 | sites | localhost | mywebsite | Sleep | 2520 | | NULL | 8734 | sites | localhost | mywebsite | Sleep | 2516 | | NULL | 8737 | sites | localhost | mywebsite | Sleep | 2508 | | NULL | 8741 | sites | localhost | mywebsite | Sleep | 2502 | | NULL ... | 9848 | root | localhost | NULL | Query | 0 | NULL | SHOW PROCESSLIST | 9952 | sites | localhost | mywebsite | Sleep | 2 | | NULL | 9953 | sites | localhost | mywebsite | Query | 2 | Sending data | SELECT user_info.name, | +------+-------+-----------+---------+---------+------+--------------+--------------------------- 150 rows in set (0.00 sec)
那么,杀死进程后(它已经吃掉了整个CPU)输出是变化的(10分钟之后,仍然没有空过程):
mysql> SHOW PROCESSLIST; +-----+------+-----------+------+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +-----+------+-----------+------+---------+------+-------+------------------+ | 952 | root | localhost | NULL | Query | 0 | NULL | SHOW PROCESSLIST | +-----+------+-----------+------+---------+------+-------+------------------+ 1 row in set (0.00 sec)
睡眠MySQL进程确实占用了CPU。
150个睡眠查询是很多。 你有几百(或更多)的并发连接? 如果没有,这可能是首先要看的。
在您的Web应用程序中,请确保在完成查询后closuresMySQL连接。 PHP中的mysql_close(),但实现基于您当前的设置。