У меня возникла странная проблема с использованием адаптера PDO Zend_Db для управления моими подключениями к базе данных. Внезапно я постоянно нажимаю ограничение на соединение на моем сервере MySQL.
По какой-то причине каждые три или четыре часа или около того я получаю эту ошибку, и Apache избавляется от каждого HTTP-запроса с этой ошибкой:
PHP Неустранимая ошибка: исключить исключение «Zend_Db_Adapter_Exception» с сообщением «SQLSTATE [00000] [1129] Хост« my.internal.mysql.server.DNS.here »заблокирован из-за многих ошибок подключения; разблокировать «mysqladmin flush-hosts» в
Странно то, что я не изменил код и объемы трафика на самом деле не совпадают с тем, что было в прошлом, поэтому я знаю, что мое приложение не должно генерировать больше параллельных подключений. Самое странное, что я не изменил код в любом из основных файлов приложения почти за неделю, и все прошло с тех пор.
Перезагрузка службы mysql или очистка соединений с помощью mysqladmin flush-hosts делает трюк, и я уверен, что увеличение максимальных одновременных подключений в my.cnf также поможет устранить некоторые из этих проблем, но, похоже, основная проблема связана с само приложение создает слишком много соединений.
Любые мысли о том, как я могу развернуть и сопоставить кусок кода, вызывающий подвесное соединение? Внешне все страницы веб-приложения загружаются в порядке и с хорошей скоростью.
Я думаю, что один из ваших сценариев работает с очень длинным запросом или застрял?
Лучшим решением было бы создать инструмент ведения журнала и использовать его, чтобы узнать, где именно проблема.
Классы Zend_Log должны помочь вам написать этот инструмент ведения журнала, очевидно, что вам лучше использовать файл, а не DB. Поскольку ваша проблема связана с БД, вы должны создать или изменить класс DB, чтобы испускать некоторые журналы.
Я не знаю объем вашего проекта, но он может иметь некоторые побочные эффекты производительности .
Кроме того, игра с долгой функцией запросов MySQL, вероятно, даст вам некоторый намек.
Надеюсь, вы найдете, где ваша проблема.
Вы пытались вручную закрыть соединение? Это, по-видимому, особая проблема.
$db->closeConnection();
Ссылка: http://framework.zend.com/manual/en/zend.db.adapter.html#zend.db.adapter.closing
15.1.8. Закрытие соединения
Не уверен, что это вам пригодится, но эта ссылка дает вам (временное) хорошее описание проблемы, которую вы испытываете, а также параметр -max_connect_errors, который вы можете переопределить:
Пользователь также отвечает и рекомендует попробовать следующее в командной строке:
> mysqladmin -u <user> -p<password> processlist
Это даст вам список ваших текущих подключений mysql, чтобы получить представление о том, сколько одновременных подключений вы используете в настоящее время. Опять же, это не решения для каждого, но, надеюсь, они помогут вам решить проблему, связанную с проблемой отказа.
Наше приложение Zend также оставило несколько открытых соединений. Они, как правило, приходят в штыки, но мы никогда не выясняли, что происходит. Мы работали над проблемой, установив max_connections
высоко (что нам было необходимо по другим причинам, так или иначе) и сократили wait_timeout
до двух часов. Мы могли бы уйти с гораздо меньшим таймаутом, но не хотели рисковать реальным приложением, как только перестали видеть сбои.
сначала я спрошу: есть ли у вас новые ядра? (проверьте журнал ошибок apache).
во-вторых: из моего мрачного опыта, имеющего слишком много соединений с базой данных, обычно это означает, что у вас слишком много процессов apache, которые не умирают должным образом. Обычно это вызвано каким-то долговременным процессом, блокировкой памяти и т. Д., Чтобы попытаться strace
некоторые из ваших процессов apache и посмотреть, не повесились ли они или не сделали бесконечных циклов.
Если у вас нет значительного увеличения трафика, вы не должны страдать от проблем со слишком многими подключениями
Не думайте, что это связано с правильным закрытием соединения. http://dev.mysql.com/doc/refman/5.0/en/blocked-host.html говорит, что это скорее проблема с сетевым уровнем.