Связь PHP-MySQLi случайным образом прерывается с, “Не может присвоить требуемый адрес”

Приблизительно с 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);
    }
} 
5
задан bhamby 7 January 2013 в 21:30
поделиться

1 ответ

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.

17
ответ дан 18 December 2019 в 05:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: