2015-11-10 20 views
5

Chúng tôi đang sử dụng Dịch vụ Windows để thực hiện các cuộc gọi HTTP rất thường xuyên đến một dịch vụ REST bên trong (20-40 cuộc gọi mỗi giây), nhưng nhận thấy một sự chậm trễ lâu trong việc nhận phản hồi sau khi dịch vụ chạy trong vài phút.HttpWebRequest Port Exhaustion

Nhìn vào netstat, có một vài cổng có trạng thái "TIME_WAIT" và có vẻ như chúng tôi có thể đang hết cổng.

Làm cách nào để đảm bảo rằng các cổng được sử dụng lại?

+0

Bạn có đang xử lý các yêu cầu yêu cầu sau khi hoàn tất không? –

+0

Bạn có sử dụng nhiều chủ đề không? – CSharpie

+0

Thực sự đây là một câu hỏi về hiệu suất ... bạn đã đánh số vào đây là nguyên nhân gây ra vấn đề của bạn ... Tôi không tin được. Tôi muốn nói rằng nó là rất nhiều khả năng là một triệu chứng của một vấn đề khác nhau. – spender

Trả lời

1

Có giới hạn về số lượng kết nối HTTP gửi đi đồng thời. Bạn có thể kiểm soát điều này bằng cách sử dụng các tài sản System.Net.ServicePointManager.DefaultConnectionLimit tĩnh trước khi tạo HttpWebRequest đối tượng

Nó có thể là thiết lập giá trị này đến một giá trị cao hơn so với mặc định mà tôi tin là 2.

Nếu điều này không giúp thì bạn có thể cũng tăng kích thước mặc định ThreadPool để cho phép bạn tạo nhiều yêu cầu nhanh hơn. Hồ bơi chủ đề chỉ tăng dần số chủ đề của nó dần dần - một chuỗi mới mỗi nửa giây, IIRC

+0

Cảm ơn, nhưng chúng tôi đã có những sản phẩm sau thiết lập trong file web.config: user2966445

+0

Ngoài ra, chúng tôi chạy theo dõi trong khi yêu cầu được gửi và GetRequestStream() trung bình 0-1 ms, trong khi GetResponse() phương pháp có đôi khi 60,000ms +. Chúng ta có thể thấy ở phía bên nhận thời gian xử lý một phản hồi nhỏ hơn 1.000ms, do đó, nút cổ chai ở bên gửi. – user2966445

+0

@ user2966445 Bạn có đảm bảo bạn vứt bỏ bất kỳ phản hồi nào, v.v. khi bạn kết thúc với họ không? Nếu bạn làm điều này thì C# theo mặc định sẽ tái sử dụng cùng một kết nối mạng cơ bản theo mặc định (không phải cùng một yêu cầu tuy nhiên điều đó là không thể). –

0

Làm cách nào để đảm bảo rằng các cổng được sử dụng lại? Không đặt giới hạn kết nối thành giá trị gần như đảm bảo rằng chúng sẽ không.

Có vẻ như ai đó đã khỉ với ServicePointManager tại một số thời điểm. Tôi sẽ giới hạn ServicePoint cho nguồn gốc này: để khuyến khích việc tái sử dụng đường ống và kết nối http:

ServicePointManager.FindServicePoint(Uri).ConnectionLimit = someSensibleValue; 
+0

Chúng tôi đã cố gắng thiết lập kết nối tối đa trong tập tin cấu hình: user2966445

+0

@ user2966445 Vì vậy, cảng phù du dao động từ 49152 đến 65535 ... hoặc 16383.Có thể hiểu rằng bạn có thể sử dụng một giá trị cao như vậy. Tại sao bạn cần phải đi trên 10 hoặc hơn cho máy chủ này? Tối ưu, bạn có bao nhiêu yêu cầu không được đáp ứng đồng thời? Bạn không nên cần nhiều kết nối hơn giá trị này trong điều kiện thông thường. Các kết nối có thể được tái sử dụng (trừ khi máy chủ từ xa là http1.0, phát hành các kết nối 'kết nối: đóng' hoặc hủy kết nối). Giá trị cao như vậy sẽ gây bất lợi vì sẽ không tái sử dụng các kết nối và chúng sẽ hết hạn và gần với TIME_WAIT. – spender