Назад | Перейти на главную страницу

Поток mysql съедает весь процессор

У меня проблема с сервером 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, но реализация основана на вашей текущей настройке.