Я запускаю довольно загруженный сайт, и в часы пик я вижу более 10.000 открытых соединений с моим сервером базы данных на моем веб-сервере при запуске команды netstat. 99% соединений находятся в TIME_WAIT
состоянии.
Я узнал об этой переменной mysql: wait_timeout
http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_wait_timeout сегодня. Мой по-прежнему установлен по умолчанию 28,800 секунд.
Безопасно ли снижение этого значения?
Ни один из моих запросов обычно занимает больше секунды. Поэтому кажется глупым держать соединение открытым в течение 480 минут.
Я также слышал об использовании mysql_pconnect
вместо mysql_connect
, но я читал только ужасные истории об этом, поэтому я думаю, что буду держаться подальше от этого.
wait_timeout
приведет к закрытию соединения, когда оно ожидает, что оно останется открытым.Ответы:
Понижение значения довольно тривиально без перезапуска MySQL
Допустим, вы хотите уменьшить время ожидания до 30 секунд
Сначала добавьте это в my.cnf
Затем вы можете сделать что-то вроде этого
Все соединения с БД после этого будут отключены через 30 секунд
ПРЕДУПРЕЖДЕНИЕ
Убедитесь, что вы используете явно использовать mysql_close. Я не доверяю Apache, как большинство разработчиков. В противном случае иногда возникает состояние гонки, при котором Apache закрывает соединение с БД, но не сообщает mysqld, и mysqld удерживает это соединение открытым до истечения времени ожидания. Хуже того, вы можете чаще видеть TIME_WAIT. Выберите значения тайм-аута с умом.
ОБНОВЛЕНИЕ 2012-11-12 10:10 ПО ВОСТОЧНОМУ ВРЕМЕНИ
ПРЕДОСТЕРЕЖЕНИЕ
После применения моих опубликованных предложений создайте сценарий
/root/show_mysql_netstat.sh
со следующими строками:Когда вы запустите это, вы должны увидеть что-то вроде этого:
Если вы все еще видите много mysql
TIME_WAITs
для любого данного веб-сервера, вот два шага эскалации:ESCALATION # 1
Авторизуйтесь на веб-сервере и перезапустите apache следующим образом:
При необходимости сделайте это для всех веб-серверов.
ESCALATION # 2
Вы можете заставить ОС уничтожать TIME_WAIT для mysql или любого другого приложения с помощью следующего:
Это приведет к истечению времени TIME_WAIT через 1 секунду.
Чтобы дать кредит, где кредит должен ...
TIME_WAIT
возникает.источник
Если вы получаете много подключений TIME_WAIT на сервере MySQL, то это означает, что сервер MySQL закрывает соединение. Наиболее вероятным случаем в этом случае было бы то, что хост или несколько хостов попали в черный список. Вы можете очистить это, запустив:
Чтобы получить список количества подключений к вашему IP, выполните:
Вы также можете подтвердить, что это происходит, перейдя к одному из ваших клиентов, у которого возникли проблемы с подключением и telnet к порту 3306. Он покажет сообщение с чем-то вроде:
источник
Если у вас много соединений TIME_WAIT с вашим сервером MySQL, это означает, что ваш код выполняет множество запросов к вашей БД и открывает / закрывает соединение для каждого запроса.
В этом случае вы должны использовать постоянное подключение к вашему серверу БД, используя расширение MySQLi.
http://php.net/manual/en/mysqli.persistconns.php
Если вы не можете использовать MySQLi, вы должны вместо этого использовать параметр thread_cache_size в вашей конфигурации MySQL.
источник