2011-10-27 25 views
5

Her 3 dakikada bir arama yapan yaklaşık 500 müşteri ile bir WCF servisim var. Lsass.exe işlemi, hizmet açıkken CPU'm% 95'ini kullanıyor.
Bir test yaptım ve bir müşteri her çağrı yaptığında, lsass CPU% 7'ye kadar çıkıyor. Bu yüzden, bir çift yüzün aynı anda çağrı gönderdiğinde sunucunun bir çağrıya neden aradığını anlıyorum.
Neyi anlamıyorum, neden lsass kullanılıyor? Sertifikaları kullanarak Message level güvenliği ile WSHttpBinding temelli bir CustomBinding kullanıyorum. Örnek/Eşzamanlılık PerCall/Single (her iki değişkenin hemen hemen her birleşimini denemedim olsa da) ve IIS 6'da barındırılıyor.
Her bir çağrı için lsass sertifikayı kontrol ediyor. Bir şekilde çok fazla CPU alıyor? Bunu azaltmanın bir yolu var mı? İnsanların WCF hizmetlerini çok daha büyük sayılara ölçeklediklerini biliyorum, bu yüzden yanlış yapıyorum?Güvenlik ile WCF ölçeklendirmeyi anlamadım/Neden lsass.exe CPU% kadar yüksek?

P.S. Bazı ekstra bilgi: Üzerinde izleme var ettik ve genellikle açmış olur ilk şey

<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> 

Ve bir demet de var:

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

ve

<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> 

ve

<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> 

IIS günlüğüm ful Servis yapılandırmasında: Çoğunlukla son iki

Düzenleme

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

l

<?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> 

istemcileri tüm CustomBinding kullanıyor. Sorun hala WS bağlama ile gerçekleşir. Aslında, hizmetin beklemede olan oturumların çalıştığı bir sorunu çözmek için CustomBinding'i yaptım.

+0

Hizmetinizin yapılandırmasını da gösterin. –

cevap

0

Nihayet, her şeyin tekrar tekrar çalışmasını sağladım. Sorunum, tüm istemcilerin bir kerede çağrı yapmaya çalıştığı ve sunucuyu aşırı yüklemesiydi. IIS uygulamasının tüm gelen trafiği reddetmesi için ayarladıktan sonra IP'lerin gruplarını, hepsinin bağlanabilmesi için sonuna kadar yavaşça geri ekledim. Lsass hala kabul edilemez yüksek miktarda CPU kullanıyor. Daha hızlı olan ve lsass'ı çıldırmayan farklı bir güvenlik yöntemi (sertifikalar dışında) bulmam gerekecek çünkü yüzlerce müşterimiz var.

İlgili konular