2011-10-16 65 views
1

我們有一個跨兩臺服務器負載均衡的網站,這些服務器調用一個IIS7應用服務器上託管的WCF wsHttp服務。WCF消息安全 - PerCall

上週,該網站推出,我們遇到了性能問題。

該系統由一個離岸團隊構建,但我被要求調查是否可以提供幫助。

我加載了perfmon並使用asp.net計數器來查看當前會話。我可以看到,一旦這個數字增加到大約25以上,那麼網站就會大大減慢。在接下來的10分鐘內,它會繼續增加到250,然後降到0,並且網站的性能會很好。

這在一個循環中繼續 - 壞消息!

第二天,離岸團隊告訴我他們通過調整安全來解決問題。

我有一個理論,在禁用wsHttp綁定WCF的安全性從創建一個實例每個會話更改爲每個調用創建一個實例 - 因此允許更大的吞吐量的服務請求。這是一個好理論嗎?

我已經構建了一個簡單的模型來測試這個,IIS中的幾個方法以及一個生成多個請求的簡單客戶端。這似乎給我預期的結果。問題是,我正在努力尋找正確的性能計數器,以證明當不使用安全綁定時,更少的請求排隊並創建更多的併發實例。

任何人都可以請建議最好的perfmon計數器使用?

好的,今天又有一天這個和更多的問題!

在我的測試應用程序,我現在有3個不同的wsHttp綁定

  1. 沒有安全
  2. 信息安全
  3. 信息安全但3服務類[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]在類上設置

從客戶端的40循環中,我啓動一個新線程並調用該服務。在調用服務1時,服務在1秒內完成所有請求。

當調用服務2時,服務在33秒內完成所有請求。

當調用服務3時,我期望它和服務1幾乎一樣快,因爲我期望服務爲4個調用中的每一個實例化一個新的服務對象。但是,它似乎並沒有(我仍然沒有任何有意義的性能計數器!)來完成這個任務,並且完成時間也是33秒。

這裏是從服務的配置:

<?xml version="1.0"?> 
<configuration> 
    <system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" 
       switchValue="Information, ActivityTracing" 
       propagateActivity="true" > 
     <listeners> 
      <add name="traceListener" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData="c:\WCFTrace\InstancingDemo.svclog" /> 
     </listeners> 
     </source> 
    </sources> 
    </system.diagnostics> 
    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="SecPerCallBehaviour"> 
      <serviceThrottling maxConcurrentSessions="1000" 
           maxConcurrentCalls="30" 
           maxConcurrentInstances="30"/> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     <behavior name=""> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="BindingNoSec"> 
      <security mode="None" /> 
     </binding> 
     <binding name="BindingMessageSec"> 
      <security mode="Message"> 
      <message establishSecurityContext ="true"/> 
      </security> 
     </binding> 
     <binding name="BindingMessageSecPerCall" > 
      <security mode="Message"> 
      <message establishSecurityContext ="true"/> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <services> 
     <service name="ServiceInstancingDemo.Service1"> 
     <endpoint address="~/Service1.svc" 
      binding="wsHttpBinding" bindingConfiguration="BindingNoSec" 
      name="NoSecurity" contract="ServiceInstancingDemo.IService1" /> 
     </service> 
     <service name="ServiceInstancingDemo.Service2"> 
     <endpoint address="~/Service2.svc" 
      binding="wsHttpBinding" bindingConfiguration="BindingMessageSec" 
      contract="ServiceInstancingDemo.IService2" /> 
     </service> 
     <service name="ServiceInstancingDemo.Service3" behaviorConfiguration="SecPerCallBehaviour"> 
     <endpoint address="~/Service3.svc" 
      binding="wsHttpBinding" bindingConfiguration="BindingMessageSecPerCall" 
      contract="ServiceInstancingDemo.IService3" /> 
     </service> 
    </services> 
    </system.serviceModel> 
</configuration> 

下面是來自客戶機的配置:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
     <bindings> 
      <wsHttpBinding> 
       <binding name="WSHttpBinding_IService2" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
        bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
        allowCookies="false"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <reliableSession ordered="true" inactivityTimeout="00:10:00" 
         enabled="false" /> 
        <security mode="Message"> 
         <transport clientCredentialType="Windows" proxyCredentialType="None" 
          realm="" /> 
         <message clientCredentialType="Windows" negotiateServiceCredential="true" 
          algorithmSuite="Default" establishSecurityContext="true" /> 
        </security> 
       </binding> 
       <binding name="NoSecurity" closeTimeout="00:01:00" openTimeout="00:01:00" 
        receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" 
        transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
        allowCookies="false"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <reliableSession ordered="true" inactivityTimeout="00:10:00" 
         enabled="false" /> 
        <security mode="None"> 
         <transport clientCredentialType="Windows" proxyCredentialType="None" 
          realm="" /> 
         <message clientCredentialType="Windows" negotiateServiceCredential="true" /> 
        </security> 
       </binding> 
       <binding name="WSHttpBinding_IService3" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
        bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
        allowCookies="false"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <reliableSession ordered="true" inactivityTimeout="00:10:00" 
         enabled="false" /> 
        <security mode="Message"> 
         <transport clientCredentialType="Windows" proxyCredentialType="None" 
          realm="" /> 
         <message clientCredentialType="Windows" negotiateServiceCredential="true" 
          algorithmSuite="Default" /> 
        </security> 
       </binding> 
      </wsHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="http://rb-t510/NGCInstancing/Service2.svc/~/Service2.svc" 
       binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService2" 
       contract="NGCWithSec.IService2" name="WSHttpBinding_IService2"> 
       <identity> 
        <servicePrincipalName value="host/RB-T510" /> 
       </identity> 
      </endpoint> 
      <endpoint address="http://rb-t510/NGCInstancing/Service1.svc/~/Service1.svc" 
       binding="wsHttpBinding" bindingConfiguration="NoSecurity" 
       contract="NGC.IService1" name="NoSecurity" /> 
      <endpoint address="http://localhost/NGCInstancing/Service3.svc/~/Service3.svc" 
       binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService3" 
       contract="NGCSecPerCall.IService3" name="WSHttpBinding_IService3"> 
       <identity> 
        <servicePrincipalName value="host/RB-T510" /> 
       </identity> 
      </endpoint> 
     </client> 
    </system.serviceModel> 
</configuration> 

我想,我錯過一個配置設置?或者也許使用wsHttp上的消息安全的多次調用總是會很慢,因爲服務器對象必須在每個會話中實例化,並且每個客戶端只創建一個會話?

非常感謝

Rob。

回答

1

你想要的櫃檯必須在服務中直接啓用:

<configuration> 
    <system.serviceModel> 
     <diagnostics performanceCounters="All" /> 
    </system.serviceModel> 
</configuration> 

顯然,它可以更加精細了。這就是你要讀什麼書:WCF Performance Counters

更新: 一個更好的鏈接:How to use performance counters to diagnose performance of WCF applications

+0

嗨,我已經啓用了計數器在WCF配置。問題是,perfmon中沒有可用的計數器似乎給我所需的信息 - 比如創建的實例的數量。 –

+0

Ernie,這是一個有用的鏈接 - 謝謝。 –

+0

在perfmon中選擇:ServiceModelService 4.0.0.0 - > Instances - >。點擊確定。現在在「實例」列表中查找您的服務。 – ErnieL