2016-10-21 16 views
17

Tôi có dịch vụ WCF (được xây dựng trong .NET framework 3.5) được lưu trữ trên IIS 6.0.Chủ đề hủy bỏ ngoại lệ trong dịch vụ wcf

Dòng chảy của mã này là như sau

  1. khách hàng (mà là một dịch vụ web) gọi các dịch vụ WCF
  2. dịch vụ WCF gọi a thread để thực hiện xử lý ở chế độ nền và đáp ứng các callee ngay lập tức .
  3. Chuỗi nền sau khi hoàn thành tất cả quá trình xử lý, gọi lại chuỗi. Cuộc gọi này về cơ bản là một yêu cầu HTTP vì khách hàng là một dịch vụ web.

Tôi đang tải thử nghiệm dịch vụ WCF của mình để xác định ngưỡng. Quan sát như sau:

Khoảng 3 lần lặp của 1024 yêu cầu được thực hiện cho dịch vụ WCF trong vòng 1 phút trôi qua thành công. Thời gian thực hiện để hoàn thành mỗi lần lặp là khoảng 25-30 phút. Tuy nhiên, từ lần lặp lại số lượng lớn lặp lại thứ tư được nhìn thấy. Khoảng 50% yêu cầu không thành công với ngoại lệ bên dưới.

Chủ đề ngoại lệ đã bị hủy.

Stack trace

21_10_2016_09_30_52,9:30:52 AM,Information,Thread name- apSwTTbLTETfwT3y Stack trace in ProcessTestConversion method - at System.Threading.WaitHandle.WaitOneNative(SafeHandle waitableSafeHandle, UInt32 millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext) 
    at System.Threading.WaitHandle.InternalWaitOne(SafeHandle waitableSafeHandle, Int64 millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext) 
    at System.Threading.WaitHandle.WaitOne(Int32 millisecondsTimeout, Boolean exitContext) 
    at System.Net.LazyAsyncResult.WaitForCompletion(Boolean snap) 
    at System.Net.Connection.SubmitRequest(HttpWebRequest request, Boolean forcedsubmit) 
    at System.Net.ServicePoint.SubmitRequest(HttpWebRequest request, String connName) 
    at System.Net.HttpWebRequest.SubmitRequest(ServicePoint servicePoint) 
    at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context) 
    at System.Net.HttpWebRequest.GetRequestStream() 
    . 
    .(My function calls stack trace) 
    . 
    . 

Những thay đổi tôi đã cố gắng để giải quyết vấn đề này như sau:

<behavior> 
    <serviceThrottling maxConcurrentCalls="2000" 
           maxConcurrentInstances ="2400" 
           maxConcurrentSessions ="400"/> 
    </behavior> 

trong web.config

<system.web> 
     <compilation debug="false" /> 
     <httpRuntime executionTimeout="1800"/> 
    </system.web> 

trong web.config

<system.net> 
     <connectionManagement> 
      <add address = "*" maxconnection = "100" /> 
     </connectionManagement> 
     </system.net> 

trong web.config

ServicePointManager.DefaultConnectionLimit = 100; (Change in code) 

tôi đã thiết lập các thuộc tính của hồ bơi App để 0 IdleTimeout theo đề nghị của nhiều người trên StackOverflow.

Trường hợp sử dụng các luồng mà tôi đã bỏ ở tất cả các địa điểm. Vì vậy, tất cả các dòng được đóng lại.

Bất kỳ ai có thể cho tôi biết ai đang hủy các chủ đề và tại sao và có bất kỳ phương tiện hoặc công cụ nào để theo dõi nguyên nhân bắt đầu hủy bỏ chuỗi không?

+0

Có thể rằng các khách hàng hủy bỏ các req uest, gây ra điều này cũng sẽ tạo ra một ngoại lệ trên phía máy chủ – Jehof

+4

ASP.NET sinh sản và giết chết các quy trình công nhân tất cả các thời gian khi cần thiết. Chủ đề của bạn chỉ có thể bị tắt bởi ASP.NET. Tìm hiểu xem có bao nhiêu luồng có thể chạy cùng lúc với máy tính của bạn. Cũng cố gắng theo dõi hiệu suất xử lý trong khi bạn thử nghiệm. – Alexandr

+0

Bạn tăng số lượng cuộc gọi gộp nhưng không tăng kích thước bộ đệm. Tôi có cảm giác rất nhiều cuộc gọi đang bị loại bỏ vì điều đó. – Franck

Trả lời

3

Tôi đã gặp vấn đề này và việc sử dụng lớp khách hàng không đúng.

Điều gì đã xảy ra là khi một lớp máy khách đã được khởi tạo, nó sẽ không giải phóng các nguồn tài nguyên trở lại gây ra việc giảm thông lượng. Một ngoại lệ rất vô ích "Chủ đề đã bị hủy bỏ" sẽ xảy ra. Điều này đã được giải quyết bằng cách tạo ra một lớp trợ giúp mà chung đồng minh tạo ra một đối tượng khách hàng và sau đó thực hiện phương thức khởi tạo và xử lý đúng cách.

Một số ngoại lệ IIS không phải là rất hữu ích hoặc đúng với nguyên nhân thực sự của vấn đề nhưng để có được dưới cùng của những gì đã được thực hiện để giải quyết vấn đề của tôi là xem nhật ký IIS.Cụ thể là "Failed Request Tracing Rules"

Hy vọng điều này sẽ giúp ích, tôi có thể hiểu được sự thất vọng của bạn.

2

Tôi có điều tương tự trước đây. Giải pháp là giải phóng tài nguyên/khách hàng sau khi phạm vi của nó đã kết thúc bằng cách thực hiện phương thức Vứt bỏ.

Vấn đề tồn tại kể từ khi tuyên bố C# using để tự động dọn dẹp các nguồn lực khi sử dụng một khách hàng đã nhập không thành công và bất kỳ ngoại lệ ném được che đậy bởi dispose ngầm mà ăn thực tế ngoại lệ & ném một số ngoại lệ khác như thời gian chờ hoặc ngoại lệ khác.

Câu lệnh C# "using" dẫn đến một lệnh gọi Dispose(). Điều này giống với Close(), điều này có thể ném ngoại lệ khi xảy ra lỗi mạng. Bởi vì lệnh gọi Dispose() xảy ra ngầm tại dấu ngoặc đóng của khối "đang sử dụng", nguồn ngoại lệ này có khả năng không được chú ý cả bởi những người viết mã và đọc mã. Điều này thể hiện một nguồn lỗi ứng dụng tiềm năng. (Từ MSDN)

Bạn nên giải phóng tài nguyên như:

Bằng cách này bạn có thể không chỉ tìm nguồn thực tế của ngoại lệ & cũng giải phóng tài nguyên khi một số execption xảy ra.

khác giải pháp thay thế có thể được thực hiện Dispose như:

/// <summary> 
/// Calculator Client 
/// </summary> 
public partial class CalculatorClient : IDisposable 
{ 
    #region IDisposable implementation 

    /// <summary> 
    /// IDisposable.Dispose implementation, calls Dispose(true). 
    /// </summary> 
    void IDisposable.Dispose() 
    { 
     Dispose(true); 
    } 

    /// <summary> 
    /// Dispose worker method. Handles graceful shutdown of the 
    /// client even if it is an faulted state. 
    /// </summary> 
    /// <param name="disposing">Are we disposing (alternative 
    /// is to be finalizing)</param> 
    protected virtual void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      try 
      { 
       if (State != CommunicationState.Faulted) 
       { 
        Close(); 
       } 
      } 
      finally 
      { 
       if (State != CommunicationState.Closed) 
       { 
        Abort(); 
       } 
      } 
     } 
    } 

    /// <summary> 
    /// Finalizer. 
    /// </summary> 
    ~CalculatorClient() 
    { 
     Dispose(false); 
    } 

    #endregion 
} 

Nguồn:

Avoiding Problems with the Using Statement MSDN

Using and Disposing of WCF Clients

+0

Xin lỗi vì trả lời chậm. Cảm ơn bạn rất nhiều vì đã dành thời gian cho các bạn. Vì tôi muốn vấn đề được khắc phục càng sớm càng tốt, một công việc xung quanh là tăng kích thước ram của máy đã khắc phục được sự cố. – shivkumar

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