Tại sao thông lượng TCP của tôi lớn hơn nhiều so với thông lượng UDP?


15

Tôi chưa làm bất cứ điều gì bất thường đối với cấu hình phần cứng hoặc hạt nhân của mình (tất cả các cài đặt mặc định, cài đặt hệ điều hành mới, ngăn xếp Linux 3.11 TCP / IP) và tôi trung bình khoảng 3,83 triệu tin nhắn mỗi giây thông qua TCP trong khi tôi chỉ đạt trung bình 0,75 triệu tin nhắn mỗi giây thông qua UDP. Điều này dường như hoàn toàn bất chấp những gì tôi mong đợi của hai giao thức.

Điều gì có thể gây ra sự khác biệt lớn nhất và làm cách nào tôi có thể chẩn đoán nó trên Ubuntu 13.10?

#TCP RESULTS
Recv   Send    Send                          Utilization       Service Demand
Socket Socket  Message  Elapsed              Send     Recv     Send    Recv
Size   Size    Size     Time     Throughput  local    remote   local   remote
bytes  bytes   bytes    secs.    10^6bits/s  % S      % S      us/KB   us/KB

87380  65536     64    10.00      1963.43   32.96    17.09    5.500   2.852

#UDP RESULTS
Socket  Message  Elapsed      Messages                   CPU      Service
Size    Size     Time         Okay Errors   Throughput   Util     Demand
bytes   bytes    secs            #      #   10^6bits/sec % SS     us/KB

4194304      64   10.00     7491010      0      383.5     28.97    24.751
212992            10.00     1404941              71.9     25.03    21.381

Đối với thử nghiệm này, tôi có hai máy chủ thử nghiệm giống hệt nhau và được kết nối trực tiếp qua cáp chéo 10G. Các NIC được sử dụng trong trường hợp này là Intel X520 với cấu hình bên ngoài và được kết nối với khe cắm PCIe 3.0 x8 trên bo mạch chủ, giao tiếp với CPU thông qua bộ điều khiển NUMA.


Làm thế nào bạn điểm chuẩn? Chống lại những gì bạn đã gửi những gói đó?
Braiam

Tôi đã sử dụng netperfcho các điểm chuẩn, các bài kiểm tra UDP_STREAM và TCP_STREAM, được cố định cho cùng CPU và kích thước thông báo 64 byte.
elleciel

1
Điều đó không trả lời câu hỏi của @ Braiam. Cấu trúc liên kết mạng là và phương pháp kiểm tra chi tiết là quan trọng, ở đây.
Pavel imerda

1
@ PavelŠimerda Xin lỗi, tôi nghĩ rằng anh ta chỉ yêu cầu phương pháp thử nghiệm mà thôi. Về cấu trúc liên kết mạng, hai máy chủ thử nghiệm giống hệt nhau và được kết nối trực tiếp qua cáp chéo 10G. Các NIC được sử dụng trong trường hợp này là Intel X520 với cấu hình bên ngoài và được kết nối với khe cắm PCIe 3.0 x8 trên bo mạch chủ, giao tiếp với CPU thông qua bộ điều khiển NUMA. Điều này có trả lời câu hỏi của bạn không?
elleciel

1
Vâng, @elleciel, nó chắc chắn trả lời câu hỏi của tôi. Mặc dù trong trường hợp này tôi không có chuyên môn để cung cấp cho bạn câu trả lời cho các máy được kết nối trực tiếp. Tôi thấy bạn đã sửa đổi câu hỏi, đó là tuyệt vời. Sẽ đưa ra câu hỏi như bây giờ tôi cũng quan tâm.
Pavel Šimerda

Câu trả lời:


29

Ngoài việc không nhận được thông tin chi tiết về thiết lập thử nghiệm của bạn, vấn đề chính dường như là, bạn sử dụng kích thước thư là 64 byte. Điều này khác xa với MTU thông thường là 1500 byte và khiến UDP hoạt động kém hiệu quả: trong khi TCP hợp nhất nhiều lần gửi vào một gói trên dây (trừ khi TCP_NODELAY được đặt) để sử dụng hiệu quả liên kết, mỗi thông báo UDP sẽ dẫn đến một gói riêng. Trong các số: khoảng 23 thông báo có kích thước 64 byte sẽ được kết hợp thành một gói TCP có kích thước MTU, trong khi nó sẽ cần 23 gói đơn cho UDP cho cùng một lượng dữ liệu. Mỗi gói này có nghĩa là chi phí gửi từ máy chủ, truyền trên dây và nhận bởi máy ngang hàng. Và như đã thấy trong trường hợp của bạn, khoảng 80% các gói UDP bị mất do phần cứng của bạn không đủ nhanh để truyền và nhận tất cả các gói này.

Vì vậy, những gì bạn có thể học được từ điểm chuẩn này là:

  • UDP không đáng tin cậy (mất gói 80%)
  • UDP không hiệu quả nếu được sử dụng với kích thước gói thấp hơn MTU
  • TCP được tối ưu hóa cao để sử dụng tốt nhất liên kết

Theo mong đợi của bạn, UDP đó sẽ tốt hơn: bạn có bao giờ tự hỏi tại sao tất cả các lần chuyển tệp chính (ftp, http, ...) được thực hiện với các giao thức dựa trên TCP không? Điểm chuẩn cho bạn thấy lý do.

Vậy tại sao mọi người sử dụng UDP cả?

  • Với dữ liệu thời gian thực (ví dụ: thoại qua IP), bạn không quan tâm đến các tin nhắn cũ hơn, vì vậy bạn không muốn người gửi kết hợp các tin nhắn thành các gói lớn hơn để sử dụng hiệu quả liên kết. Và bạn chấp nhận rằng một gói bị mất hơn là đến quá muộn.
  • Với các liên kết có độ trễ cao (như với các vệ tinh), hành vi mặc định của TCP là không tối ưu để sử dụng hiệu quả liên kết. Vì vậy, một số người chuyển sang UDP trong trường hợp này và triển khai lại lớp tin cậy của TCP và tối ưu hóa nó cho các liên kết có độ trễ cao, trong khi những người khác điều chỉnh ngăn xếp TCP hiện có để sử dụng liên kết tốt hơn.
  • "vứt bỏ" dữ liệu: đôi khi điều quan trọng hơn là gửi dữ liệu đi và không quan tâm đến việc mất gói, như với thông điệp tường trình (syslog)
  • Tương tác ngắn: với TCP, bạn cần thiết lập kết nối duy trì trạng thái, chi phí thời gian và tài nguyên tại máy khách và máy chủ. Đối với các tương tác ngắn (như yêu cầu ngắn và trả lời), điều này có thể quá nhiều chi phí. Do DNS này thường được thực hiện với UDP nhưng đã được xây dựng thử lại trên đầu UDP.

2
Bạn cũng nên xem xét việc mất gói 80% với UDP. Có vẻ như phần cứng của bạn không đủ nhanh để xử lý các gói theo cùng tốc độ chúng nhận được. Trong khi TCP điều chỉnh loại mất gói này với tốc độ chậm lại, UDP sẽ chỉ gửi với cùng tốc độ và tiếp tục mất các gói. Nhưng cuối cùng, nó không liên quan đến việc bạn có thể gửi nhanh như thế nào, mà là những gì bạn nhận được.
Steffen Ullrich

1
Một thứ khác có thể là một yếu tố là tăng tốc / giảm tải TCP cho card mạng (nếu nó hỗ trợ nó).
cpugeniusmv

1
Gửi gói có thể hiệu quả hơn nhận, đặc biệt là nếu gói cuối cùng bị gián đoạn.
Steffen Ullrich

1
mọi người cũng sử dụng UDP cho một thiết bị nhúng để phát dữ liệu mà nó đang thu thập qua dây và không bận tâm với thiết lập kết nối
ratchet freak

3
Bạn rất có thể IO bị ràng buộc bởi bus tốc hành PCI. Các thẻ mạng sẽ được kích hoạt giảm tải phân đoạn TCP, rất có thể. Điều này có nghĩa là việc chuyển TCP sẽ được gửi đến thẻ thành một khối lớn, sau đó các lát cắt và cắt chúng thành các gói và đặt chúng lên dây. Không có tương đương với UDP, do đó, kết quả là một giao dịch PCIe (và tất cả các chi phí liên quan) cho mỗi gói.
alex.forencich
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.