2012-11-19 14 views
6

BLサービスとしてWCFサービスが用意されています。 サービスは混合転送モードであり、10種類以上のエンドポイントを持ち、BasicHttpBindingによってバインドされています。契約は異なり、すべて同じアドレスです。 サービスは、IIS-7上のアプリケーションプール上で実行されます。WCFサービスが最初の呼び出しでメモリ使用量が高くなる

サービスはうまくいきますが、最初の呼び出しの後でもWSDLを取得してもw3wp.exeのメモリ使用量は300メガになります。サービスメモリの使用量は引き続き増加し続けますすべてのサーバーの物理メモリ(98〜100%)。メモリの不足はありませんでしたが、このような状況では他のアプリケーションやサービスが遅くなるため、カップル日ごとに手動でアプリケーションプールを手動で更新する必要があります。 私は既にメモリプロファイリングツールを使用しようとしましたが、問題の原因を見つけることができませんでした。

誰でもこの問題が発生しましたか?はいの場合、あなたは何をしましたか?

追加情報:

  • BLサービスはNHibernateは、 に基づいDALのフレームワークの上に配置され、我々はメモリリークがそこから発信され、既に除外しました。
  • 設定ファイル

    <?xml version="1.0" encoding="utf-8"?> 
    <configuration> 
        <appSettings> 
        </appSettings> 
        <system.web> 
         <compilation debug="true" targetFramework="4.0" /> 
         <httpRuntime maxRequestLength="20000" requestLengthDiskThreshold="20000" /> 
        </system.web>  
        <system.serviceModel>  
         <behaviors> 
          <serviceBehaviors> 
           <behavior name="DefaultServiceBehavior"> 
            <serviceMetadata httpGetEnabled="true" /> 
            <serviceDebug includeExceptionDetailInFaults="true" /> 
           </behavior> 
          </serviceBehaviors> 
    
          <endpointBehaviors> 
           <behavior name="AnonymousBehavior"> 
           </behavior> 
          </endpointBehaviors> 
         </behaviors> 
    
         <bindings> 
          <basicHttpBinding> 
           <binding name="SecureBinding" 
           closeTimeout="00:10:00" 
           openTimeout="00:10:00" receiveTimeout="00:10:00" 
           sendTimeout="00:10:00" allowCookies="true" 
           hostNameComparisonMode="StrongWildcard" maxBufferSize="65536000" 
           maxBufferPoolSize="524288000" maxReceivedMessageSize="65536000" 
           transferMode="Buffered"> 
            <readerQuotas maxDepth="20000000" 
            maxStringContentLength="8192000" 
            maxArrayLength="16384000" 
            maxBytesPerRead="4096000" 
            maxNameTableCharCount="16384000" /> 
             <security mode="None"> 
              <transport clientCredentialType="None"/> 
             </security> 
           </binding> 
         </basicHttpBinding>   
        </bindings> 
    
    <services> 
    <service name="BL.Services.MyService" 
    behaviorConfiguration="DefaultServiceBehavior"> 
    
    <endpoint address="" 
    binding="basicHttpBinding" 
    bindingConfiguration="SecureBinding" 
    bindingNamespace="Security/Anonymous" 
    behaviorConfiguration="WithSecurityContextInspector" 
    contract="BL.Services.Contracts.IAnonymousClaimsService" /> 
    
    <endpoint address="" 
    binding="basicHttpBinding" 
    bindingConfiguration="SecureBinding" 
    bindingNamespace="Domain/App" 
    behaviorConfiguration="WithSecurityContextInspector" 
    contract="BL.Services.Contracts.IAppService" /> 
    
    <endpoint address="" 
    binding="basicHttpBinding" 
    bindingConfiguration="SecureBinding" 
    bindingNamespace="Domain/App" 
    behaviorConfiguration="WithSecurityContextInspector" 
    contract="BL.Services.Contracts.IAttachmentService" /> 
    
    <endpoint address="" 
    binding="basicHttpBinding" 
    bindingConfiguration="SecureBinding" 
    bindingNamespace="Domain/Site" 
    behaviorConfiguration="WithSecurityContextInspector" 
    contract="BL.Services.Contracts.ISecurityService" /> 
    
    <endpoint address="" 
    binding="basicHttpBinding" 
    bindingConfiguration="SecureBinding" 
    bindingNamespace="Domain/Transaction" 
    behaviorConfiguration="WithSecurityContextInspector" 
    contract="BL.Services.Contracts.ITransactionService" /> 
    
    <endpoint address="" 
    binding="basicHttpBinding" 
    bindingConfiguration="SecureBinding" 
    bindingNamespace="Domain/ActiveDirectory" 
    behaviorConfiguration="WithSecurityContextInspector" 
    contract="BL.Services.Contracts.IActiveDirectoryService" /> 
    
    <endpoint address="" 
    binding="basicHttpBinding" 
    bindingConfiguration="SecureBinding" 
    bindingNamespace="Domain/Report" 
    behaviorConfiguration="WithSecurityContextInspector" 
    contract="BL.Services.Contracts.IReportService" /> 
    
    <host> 
    <baseAddresses> 
    <add baseAddress="//MyService.svc" /> 
    </baseAddresses> 
    </host> 
    </service> 
    </services> 
    
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
    <defaultDocument> 
    <files> 
        <add value="MyService.svc" /> 
    </files> 
    </defaultDocument> 
    </system.webServer> 
    </configuration> 
    
+0

私はWCFのメモリに問題はありませんでした。 WCFの設定オプションの無数のドキュメントは、かなり貧弱なIMOです。決してその底に到達せず、私自身のリモーティングフレームワークを書いてしまったので、メモリ消費を抑えることができました。より良い解決策が見つかるといいですね。 – spender

+0

あなたの設定はどのように見えますか?特にobjectItemsInGraphオプションなどの周りに?あなたは同時に走っていますか?いくつのアクティブなセッションなどを許可していますか?これらはすべて効果があります。 – Chris

答えて

4

長い検索の結果、問題が見つかりました。 私たちのサービスでは、作業パターンの単位で多くの論理ユニットが使用されていました。 各論理ユニットは、BaseLogicクラスから継承されています。 BaseLogicユニットには、ファクトリを作成するエンタープライズライブラリのUnityContainerプロパティがあります。各呼び出しはこのファクトリの多くのインスタンスを作成し、このプロパティを静的プロパティに変更することで問題が解決されました。

3

300メガバイトに最初の最初のジャンプは私が私たちのアプリケーションで見てきたものと一致しています。その数を減らす方法は実際には見つかりませんでしたが、時間の経過とともにその数字にとどまります。

メモリが増加するにつれ、標準のメモリリークや少なくともGCの問題のように聞こえます。エンティティフレームワークを使用していて、ビルドされたVSプロファイラではなく、Red Gatesメモリプロファイラのようなツールでプロファイルしましたか?

質問の情報に基づいて、より具体的な答えを出すのは難しいです。

一方、アプリケーションプールのIIS自動更新を使用してみます。選択したしきい値に設定し、リフレッシュを自動的に処理させます。

+0

私は質問が少し曖昧であることを知って、私は必要な情報を追加します。 –

5

AnkMannenのメモのとおり、300MBは珍しいことではありません。頻繁に使用されるサービスは、約700MB以上のものを容易に平らにすることができます。サービスほとんどの利用可能なサーバのメモリを消費するが、メモリ不足の例外のうちの引き金ではないのあなたの第2の観察が原因デフォルト以外の設定値に思われる:

binding: 
maxBufferSize="65536000" 
maxBufferPoolSize="524288000" 
maxReceivedMessageSize="65536000" 
transferMode="Buffered" 

readerQuotas: 
maxDepth="20000000" 
maxStringContentLength="8192000" 
maxArrayLength="16384000" 
maxBytesPerRead="4096000" 
maxNameTableCharCount="16384000" 

あなたが実際に過度のメモリを消費するためにWCFを構成していますあなたが選んだ価値これらの属性のデフォルト値を変更する必要がある特定の条件が発生していない限り、変更しないでください。私が日常的に変更する唯一の値は、避けられない場合は、デフォルトで64Kから約1〜2MBになるmaxReceivedMessageSizeです。 3MBを超えるメッセージを定期的に流している場合は、データ契約の設計を再考する必要があります。 WCFの多くのパフォーマンス問題は、実際にはWCF自体のパフォーマンスの問題ではなく誤った構成であると非難されています。

+0

ご意見ありがとうございます。私はこの問題を認識しており、既に確認しており、これは問題ではありません。 –

関連する問題