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

Множество процессов NULL в MySQL

С прошлой недели мой сайт без особой причины стал резко тормозить. Я вошел в MySQL и запустил show processlist, в результате получилось что-то вроде этого:

mysql> show full processlist;
+------+------+-----------+---------+---------+------+-------+------------------+
| Id   | User | Host      | db      | Command | Time | State | Info             |
+------+------+-----------+---------+---------+------+-------+------------------+
| 2047 | web  | localhost | myDB    | Sleep   |   81 |       | NULL             |
| 2049 | web  | localhost | myDB    | Sleep   |   81 |       | NULL             |
| 2050 | web  | localhost | myDB    | Sleep   |   81 |       | NULL             |
| 2052 | web  | localhost | myDB    | Sleep   |   81 |       | NULL             |
| 2053 | web  | localhost | myDB    | Sleep   |   81 |       | NULL             |
| 2054 | web  | localhost | myDB    | Sleep   |   81 |       | NULL             |
| 2055 | web  | localhost | myDB    | Sleep   |   81 |       | NULL             |
...
| 2066 | web  | localhost | myDB    | Sleep   |   80 |       | NULL             |
| 2067 | web  | localhost | myDB    | Sleep   |   80 |       | NULL             |
| 2178 | web  | localhost | myDB    | Sleep   |   76 |       | NULL             |
+------+------+-----------+---------+---------+------+-------+------------------+
131 rows in set (0.00 sec)

Когда я перезапускаю MySQL, у меня нет ожидаемых процессов. Когда я обновляю свой сайт и быстро проверяю процессы, я вижу, что некоторые запросы исчезают через мгновение. Все идеально, но затем, спустя какое-то время совершенно неожиданно, я снова получаю множество процессов, подобных показанным выше. Это, конечно, замораживает мой сайт.

Они, кажется, исчезают через некоторое время, но до того, как ценность wait_timeout а затем появятся снова через некоторое время с другими идентификаторами.

Кто-нибудь знает, что может быть причиной этого?

Характеристики моего сервера:
CentOS 5
Версия MySQL: 5.1.33-log Распространение исходного кода
RAM 8 ГБ

часть my.cnf

[mysqld]
default-character-set   = utf8
character_set_server    = utf8
default-collation       = utf8_unicode_ci
collation_server        = utf8_unicode_ci
ft_min_word_len         = 3
port                    = 5689
socket                  = /tmp/mysql.sock
skip-locking
skip-name-resolve
key_buffer_size         = 256M
group_concat_max_len    = 2048
max_allowed_packet      = 10M
table_cache             = 512
table_definition_cache  = 512
sort_buffer_size        = 10M
net_buffer_length       = 8K
read_buffer_size        = 40M
read_rnd_buffer_size    = 10M
myisam_sort_buffer_size = 8M
long_query_time         = 1
net_read_timeout        = 30
net_write_timeout       = 60
log_slow_queries        = /var/log/slowqueries
query_cache_type        = 1
query_cache_limit       = 5MB
query_cache_size        = 134217728
max_heap_table_size     = 24MB
tmp_table_size          = 24MB
expire_logs_days        = 99
max_connections         = 500
init-connect            = 'SET NAMES latin1'
thread_cache_size       = 4
wait_timeout            = 600

Я надеюсь, что это поможет одному из вас указать мне правильное направление. У меня нет идей.

ИЗМЕНИТЬ Все это похоже на эти ошибки MySQL:
http://bugs.mysql.com/bug.php?id=8945
http://bugs.mysql.com/bug.php?id=6070
К сожалению, они не решены :(

Проверьте значения вашего сервера mysql. Вы используете пользователей по умолчанию в MySQL? Я бы также посмотрел на две вещи:

  1. Убедитесь, что только определенные серверы могут подключаться к базе данных mysql. Если у вас есть пользователь, который подключается с%, убедитесь, что у вас есть хороший пароль (и веская причина).

  2. Убедитесь, что кто-то не отправляет в ваше приложение запросы, выходящие за рамки требований к коду, которые у вас есть для запуска приложения. Кто-то может вводить данные в вашу базу данных, даже не посещая ваш сайт.

Некоторое время отслеживайте свои активные подключения, уделяя пристальное внимание netstat. Wait_timeout - это показатель того, что кто-то / что-то запросил ваш сервер. Внимательное отслеживание поможет вам узнать, кто они. Как только вы это сделаете, если вам нужно быстро заблокировать их, не внося радикальных изменений, используйте iptables.

И последнее ... ненадолго включите ведение журнала mysql. Ваш сервер получит удар но вы точно увидите, что происходит с mysql.

отредактируйте файл my.cnf и добавьте (или обновите) следующее:

log             = /var/log/mysql/mysql.log

РЕДАКТИРОВАТЬ: я сделал предыдущие предложения, потому что значение NULL в информационном поле указывает, что никакие операторы не выполняются.