2010-10-14 7 views
1

Bonjour.WCF Concurrency

Je rencontre des problèmes de concurrence. J'ai créé un service WCF, et je l'ai testé pour m'assurer que les appels individuels fonctionnent bien. Maintenant, j'effectue des tests de charge, et je constate une utilisation du processeur super élevée avec de longs temps d'attente pour que les demandes soient complétées. Mon outil de test de charge est simplement une application console configurée pour exécuter des tests ms sur plusieurs threads afin de simuler plusieurs clients. Et, je me demande si quelqu'un pourrait me dire s'il y a une partie de la configuration du service, de la configuration client-proxy (auto-générée) ou du code du service que je devrais changer pour le configurer pour permettre un haut degré de simultanéité:

Voici mon fichier de configuration de service.

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
     <services> 
      <service behaviorConfiguration="Behavior" name="Service.MyService"> 
       <endpoint address="" 
        binding="netTcpBinding" 
        bindingConfiguration="Security" 
        contract="Service.IMyService"> 
        <identity> 
         <dns value="localhost" /> 
        </identity> 
       </endpoint> 
       <endpoint address="mex" 
        binding="mexTcpBinding" 
        bindingConfiguration="" 
        contract="IMetadataExchange" />   
       <host> 
        <baseAddresses> 
         <add baseAddress="net.tcp://localhost:808/Service" /> 
        </baseAddresses> 
        <timeouts closeTimeout="00:01:00" openTimeout="00:05:00" /> 
       </host> 
      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="Behavior"> 
        <serviceMetadata httpGetEnabled="false" /> 
        <serviceDebug includeExceptionDetailInFaults="false" /> 
        <serviceThrottling maxConcurrentCalls="300" maxConcurrentSessions="5000" maxConcurrentInstances="300" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
     <bindings> 
      <netTcpBinding> 
       <binding name="Security" openTimeout="00:05:00" maxConnections="10"> 
        <reliableSession inactivityTimeout="00:30:00" enabled="true" /> 
        <security mode="None"> 
         <transport clientCredentialType="None" protectionLevel="None" /> 
        </security> 
       </binding> 
      </netTcpBinding> 
     </bindings> 
    </system.serviceModel> 
</configuration> 

Voici mon fichier de configuration client.

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <bindings> 
     <netTcpBinding> 
     <binding name="NetTcpBinding_IMyService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" 
      hostNameComparisonMode="StrongWildcard" listenBacklog="10" 
      maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10" 
      maxReceivedMessageSize="65536"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:30:00" 
       enabled="true" /> 
      <security mode="None"> 
      <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"> 

      </transport> 
      <message clientCredentialType="Windows" /> 
      </security> 
     </binding> 
     </netTcpBinding> 
    </bindings> 
    <client> 
     <endpoint address="net.tcp://localhost:808/Service" binding="netTcpBinding" 
      bindingConfiguration="NetTcpBinding_IMyService" contract="ServiceReference.IMyService" 
      name="NetTcpBinding_IMyService"> 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
     </endpoint> 
    </client> 
    </system.serviceModel> 
</configuration>

Et, voici les attributs que j'ai placés sur ma classe de service WCF.


[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]

J'ai lu plus de quelques articles sur MSDN pour essayer de comprendre ce que je dois faire dans ce cas, et il me semble avoir écarté le matériel étant la cause de ce problème.

En outre, j'ai remplacé les noms d'objets dans les configurations ci-dessus par des noms génériques (par exemple MyService et IMyService ne sont pas vraiment ce que je les appelle).

+0

J'ai traversé ce que je suppose? http://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.concurrencymode.aspx –

+0

Où est l'utilisation High-Cpu, sur le serveur ou sur le client? (Ou sont-ils en cours d'exécution sur la même boîte?) –

+0

L'utilisation élevée du processeur est sur le côté serveur. Ils courent sur des boîtes différentes. – bitcycle

Répondre

Questions connexes