С прошлой недели без особой причины мой сайт начал резко тормозить. Я вошел в 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 ГБ
часть моего.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
Надеюсь, это поможет кому-то из вас указать мне правильное направление. У меня нет идей.
EDIT Похоже, все это имеет отношение к этим ошибкам MySQL:
http://bugs.mysql.com/bug.php?id=8945
http://bugs.mysql.com/bug.php?id=6070
К сожалению, они не решены :(
решение1
Проверьте значения вашего сервера mysql. Используете ли вы пользователей по умолчанию в mysql? Я бы также взглянул на две вещи:
Убедитесь, что только определенные серверы могут подключаться к базе данных mysql. Если у вас есть пользователь, который подключается из %, убедитесь, что у вас хороший пароль (и веская причина).
Убедитесь, что кто-то не отправляет запросы в ваше приложение за пределами требований кода, которые вы используете для запуска приложения. Кто-то может вводить данные в вашу базу данных, даже не посещая ваш сайт.
Следите за активными соединениями некоторое время, уделяя пристальное внимание netstat. Wait_timeout — это признак того, что кто-то/что-то запросило ваш сервер. Тщательное отслеживание поможет вам узнать, кто это. После того, как вы это сделаете, если вам нужно будет быстро заблокировать их, не внося радикальных изменений, используйте iptables.
И последнее... включите ведение журнала mysql на короткое время. Ваш сервер получит ударновы увидите, что именно происходит с mysql.
отредактируйте файл my.cnf и добавьте (или обновите) следующее:
log = /var/log/mysql/mysql.log
EDIT: Я сделал предыдущие предложения, потому что значение NULL в информационном поле указывает на то, что никакие операторы не выполняются.