web-dev-qa-db-fra.com

Pourquoi est-ce que je vois constamment "Réinitialisation de la connexion interrompue" lorsque je télécharge des données dans ma base de données?

Je télécharge des centaines de millions d'éléments dans ma base de données via une API REST d'un serveur cloud sur Heroku vers une base de données dans AWS EC2. J'utilise Python et je vois constamment le message de journal INFO suivant dans les journaux.

[requests.packages.urllib3.connectionpool] [INFO] Resetting dropped connection: <hostname>

Cette "réinitialisation de la connexion interrompue" semble prendre plusieurs secondes (parfois 30+ secondes) avant que mon code continue de s'exécuter à nouveau.

  • Premièrement, que se passe-t-il exactement ici et pourquoi?
  • Deuxièmement, existe-t-il un moyen d'empêcher la connexion de tomber afin que je puisse télécharger des données plus rapidement?

Merci de votre aide. Andrew.

33
Andrew Thompson

Demandes utilise Keep-Alive par défaut . Resetting dropped connection, d'après ma compréhension, signifie qu'une connexion qui devrait être vivante a été abandonnée d'une manière ou d'une autre. Les raisons possibles sont:

  1. Le serveur ne prend pas en charge Keep-Alive.
  2. Il n'y a pas de transfert de données dans les connexions établies pendant un certain temps, donc le serveur interrompt les connexions.

Voir https://stackoverflow.com/a/25239947/2142577 pour plus de détails.

13
laike9m

Le problème est vraiment que le serveur a fermé la connexion même si le client a demandé qu'elle soit maintenue en vie.

Ce n'est pas nécessairement parce que le serveur ne prend pas en charge les keepalives, mais il se peut que le serveur soit configuré pour n'autoriser qu'un certain nombre de requêtes sur une connexion. Cela pourrait être fait pour aider à répartir les demandes sur différents serveurs, mais je pense que cette pratique est/était courante comme défense pratique contre le code mal écrit qui fonctionne dans le serveur (par exemple, PHP) qui ne nettoie pas après lui-même après avoir servi une demande (peut-être en raison d'une condition d'erreur, etc.)

Si vous pensez que c'est le cas pour vous et que vous souhaitez ne pas voir ces journaux (qui sont enregistrés au niveau INFO), vous pouvez ajouter les éléments suivants pour calmer cette partie de la journalisation:

# Really don't need to hear about connections being brought up again after server has closed it
logging.getLogger("requests.packages.urllib3.connectionpool").setLevel(logging.WARNING)
11
Cameron Kerr

C'est une pratique courante pour les services qui exposent les API RESTful pour éviter les abus (ou DoS).
Si vous insistez sur leur API, ils abandonneront votre connexion.
Essayez de faire dormir un peu votre script de temps en temps pour éviter la chute.

5
alonre