Đây là một vấn đề cũ mà tôi đã bỏ qua một thời gian trước bởi vì tôi không thể giải quyết và nó chỉ ảnh hưởng đến một máy chủ (vì vậy tôi chỉ đặt dịch vụ của tôi ở một nơi khác). This dùng có một vấn đề với các triệu chứng giống với tôi:Tcp buffering breakage trong .NET runtime
- C máy chủ # .net đồng bộ TCP
- một đối tượng TcpClient được gán bằng cách chặn trên một TcpListener với phương pháp AcceptTcpClient
- khi có một đối tượng TcpClient , Tôi chuyển nó đến một luồng gọi phương thức GetStream của ứng dụng khách để tạo một NetworkStream
- NetworkStream này được lặp lại, trong mỗi lần lặp lại thực hiện một networkStream.Read (someBuffer, 0, 4096)
- ngay bây giờ client và server đều nằm trên cùng một mạng, không có ùn tắc để nói về
- máy chủ của tôi đã rất nhiều bộ nhớ để phụ tùng
- nếu tôi tải phần mềm máy chủ của tôi vào máy khác, vấn đề đi xa
- kicker: lưu lượng từ một mạng Linux hộp được thông qua tốt đẹp và đúng thời hạn
các tcpClient.AcceptTcpClient()
phương pháp khối cho khoảng một phút tại một thời điểm, dẫn đến máy chủ cần phải đọc một khối lượng lớn các byte một thời gian ngắn sau đó, thay vì những gì nó nên làm. Nó nên làm networkStream.Read() các khối byte nhỏ thường xuyên như chúng được gửi (và khách hàng gửi chúng mỗi 5s, không phải một lần một phút).
Nhận xét trước đó cho người dùng khác đề xuất vấn đề kết nối mạng phụ hoặc kết nối có thể là nguyên nhân, điều này ban đầu có vẻ hợp lý. Nhưng đây không phải là trường hợp.
Tôi đã tiến hành một bước nữa và cài đặt bộ phân tích gói ở cả máy khách và máy chủ. Kết quả:
- các tức client gửi một nó xuất hiện trên phân tích của máy chủ
- độ trễ mạng hoặc kết nối không phải là vấn đề
- gói/khung Quốc cũng đang có máy chủ tại thời gian chính xác
- một nơi nào đó giữa thẻ giao diện mạng mà máy phân tích của tôi đang theo dõi và ứng dụng của tôi đang gây ra sự chậm trễ này
- Thời gian chạy .NET là điều duy nhất giữa ứng dụng của tôi và netwo rk interfacing
- một số loại lỗi ổ cắm trong .NET là nguyên nhân gây ra độ trễ rất lớn này
Môi trường:
- trong trường hợp cụ thể của tôi, tôi đang sử dụng một PRO Intel/1000 Thẻ mạng MT và .NET
- Standard Edition Server 2003 R2, SP2
- Khuôn khổ .NET được cài đặt: 2.0 SP2, 3.0 SP2, 3.5 SP1, 4 Hồ sơ khách hàng, 4 Mở rộng
Nếu có bất kỳ lời khuyên nào, tôi rất muốn biết nó là gì.
Bạn xử lý các yêu cầu đồng thời như thế nào? tức là bạn có tạo ra một luồng cho mỗi khách hàng hay một thứ gì đó khác không? và tại thời điểm này xảy ra, có thể hữu ích khi gỡ lỗi số lượng khách hàng đồng thời được kết nối tại thời điểm đó (để đảm bảo bạn không đạt đến giới hạn trong đó một số khách hàng đã chết/hỏng quét một tấn chủ đề trong ứng dụng của bạn) – nos
@nos Có một điểm vào duy nhất và các máy khách duy nhất được gán đối tượng TcpClient độc đáo của riêng chúng, đó là chủ đề riêng của nó để xử lý các nội dung gửi đến của NetworkStream.Read(). Vì vậy, yeah, 1 chủ đề cho mỗi khách hàng, với vài khách hàng sử dụng dịch vụ cho tương lai có thể nhìn thấy. Và trong thử nghiệm chỉ có 1 khách hàng được kết nối. –
Điều duy nhất tôi có thể nghĩ đến ngoài vấn đề giữa ngăn xếp hệ điều hành và ứng dụng của bạn là thứ gì đó trong các tiêu đề gói được gửi qua dây. Để cụ thể hơn, có lẽ bit PSH không được đặt trong tiêu đề TCP cho trường hợp không thành công. Bạn có thể thử chạy một gói sniff trên một máy chủ hoạt động và một trong đó có. Sau đó so sánh cả hai và xem có bất kỳ sự khác biệt nào không. –