2012-11-19 30 views
6

Chúng tôi có dịch vụ WCF làm dịch vụ BL. Dịch vụ này ở chế độ Giao thông hỗn hợp, có hơn 10 điểm cuối khác nhau, được liên kết bởi BasicHttpBinding, với các hợp đồng khác nhau và cùng một địa chỉ cho tất cả chúng. Dịch vụ chạy trên nhóm ứng dụng trên IIS-7.Dịch vụ WCF đạt mức sử dụng bộ nhớ cao vào lần gọi đầu tiên

Vấn đề là dịch vụ hoạt động tốt, nhưng sau cuộc gọi đầu tiên, ngay cả khi nhận được WSDL, việc sử dụng bộ nhớ của w3wp.exe đi thẳng tới 300 mega, việc sử dụng bộ nhớ dịch vụ liên tục tăng tất cả bộ nhớ vật lý của máy chủ (98 - 100%). Chúng tôi đã không nhận được ra khỏi ngoại lệ bộ nhớ, nhưng tình trạng này làm chậm các ứng dụng khác và dịch vụ vì vậy chúng tôi cần phải làm mới hồ bơi ứng dụng một cách thủ công một lần mỗi cặp vợ chồng của ngày. Tôi đã cố gắng sử dụng công cụ định cấu hình bộ nhớ và không tìm thấy bất kỳ dẫn đến nguyên nhân của vấn đề.

Có ai gặp phải sự cố này không? và nếu có, bạn đã làm gì?

thông tin bổ sung:

  • Dịch vụ BL nằm trên một khuôn khổ DAL dựa trên NHibernate, chúng tôi đã loại trừ khả năng rò rỉ bộ nhớ là có nguồn gốc từ đó.
  • tập tin Config

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

Tôi gặp vấn đề về bộ nhớ với WCF đã từ chối không tham gia. Các tài liệu xung quanh vô số các tùy chọn cấu hình cho WCF là khá nghèo IMO. Không bao giờ đi đến đáy của nó và kết thúc bằng văn bản khuôn khổ từ xa của riêng tôi mà đưa tôi trở lại trong kiểm soát tiêu thụ bộ nhớ. Hy vọng bạn tìm thấy một giải pháp tốt hơn. – spender

+0

cấu hình của bạn trông như thế nào? đặc biệt là xung quanh các tùy chọn objectItemsInGraph vv? Bạn có đang chạy đồng thời không? Bạn cho phép bao nhiêu phiên hoạt động? Tất cả đều có hiệu lực. – Chris

Trả lời

4

Sau một tìm kiếm dài, chúng tôi đã tìm thấy sự cố. Dịch vụ của chúng tôi đã sử dụng rất nhiều đơn vị logic trong một đơn vị công việc. Mỗi đơn vị logic được kế thừa từ lớp BaseLogic. Trong đơn vị BaseLogic có một thuộc tính Enterprise Library UnityContainer đã tạo ra một nhà máy.Mỗi cuộc gọi tạo ra nhiều trường hợp của nhà máy này, việc thay đổi thuộc tính này thành một thuộc tính tĩnh cố định vấn đề.

3

Các bước nhảy đầu tiên đầu tiên 300MB là phù hợp với những gì tôi đã nhìn thấy trong các ứng dụng của chúng tôi. Đã không thực sự tìm thấy một cách để giảm số đó nhưng nó vẫn ở con số đó theo thời gian.

Đối với phần ngày càng tăng của bộ nhớ, nó giống như rò rỉ bộ nhớ tiêu chuẩn hoặc ít nhất là vấn đề GC. Bạn đang sử dụng khung thực thể và bạn có hồ sơ với một công cụ như Red Gates Memory Profiler, không phải là xây dựng trong hồ sơ VS?

Thật khó để đưa ra bất kỳ câu trả lời cụ thể nào hơn dựa trên thông tin trong câu hỏi.

Đồng thời, hãy thử sử dụng làm mới tự động IIS của nhóm ứng dụng. Đặt nó thành ngưỡng bạn chọn và để nó tự động xử lý việc làm mới.

+0

Tôi biết câu hỏi là một chút mơ hồ, tôi sẽ thêm bất kỳ thông tin cần thiết. –

5

300 MB không phải là bất thường như ghi chú AnkMannen. Dịch vụ được sử dụng nhiều có thể dễ dàng mở rộng khoảng 700MB trở lên. quan sát thứ hai dịch vụ của bạn tiêu thụ bộ nhớ máy chủ có sẵn nhất nhưng không kích hoạt một trong số memory exception có thể do các giá trị cấu hình không phải mặc định:

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

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

Bạn đang thực sự cấu hình WCF để tiêu thụ quá nhiều bộ nhớ với các giá trị bạn đã chọn. Trừ khi bạn đã gặp phải một điều kiện cụ thể yêu cầu thay đổi giá trị mặc định cho bất kỳ thuộc tính nào trong số đó, không thay đổi chúng. Giá trị duy nhất tôi thường xuyên thay đổi là maxReceivedMessageSize từ mặc định 64K đến khoảng 1 đến 2 MB, nếu không thể tránh khỏi. Nếu bạn thường xuyên trượt xung quanh các thư lớn hơn 3 MB, bạn nên xem xét lại thiết kế hợp đồng dữ liệu của mình. Rất nhiều các vấn đề hiệu suất WCF bị cáo buộc là thực sự misconfigurations không phải là vấn đề hiệu suất trong WCF chính nó.

+0

Cảm ơn nhận xét của bạn, tôi biết vấn đề này, chúng tôi đã kiểm tra nó và đây không phải là vấn đề. –

Các vấn đề liên quan