2011-10-27 13 views
5

Tengo un servicio WCF con aproximadamente 500 clientes que hacen una llamada cada 3 minutos. El proceso lsass.exe usa el 95% de mi CPU cuando el servicio está activado.
Hice una prueba y cada vez que un cliente realiza una llamada, el% de CPU lsass ronda el 7 aproximadamente. Así que entiendo por qué el servidor se está desacelerando a una llamada cuando un par de cientos están enviando llamadas al mismo tiempo.
Lo que no entiendo, ¿por qué se usa lsass? Estoy utilizando un CustomBinding basado en WSHttpBinding con seguridad de nivel de mensaje usando Certificados. Instancia/Concurrencia es PerCall/Individual (aunque he intentado casi todas las combinaciones de los dos sin cambios), y está alojado en IIS 6.
Supongo que para cada llamada, lsass está comprobando el certificado, y esto de alguna manera toma una gran cantidad de CPU? ¿Hay alguna manera de que pueda disminuir eso? Sé que la gente ha escalado los servicios de WCF a números mucho más grandes, entonces, ¿qué es lo que estoy haciendo mal?No entiendo el escalado de WCF con seguridad/¿Por qué lsass.exe CPU% es tan alto?

P.S. Alguna información adicional: Tengo el rastreo y la primera cosa que consigue generalmente registra es

<TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Warning"> 
    <TraceIdentifier>http://msdn.microsoft.com/en-US/library/System.ServiceModel.Activation.WebHostNoCBTSupport.aspx</TraceIdentifier> 
     <Description>Extended protection is not supported or not enabled on this platform. Please install the appropriate patch and enable it if you want extendedProtection support for https with windows authentication.</Description> 
     <AppDomain>/LM/W3SVC/920256058/Root/WCFServices/smt-7-129642078492968750</AppDomain> 
     <Source>System.ServiceModel.Activation.MetabaseSettingsIis6/17731154</Source> 
</TraceRecord> 

Y también hay un montón de:

http://msdn.microsoft.com/en-US/library/System.ServiceModel.Security.SecuritySessionDemuxFailure.aspx 
The incoming message is not part of an existing security session. 

y

<ExceptionType>System.ServiceModel.Security.SecurityNegotiationException, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType> 
<Message>Cannot find the negotiation state for the context 'uuid-4caa56ff-3d38-4905-9151-ce12acdd676c-6778'.</Message> 

y

<NegotiationTokenAuthenticator>System.ServiceModel.Security.TlsnegoTokenAuthenticator</NegotiationTokenAuthenticator> 
<AuthenticatorListenUri>http://myserviceendpoint</AuthenticatorListenUri> 
<Exception>System.ServiceModel.Security.SecurityNegotiationException: Cannot find the negotiation state for the context 'uuid-4caa56ff-3d38-4905-9151-ce12acdd676c-6778'.at System.ServiceModel.Security.NegotiationTokenAuthenticator`1.ProcessRequestCore(Message request) at System.ServiceModel.Security.NegotiationTokenAuthenticator`1.NegotiationHost.NegotiationSyncInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp;amp; outputs)</Exception> 

My IIS log is ful l de

200 0 64 
500 0 64 
200 0 1236 
500 0 1236 

Parcialmente los dos últimos

Editar: config Servicio:

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
    <section name="dataConfiguration"  type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings,  Microsoft.Practices.EnterpriseLibrary.Data"/> 
    </configSections> 
    <connectionStrings> 
    <add name="conString" connectionString="Data Source=source1;Failover  Partner=source2;database=myDatabase;Integrated Security=false;uid=userName;pwd=password"  providerName="System.Data.SqlClient"/> 
    </connectionStrings> 
    <dataConfiguration defaultDatabase="conString"/> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0"/> 
    <authorization> 
     <allow users="?"/> 
    </authorization> 
    </system.web> 

    <system.serviceModel> 
    <services> 
     <service name="ServiceLibrary.Service"> 
     <endpoint address="ws" binding="wsHttpBinding"  bindingConfiguration="WSHttpBinding_IService" 
      name="WSHttpEndpoint_IService"  contract="ServiceLibrary.IService" /> 
     <endpoint address="cs1" binding="customBinding"  bindingConfiguration="CustomBinding_IService" 
      name="CustomEndpoint_IService"  contract="ServiceLibrary.IService" /> 
     <endpoint address="basic" binding="basicHttpBinding"  name="BasicHttpEndpoint_IService" 
      contract="ServiceLibrary.IService" /> 
     <endpoint address="mex" binding="mexHttpBinding" 
      contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="WSHttpBinding_IService" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="1048576"> 
      <readerQuotas maxDepth="32" maxStringContentLength="65536" maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <security mode="Message"> 
      <message clientCredentialType="Certificate" negotiateServiceCredential="true" 
       algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
     <customBinding> 
     <binding name="CustomBinding_IService"> 
      <transactionFlow /> 
      <security authenticationMode="SecureConversation"  messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10"> 
      <localServiceSettings maxClockSkew="00:10:00" maxPendingSessions="102400" /> 
      <localClientSettings maxClockSkew="00:10:00" /> 
      <secureConversationBootstrap authenticationMode="MutualSslNegotiated"  messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10" /> 
      </security> 
      <textMessageEncoding> 
      <readerQuotas maxDepth="32" maxStringContentLength="65536" maxArrayLength="16384"  maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      </textMessageEncoding> 
      <httpTransport maxBufferSize="1048576" maxReceivedMessageSize="1048576" /> 
     </binding> 
     </customBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceCredentials> 
      <serviceCertificate findValue="CN=[domain]" storeLocation="LocalMachine"  storeName="TrustedPeople" /> 
      <clientCertificate> 
       <authentication revocationMode="NoCheck" certificateValidationMode="PeerTrust"  /> 
      </clientCertificate> 
      </serviceCredentials> 
      <serviceThrottling maxConcurrentCalls="1000" maxConcurrentSessions="1000"  maxConcurrentInstances="1000" /> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/> 
    </system.serviceModel> 
</configuration> 

Los clientes están utilizando el customBinding. Sin embargo, el problema aún ocurre con el enlace WS. De hecho, hice el CustomBinding para resolver un problema donde el servicio se estaba quedando sin sesiones pendientes.

+0

Muestra la configuración de tu servicio también. –

Respuesta

0

Así que finalmente conseguí que todo funcionara nuevamente, más o menos. Mi problema era que todos los clientes estaban tratando de hacer llamadas a la vez, y simplemente sobrecargó el servidor. Configuré la aplicación IIS para denegar todo el tráfico entrante, y luego agregué grupos de direcciones IP lentamente hasta que finalmente todos pudieron conectarse.

Lsass todavía utiliza una gran cantidad de CPU, lo cual es inaceptable. Voy a tener que encontrar un método de seguridad diferente (que no sea certificados) que sea más rápido y no haga que lsass se vuelva loco porque tenemos cientos de clientes.

Cuestiones relacionadas