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
- khách hàng (mà là một dịch vụ web) gọi các dịch vụ WCF
- 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 .
- 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?
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
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
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