PHP-connexion MySQLi au hasard échoue avec “Impossible d'assigner une adresse demandée”
Depuis environ 2 semaines, je fais face à un des plus bizarre des problèmes dans la LAMPE de la pile.
Longue histoire courte au hasard connexion au serveur MySQL échoue avec le message d'erreur:
Warning: mysqli::real_connect(): (HY000/2002): Cannot assign requested address in ..
MySQL se trouve sur une autre "case", hébergé chez Rackspace Cloud
Aujourd'hui, nous avons déclassé c'est la version de
Ver 14.14 Distrib 5.1.42, for debian-linux-gnu (x86_64).
Le serveur de base de données est assez occupé à traiter des Requêtes par seconde avg: 5327.957 selon c'est la variable d'état.
MySQL est dans le journal-avertissements=9, mais pas de guerre pour connexion refusée êtes connecté.
À la fois site et gearman travailleurs scripts échouer avec l'erreur à disons 1% de probabilité.
Pas de charge de serveur NE semble PAS être un facteur que nous surveillons. (Charge CPU, IO charge ou MySQL charge)
Le maximum de DB connections (max_connections) sont programmés à 200, mais nous n'avons jamais thématiques avec plus de 100 connexions simultanées à la base de données
Il arrive avec et sans le logiciel de pare-feu.
Je soupçonne TCP problème de Réseau plutôt que de PHP/MySQL configurationn problème.
Quelqu'un peut-il me donner la moindre idée de comment le trouver?
Mise à JOUR:
Le code de connexion est:
$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);
}
}
Nous connecter à l'adresse IP de réseau interne
Ma suggestion: pour le dépannage de l'est de l'essayer et de le répliquer tout en surveillant les connexions sortantes sur cette zone. Utiliser wireshark ou tout ce que vous avez besoin. Lorsqu'il échoue, assurez-vous qu'il avait vraiment une connexion sortante. Tracer à travers le réseau à partir de là. J'ai fait quelques recherches sur google, et tous les résultats suggèrent un problème de réseau.
OriginalL'auteur Nenko Ivanov | 2010-07-09
Vous devez vous connecter pour publier un commentaire.
MySQL: à l'Aide de géant nombre de connexions
Quels sont les dangers de fréquentes se connecte ?
Il fonctionne bien, à l'exception de certains cas extrêmes. Si vous obtenez des centaines de connects par seconde à partir de la même boîte que vous pouvez obtenir en cours d'exécution à l'extérieur les numéros de port. Le moyen pour résoudre ce problème pourrait être en baisse "/proc/sys/net/ipv4/tcp_fin_timeout" sur linux (cela rompt le protocole TCP/IP standard, mais vous ne pourriez pas de soins dans votre réseau local), l'augmentation "/proc/sys/net/ipv4/ip_local_port_range" sur le client. Les autres OS ont les mêmes paramètres. Vous pouvez également utiliser plus web de boxes ou de plusieurs IP pour votre base de données de l'hôte pour contourner ce problème. J'ai vraiment vu dans la production.
Un peu de fond sur ce problème:
Connexion TCP/IP est identifié par localip:localport remoteip:port distant. Nous avons MySQL IP et le Port ainsi que l'adresse IP du client fixe, dans ce cas, nous ne pouvons donc varier port local qui a finis de la gamme. Note même après la fermeture de la connexion TCP/IP stack a pour garder le port réservé pour un certain temps, c'est là que tcp_fin_timeout vient de.
OriginalL'auteur Naktibalda
Avec Vicidial, j'ai couru dans le même problème fréquemment, en raison de la nature de la programmation utilisé, de nouvelles connexions MYSQL doivent être établies (très) souvent à partir d'un certain nombre de vicidial composants, nous avons des systèmes de planter le serveur de base de données avec plus de 10 000 connexions par seconde, dont la plupart sont accessibles dans un délai de quelques ms et qui sont fermés à l'intérieur d'une seconde ou moins. Par expérience, je peux vous dire que dans un réseau local, avec près de pas de perte de colis, tcp_fin_timeout peut être réduit jusqu'à 3 avec aucun des problèmes qui se montre.
Typique des commandes linux pour diagnostiquer si des connexions en attente d'être fermé est votre problème sont:
qui vous montrera le nombre de connexions qui sont en attente d'être complètement fermé.
qui permettra de montrer les connexions par l'hôte connecté, vous permettant d'identifier les autres hôte est le pliage de votre système s'il y a plusieurs candidats.
Pour tester le correctif, vous pouvez juste
qui permettra de définir temporairement le tcp_fin_timeout à 3 sec et de vous dire combien de secondes qu'il était avant, de sorte que vous pouvez revenir à l'ancienne valeur de test.
Comme une solution permanente, je vous suggère d'ajouter la ligne suivante à /etc/sysctl.conf
Dans un bon réseau local ne devrait pas poser de problèmes, si vous avez des problèmes, par exemple en raison de la perte de paquets, vous pouvez essayer de
Wiche permet de plus de temps pour la connexion à fermer et tente de réutiliser la même ip:port de combinaisons pour les nouvelles connexions vers le même hôte:combinaison de services.
OU
Qui sera encore plus agressive essayer de réutiliser les connexions, ce qui peut toutefois créer de nouveaux problèmes avec d'autres applications, par exemple avec votre serveur web. Ainsi, vous devriez essayer la solution la plus simple d'abord, dans la plupart des cas, il sera déjà de résoudre votre problème sans mauvais effets secondaires!
Bonne Chance!
OriginalL'auteur fgwaller
J'ai eu ce problème et l'a résolu en utilisant la connexion persistante mode, qui peut être activé en mysqli par pré-fixation de la base de données nom d'hôte avec un " p:'
À partir de:
http://php.net/manual/en/mysqli.persistconns.php :
C'est une excellente solution où il va travailler! Notre expérience a été, que pas tout le code fonctionne aussi bien avec des connexions persistantes. Si votre code fonctionne bien avec les connexions persistantes, ce sera TRÈS sensiblement réduire le nombre de nouvelles connexions.
OriginalL'auteur yeeking
Vicidial serveurs régulièrement nécessitera l'augmentation de la limite de connexion à MySQL. De nombreuses installations (et nous avons vu et travaillé sur un grand nombre d'entre eux ont dû le faire en modifiant la limite de
En outre, il ya eu des rapports de conntract_Max nécessitant une augmentation
lorsque le problème s'avère être de réseautage.
Également noter que Vicidial a certains paramètres suggérés et même certains de l'entreprise des paramètres pour la configuration de mysql. Jetez un oeil à mon-bigvici.cnf dans /usr/src/astguiclient/conf pour la configuration des idées qui pourraient ouvrir votre serveur mysql un peu.
Jusqu'à présent, aucun des problèmes résultant de l'augmentation des limites de connexion, juste des ressources supplémentaires utilisées. Puisque le but du serveur est de faire de ce travail d'application, de consacrer des ressources à cette application ne semble pas être un problème. LOL
OriginalL'auteur TheSatinKnight