Приблизительно с 2 недель я имею дело с одной из самых странных проблем в стеке LAMP. Длинная история, короткая случайным образом соединение с сервером MySQL, перестала работать с сообщением об ошибке:
Warning: mysqli::real_connect(): (HY000/2002): Cannot assign requested address in ..
MySQL находится на другом "поле", размещенный в Облаке Rackspace Сегодня мы понизили, это - версия к
Ver 14.14 Distrib 5.1.42, for debian-linux-gnu (x86_64).
Сервер БД довольно занят, имея дело с Запросами в секунду в среднем: 5327.957 согласно он - переменная состояния.
MySQL находится в log-warnings=9, но не враждующий для соединения, которому отказывают, зарегистрированы. И сайт и gearman сценарии рабочих перестали работать с той ошибкой в скажем, 1%-й вероятности. Никакая загрузка сервера НЕ ДЕЛАЕТ, кажется, фактор, поскольку мы контролируем. (Загрузка ЦП, загрузка IO или загрузка MySQL) максимальные соединения с БД (max_connections) являются setted к 200, но мы никогда не имели дело больше чем с 100 одновременными соединениями с базой данных
Это происходит с и без программного обеспечения брандмауэра.
Я подозреваю TCP Сетевая проблема, а не проблема PHP/MySQL configurationn.
Кто-либо может дать мне ключ к разгадке, как найти его?
ОБНОВЛЕНИЕ:
Код соединения:
$this->_mysqli = mysqli_init();
$this->_mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 120);
$this->_mysqli->real_connect($dbHost,$dbUserName, $dbPassword, $dbName);
if (!is_null($this->_mysqli->connect_error)) {
$ping = $this->_mysqli->ping();
if(!$ping){
$error = 'HOST: {'.$dbHost.'};MESSAGE: '. $this->_mysqli->connect_error ."\n";
DataStoreException::raiseHostUnreachable($error);
}
}
MySQL: использование огромного количества подключений
В чем опасность частых подключений?
Работает хорошо, за исключением некоторых крайних случаев. Если вы получаете сотни подключений в секунду из одного и того же устройства, у вас могут закончиться номера локальных портов. Способ исправить это может быть: уменьшите "/ proc / sys / net / ipv4 / tcp_fin_timeout" в Linux (это нарушает стандарт TCP / IP, но вам может быть все равно в вашей локальной сети), увеличьте "/ proc / sys / net / ipv4 / ip_local_port_range "на клиенте . Другие ОС имеют аналогичные настройки. Вы также можете использовать больше веб-боксов или несколько IP-адресов для одного и того же хоста базы данных, чтобы обойти эту проблему. Я действительно видел это в производстве.
Некоторые сведения об этой проблеме:
Соединение TCP / IP идентифицируется как localip: localport remoteip: удаленный порт. В этом случае у нас есть IP-адрес и порт MySQL, а также IP-адрес клиента, поэтому мы можем изменять только локальный порт, который имеет конечный диапазон. Примечание даже после закрытия соединения стек TCP / IP должен сохранять порт зарезервированным в течение некоторого времени , отсюда и происходит tcp_fin_timeout.