Question

J'ai un ralentissement de service Web. Mon (web) service est en gsoap et géré C ++. Ce n'est pas IIS / apache hébergé, mais parle xml. Mon client est en .NET Le temps de calcul de service est léger (<0.1s pour préparer la réponse). Je pense que le service soit lisse, rapide et avoir une bonne disponibilité. J'ai environ 100 clients, le temps de réponse est 1s obligatoire. Les clients ont environ 1 demande par minute. Les clients vérifient la présence de services Web par tcp test port ouvert. Donc, pour éviter la congestion possible, je me suis tourné gSOAP KeepAlive false. Jusqu'à là, tout se passe bien: je vois bearly connexions dans TCPView (Sysinternals)

Le nouveau programme de synchronisation spécial appelle maintenant le service dans une boucle. Il est charge plus élevée, mais tout est traité en moins de 30 secondes. Avec Sysinternals TCPView, je vois que les connexions sur 1 milliers sont en TIME_WAIT. Ils ralentissement du service et il faut quelques secondes pour le service à répondre, maintenant.

Serait-ce que je dois réinitialiser la connexion SoapHttpClientProtocol? Quelqu'un a des fantômes TIME_WAIT avec un appel de service Web dans une boucle?

Était-ce utile?

La solution

On dirait que vous n'êtes pas fermer la connexion après l'appel et l'ouverture de nouvelles connexions à chaque demande. Soit fermer la connexion ou de réutiliser les connexions ouvertes.

Autres conseils

Soyez très prudent avec les mises en œuvre mentionnées ci-dessus. Il y a de sérieux problèmes avec eux.

  1. La mise en oeuvre décrite dans yakkowarner.blogspot.com/2008/11/calling-web-service-in-loop.html (commentaire ci-dessus):

    PROBLÈME: Tous vos travaux seront essuyer la prochaine fois que vous régénérez le service Web en utilisant wsdl.exe et vous allez oublier ce que vous avez fait de ne pas mentionner que ce correctif est assez hacky se fondant sur une chaîne de message à passer à l'action.

  2. La mise en oeuvre décrite dans forums.asp.net/t/1003135.aspx (commentaire ci-dessus):

    PROBLÈME: Vous sélectionnez un point final entre 5000 et 65535 donc à la surface cela ressemble à une bonne idée. Si vous pensez qu'il n'y a aucun moyen (au moins pas que je peux penser) que vous pouvez réserver les ports à utiliser plus tard. Comment pouvez-vous garantir que le port suivant sur votre liste n'est pas actuellement utilisé? Vous ramassez de manière séquentielle des ports à utiliser et si une autre application choisit un port qui se trouve à côté de votre liste, vous êtes arrosé. Ou si une autre application en cours d'exécution sur votre machine client commence à utiliser des ports aléatoires pour ses connexions - vous être nettoyées au jet aux points IMPRÉVISIBLES dans le temps. Vous HASARD un message d'erreur comme « hôte distant ne peut pas être atteint ou est indisponible. » - encore plus difficile à résoudre

Bien que je ne peux pas vous donner la solution à ce problème, certaines choses que vous pouvez faire:

  1. Essayez de réduire le nombre de demandes de service Web ou les étaler sur une plus longue période de temps
  2. Pour votre type d'application peut-être des services Web n'a pas été l'architecture correcte - quelque chose avec 1ms temps de réponse, vous devez utiliser un système de messagerie - pas un service web
  3. Définir le numéro de votre OS de connexions autorisées à 65K en utilisant le Registre comme dans Windows
  4. Définissez vous le temps d'OS prises restent TIME_WAIT à un nombre inférieur (ce qui présente sa propre liste de problèmes)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top