У меня проблема с сервером 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)
Что ж, после убийства процесса (он уже съел весь процессор) вывод изменяется (через 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 на самом деле используют процессор.
150 спящих запросов - это много. У вас есть сотни (или больше) одновременных подключений? Если нет, то это, вероятно, первое, на что стоит обратить внимание.
В своем веб-приложении убедитесь, что вы закрыли соединение MySQL после завершения запроса. mysql_close () в PHP, но реализация основана на вашей текущей настройке.