Я получаю сообщение об ошибке ниже случайным образом из заданий бэкэнда php и журналов веб-страниц php. Иметь сервер приложений, который запускает бэкенд-задания php и веб-серверы php. Оба подключаются к одному серверу базы данных. Использование php mysqli объектно-ориентированной библиотеки для подключения к базе данных. В my.cnf установили максимальное количество подключений до 750. Не вижу, что много связей достигнуто.
Предупреждение PHP: mysqli :: mysqli (): (HY000 / 2003): не удается подключиться к серверу MySQL в ’77 .777.120.81 ‘(99) в /usr/local/dev/classes/Admin.php в строке 15
Не удалось подключиться к MySQL: не удается подключиться к серверу MySQL в ’77 .777.120.81 ‘(99)
Как отлично описано в этом Блог производительности базы данных Percona статья, ваша проблема в том, что ваше приложение не может открыть другое соединение с сервером MySQL. У вас заканчиваются локальные порты TCP. В качестве решения я бы предложил Твик настройки параметров TCP
Можно заставить ядро повторно использовать зависание соединения в состоянии TIME_WAIT, установив / proc / sys / net / ipv4 / tcp_tw_reuse в 1. Что на практике происходит, так это то, что закрытые соединения будут висеть в TIME_WAIT до тех пор, пока они не будут истекает или запрашивается новое соединение. В последнем случае соединение будет «восстановлено».
При включении / proc / sys / net / ipv4 / tcp_tw_recycle закрытые соединения больше не будут отображаться в TIME_WAIT — они вообще исчезают из netstat. Но как только вы откроете новое соединение (в пределах 60 секунд), оно перезапустит одно из них. Но каждый, кто пишет об этой альтернативе, похоже, не советует ее использовать. Итог: предпочтительнее повторно использовать соединение, чем перерабатывать его.
Этот параметр определяет, сколько соединений может оставаться в состоянии TIME_WAIT одновременно: ядро будет
просто убейте соединения, висящие в таком состоянии выше этого числа. Например, в сценарии, где сервер имеет диапазон портов TCP, состоящий только из 6 портов, если/proc/sys/net/ipv4/tcp_max_tw_buckets
установлен на 5, затем откройте 6 одновременных подключений с MySQL, а затем немедленно закройте все 6, вы найдете только 5 из них, висящие в состоянии TIME_WAIT — как сtcp_tw_recycle
один из них просто исчезнет изnetstat
выход. Эта ситуация позволяет немедленно открыть новое соединение, не дожидаясь минут *.
- Когда дело доходит до подключения к серверам баз данных, многие приложения предпочитают открывать новое соединение только для одного запроса, закрывая его сразу после обработки запроса. Даже если клиент закрывает соединение (приложение), локальный порт, который он использовал, не сразу освобождается ОС для повторного использования другим соединением: он будет находиться в состоянии TIME_WAIT (обычно) 60 секунд — это значение не может быть легко меняется, так как он жестко закодирован в ядре.
Однако второе соединение не сможет открыться до тех пор, пока не истечет срок действия одного из 5 других подключений в TIME_WAIT и не освободится используемый локальный порт. Таким образом, секрет здесь заключается в том, чтобы найти компромисс между количеством доступных сетевых портов и количеством соединений, которым мы позволяем оставаться в состоянии TIME_WAIT. Значение по умолчанию для этого параметра равно 65536, что означает, что по умолчанию система разрешает всем возможным соединениям переходить через состояние TIME_WAIT при закрытии.
PS: Есть более возможные решения вашей проблемы, прочитайте статью полностью для подробного описания проблемы.
Обновление 1:
tcp_tw_reuse
выглядит лучшее решение. Здесь описано почему:
Оригинальный ответ:
Ошибка MySQL (99) означает, что у вас не хватает портов TCP.
Включение tcp recycle должно исправить это.
echo 1 >/proc/sys/net/ipv4/tcp_tw_recycle
ссылка обращаться
Я могу подключиться из локальной оболочки, поэтому сначала подумал, что если что-то не так с недавним обновлением Zend Framework, но через некоторое время я понял, что ответ очень прост — SELinux блокировал удаленные подключения из сценариев PHP, выполняемых веб-сервером Apache. Код ошибки (13) в конце сообщения об ошибке означает «отказано в разрешении», так что это означает, что у вас есть аналогичная проблема или нет.
В любом случае, войдите как root и сделайте
setsebool -P httpd_can_network_connect=1
чтобы это работало.
Конечно, подумайте дважды, потому что вы делаете веб-сервер немного менее безопасным, поэтому не делайте этого, если вы не уверены, что он вам нужен.