PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 06/11/2017 12:44:53

adrien.d
Membre

Connexion au serveur sensible à la charge

Bonjour,

Je viens vous demander votre aide aujourd'hui car je remarque qu'au bout de quelques heures (entre 5 et 30), mon client postgresql n'arrive plus à se connecter à la base. Le problème c'est qu'un SIGPIPE est envoyé au programme et cause son arrêt

Le système est une machine CentOS 7. Le serveur PostgreSQL 9.5 a été installé avec les sources pour pouvoir intégrer PL/Python. L'application qui instancie le client est en C++ et comporte plusieurs pipes nommés et un web service SOAP

Le code suivant est exécuté à chaque requête à la base :

/**
 * \brief Fonction personnalisée d'exécution d'une requête en base
 * \param req Requête à effectuer
 * \return res Retour de la requête
 */
PGresult* l_PQexec(const char* req)
{
	try
	{
		pthread_mutex_lock(&g_mutex_bdd);
		PGresult* res = NULL;
		PGconn* conn = PQsetdbLogin(ipbdd, portbdd, NULL, NULL, bdd, user, pass);

		// Vérification de la connection
		for(int i=1; PQstatus(conn) != CONNECTION_OK && i<=10; i++)
		{
			l_printf("[%s] PQexec : Connection à la base de données pour la requête %s échouée, essai %d\n", horodate().c_str(), req, i);
			PQfinish(conn);
			usleep(2000000);
			conn = PQsetdbLogin(ipbdd, portbdd, NULL, NULL, bdd, user, pass);
			l_printf("[%s] PQexec : Après la connexion\n Essai d'un PQstatus : ", horodate().c_str());
			PQstatus(conn);
		}
		
		// Exécution de la requête
		if(PQstatus(conn) == CONNECTION_OK)
		{
			res = PQexec(conn, req);
		}
		else
		{
			l_printf("[%s] PQexec : Abandon de l'exécution de la requête %s\n", horodate().c_str(), req);
			res = NULL;
		}

		if(conn != NULL)
			PQfinish(conn);

		pthread_mutex_unlock(&g_mutex_bdd);

		return res;
	}
	catch(...)
	{
		l_printf("[%s] PQexec : Exception sur la requête %s\n", horodate().c_str(), req);
		return NULL;
	}
}

J'aimerais savoir si le problème est connu ou si je suis le seul à l'avoir et si vous avez une solution. Merci à vous

Hors ligne

#2 06/11/2017 16:31:20

Marc Cousin
Membre

Re : Connexion au serveur sensible à la charge

Sigpipe, habituellement, ça veut dire que la socket TCP est morte... Il n'y aurait pas un firewall entre le client et le serveur ?

Dernière modification par Marc Cousin (06/11/2017 16:31:40)


Marc.

Hors ligne

#3 06/11/2017 16:33:57

adrien.d
Membre

Re : Connexion au serveur sensible à la charge

Pardon, j'ai oublié de préciser que l'application C++ et la base de données sont sur la même machine. De plus, le firewall est totalement désactivé

Marc Cousin a écrit :

Sigpipe, habituellement, ça veut dire que la socket TCP est morte... Il n'y aurait pas un firewall entre le client et le serveur ?

Hors ligne

#4 07/11/2017 09:26:54

rjuju
Administrateur

Re : Connexion au serveur sensible à la charge

Y a-t-il des messages dans les logs de postgres quand cela se produit ?

Hors ligne

#5 07/11/2017 13:11:00

adrien.d
Membre

Re : Connexion au serveur sensible à la charge

Merci pour vos réponses

J'ai regardé dans les logs, rien n'est horodaté donc impossible de savoir quand les erreurs sont apparues mais j'ai les lignes suivantes dans le fichier de log :

LOG:  could not send data to client: Relais brisé (pipe)
FATAL:  connection to client lost

Cette ligne apparaît parfois après une requête HTTP en PL/Python. Ces requêtes HTTP sont faites très régulièrement.
Il y a une erreur PL/Python qui apparaît aussi souvent avant l'erreur ci-dessus

ERROR:  requests.exceptions.ConnectionError: HTTPConnectionPool(host='10.192.21.200', port=80): Max retries exceeded with url: /set_521.htm?CHANNEL_NO=1&DO_STATUS_ENABLE=0&Submit=Submit (Caused by NewConnectionError("<requests.packages.urllib3.connection.HTTPConnection object at 0x31e99d0>: Failed to establish a new connection: [Errno 110] Connexion termin\xc3\xa9e par expiration du d\xc3\xa9lai d'attente",))

La ligne suivante apparaît aussi souvent après une requête HTTP avec la première erreur :

LOG:  could not send data to client: Connexion ré-initialisée par le correspondant

Il faut noter que le code PL/Python est un trigger en base et c'est le seul trigger de la base


rjuju a écrit :

Y a-t-il des messages dans les logs de postgres quand cela se produit ?

Hors ligne

Pied de page des forums