我的 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 应用程序中,确保在完成查询后关闭 MySQL 连接。mysql_close() 在 PHP 中,但实现基于您当前的设置。