Aller http.Obtenir, de la simultanéité, et “Connection reset by peer”
J'ai entre 1000-2000 les pages web pour téléchargement à partir d'un serveur, et je suis aller à l'aide de routines et de moyens pour atteindre un rendement élevé. Le problème est que chaque fois que je lance mon programme jusqu'à 400 demandes d'échouer avec le message d'erreur "connection reset by peer". Rarement (peut-être 1 fois sur 10), aucune demande d'échouer.
Que puis-je faire pour éviter cela?
Une chose qui est intéressant, c'est que quand j'ai couru ce programme sur un serveur dans le même pays que le serveur du site internet est hébergé, 0 demande échoué, de sorte que je suppose il y a un problème avec retard (comme il est maintenant en cours d'exécution sur un serveur sur un autre continent).
Le code que j'utilise est en fait qu'une simple http.Get(url) de demande, pas de paramètres supplémentaires ou un client personnalisé.
- Sont tous ou une grande partie des pages à venir sur le même serveur? quel est le nombre maximum de demandes que vous faites en même temps?
- Toutes les pages sont de la même serveur (révision de la question afin de refléter cette). Je ne suis pas sûr de savoir comment beaucoup de sont faites en temps réel. Je viens de commencer comme un grand nombre de routines comme il y a des pages web pour télécharger et de laisser le CPU/Golang imposer des limites sur la simultanéité.
- Il n'y a pas de limites définies sur la simultanéité, vous devez le faire vous-même.
Vous devez vous connecter pour publier un commentaire.
Le message
connection reset by peer
indique que le serveur distant envoyé unRST
à force de fermer la connexion, que ce soit délibérément comme un mécanisme pour limiter les connexions, ou en tant que résultat d'un manque de ressources. De toute façon, vous êtes susceptible d'ouverture trop grand nombre de connexions, ou de reconnexion trop vite.De départ 1000-2000 connexions parallèle est rarement le moyen le plus efficace de télécharger que de nombreuses pages, surtout si la plupart ou tous sont à venir à partir d'un seul serveur. Si vous testez le débit, vous trouverez une optimale niveau de simultanéité qui est de loin inférieur.
Vous voulez aussi de définir la
Transport.MaxIdleConnsPerHost
pour correspondre à votre niveau de simultanéité. SiMaxIdleConnsPerHost
est inférieur à celui du nombre de connexions simultanées, les connexions au serveur sera souvent fermé après une demande, pour être ouverte immédiatement de nouveau (cela va ralentir votre progression de manière significative et éventuellement atteindre la connexion des limites imposées par le serveur.MaxIdleConnsPerHost
à l'égalité du nombre de requêtes simultanées.Encore un golang débutant, j'espère que cela aide.
Il pourrait être possible que le serveur à partir duquel vous téléchargez les pages web dispose d'un certain type de mécanisme de limitation qui empêche plus d'un certain nombre de requêtes par seconde/(ou similaire) à partir d'une certaine ip?. Essayez de limiter peut-être à 100 requêtes par seconde, ou l'ajout de sommeil entre les demandes.
Connection reset by peer est fondamentalement serveur vous interdire de service. (Ce n' "connection reset by peer" signifie?)
Transport.MaxIdleConnsPerHost
pour correspondre à votre max de simultanéité.