2012-01-24 29 views
5

Đâ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ì.

+1

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

+0

@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. –

+2

Đ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. –

Trả lời

1

Điều này có thể do một trong những điều sau đây.

  • Nhiều khả năng: Phần cứng TCP offload.

Mô hình thẻ mạng đó đã được quan sát thấy có sự cố với tải TCP trong các tình huống khác. Bạn có thể tắt tính năng này ở cấu hình trình điều khiển thiết bị.

Nếu đó là vấn đề với việc xử lý phân đoạn bị hỏng thì bạn có thể thấy nó chỉ xảy ra trên một số tuyến mạng nhất định có thể giải thích sự khác biệt quan sát giữa máy khách Linux và máy khách Windows của bạn.

Ví dụ: http://forums.novell.com/novell-product-support-forums/netware/nw-other/communications/187741-offload-tcp-segmentation-intel-pro-1000-mt.html

  • ít có khả năng: Đường dẫn vấn đề MTU.

Đường dẫn MTU được cho là sẽ được tự động phát hiện, nhưng nếu một bộ định tuyến can thiệp sẽ loại bỏ tất cả lưu lượng ICMP (bao gồm "cần phân mảnh") thì bạn có thể thấy các kết nối treo. Trong trường hợp của bạn kết nối thành công cuối cùng vì vậy tôi không nghĩ rằng đây là vấn đề của bạn, nhưng đáng để kiểm tra. (Bạn cũng có thể làm giảm MTU và thay đổi thuật toán phát hiện MTU nếu cần thiết, nhưng có lẽ bạn nên đi về một mình này, trừ khi đây là vấn đề của bạn và bạn không thể sửa chữa các bộ định tuyến.)

  • ít có khả năng: Nỗ lực để thiết lập lỗi kết nối IPSec.

Nếu máy tính trong Windows có thể đang cố gắng và không thiết lập mối quan hệ IPSec. Điều này sẽ phụ thuộc vào cấu hình của cả máy khách và máy chủ. Thông thường điều này sẽ thất bại một cách nhanh chóng, nhưng nếu bạn đang chặn một số lưu lượng truy cập IPSec, bạn có thể thấy nó không chậm. Tìm kiếm lưu lượng IKE và IPSec trong bộ phân tích mạng của bạn.

+0

Được giải quyết, được bỏ phiếu. Đây là vấn đề. Cảm ơn một triệu, tôi sẽ không bao giờ đi đến kết luận đó một mình. –

+0

Thực ra, một câu hỏi nhanh khác. Là phần cứng TCP offload cái gì đó có thể xảy ra và sau đó nhanh chóng biến mất một cách nhanh chóng như nó xuất hiện? Tôi đã có vấn đề này trong 3 ngày, và vào ngày thứ ba mọi thứ trở lại bình thường. Không có bản cập nhật, cùng một phần mềm. Các vấn đề về phần cứng của TCP có thể tồn tại mãi mãi hoặc có thể không được chấp nhận? –

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