Điểm:0

How to improve TCP tolerance to out-of-order delivery in Linux balance-rr bonds and/or FreeBSD roundrobin laggs?

lá cờ cn

I have 3 servers networ kwise configured as follows

  • A is a DELL R710 is running Linux 5.13.19-1-pve Proxmox VE 7.1 and has 4 NICs teamed in a balance-rr mode bond.
  • B is a DELL R610 is running Linux 5.13.19-1-pve Proxmox VE 7.1 and has 4 NICs teamed in a balance-rr mode bond.
  • C is a DELL R710 running FreeBSD 12.2-RELEASE-p1 with a lagg over 8 NICs in roundrobin (this is a TrueNAS distro).

All NICs are 1 GBps.

When I run iperf3 between the Linux blades, I max at about 3 GBps, and the window goes up to an average of ~300 KiB. However, between the TrueNAS (FreeBSD) blade and the Linux blades, the TCP stream maxes at 1.20 Gbps and caps the window at ~60 KiB average. If I run parallel streams (i.e., iperf3 ... -P 8) I can saturate the bond. On the other hand, as expected, the retransmit count is pretty high in both cases. So, my questions are,

  1. Why is FreeBSD not reaching the same throughput if supposedly both are approaching the problem in the same way? (maybe that's where I am wrong).
  2. Is there a tuning option or combination of options to make the TCP stack more tolerant to out-of-order without triggering immediate retransmits? (I am vaguely familiar with the 3-ACK reTX, basics of TCP congestion control, and so on).

I will include here some tunables and options I have used during my testing.

  • All ifaces are set to use jumbo frames (MTU 9000).
  • The Linux boxes are tuned as follows
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 16777216
net.core.wmem_default = 16777216
net.ipv4.tcp_mem = 1638400 1638400 1638400
net.ipv4.tcp_rmem = 10240 87380 16777216
net.ipv4.tcp_rmem = 10240 87380 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_reordering = 127
net.ipv4.tcp_max_reordering = 1000
net.core.netdev_max_backlog = 10000
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_congestion_control = reno
  • The FreeBSD (TrueNAS Core ~= FreeNAS) box is tuned as follows
kern.ipc.maxsockbuf=614400000
kern.ipc.somaxconn=1024
net.route.netisr_maxqlen=8192
net.inet.ip.intr_queue_maxlen=8192
net.inet.tcp.mssdflt=8948
net.inet.tcp.reass.maxqueuelen=1000
net.inet.tcp.recvbuf_inc=65536
net.inet.tcp.sendbuf_inc=65536
net.inet.tcp.sendbuf_max=307200000
net.inet.tcp.recvbuf_max=307200000
net.inet.tcp.recvspace=65228
net.inet.tcp.sendspace=65228
net.inet.tcp.minmss=536
net.inet.tcp.abc_l_var=52
net.inet.tcp.initcwnd_segments=52 # start fast
net.inet.udp.recvspace=1048576
net.inet.udp.sendspace=1048576
Effie avatar
lá cờ ne
liên quan đến truyền lại: có [rfc4015](https://datatracker.ietf.org/doc/html/rfc4015) về cơ bản tăng 3-ACK lên thứ gì đó lớn hơn khi sắp xếp lại.Lần trước tôi đã làm việc với nhân linux (khoảng v4.0.2), nó đã được triển khai. Ngoài ra, `net.ipv4.tcp_reordering = 127` có nghĩa là 3-ACK thực sự là 127-ACK.
Effie avatar
lá cờ ne
chiến lược thử nghiệm thông thường của tôi sẽ là: giảm tải phân đoạn tcp (không biết nó hoạt động như thế nào với các khung jumbo), sau đó kiểm tra xem điều khiển luồng có phải là yếu tố hạn chế không (bộ đệm đủ lớn). Trên Linux, tôi làm điều đó với tcp_probe và kiểm tra xem cửa sổ tắc nghẽn trông giống như reno chứ không phải hình vuông, không biết có công cụ tương tự cho freebsd không, sau đó kiểm soát tắc nghẽn (linux của bạn được đặt thành reno, vì vậy ít nhất nó không đáng giá hơn freebsd ). có lẽ không giúp được gì, nhưng chỉ trong trường hợp.
Điểm:1
lá cờ us

Bạn có thể thử sử dụng khung jumbo nếu mạng của bạn hỗ trợ. Nó không loại bỏ vấn đề chính của việc kích hoạt truyền lại TCP không theo thứ tự.Tuy nhiên, vì các khung ethernet lớn hơn gấp sáu lần, nên số lượng gói giảm đi, điều này làm giảm số lượng sự kiện không theo thứ tự.

Nếu không, bạn nên kiểm tra trường hợp sử dụng của mình, bạn có thực sự cần một kết nối TCP để nhận toàn bộ thông lượng không? Nếu có nhiều kết nối TCP đang hoạt động giữa các thiết bị thì bạn nên sử dụng cân bằng tải nhận biết TCP.

dacabdi avatar
lá cờ cn
Các khung Jumbo giúp ích rất nhiều, cho đến nay nó là khung có thể điều chỉnh được tác động tích cực nhất và tôi hiểu tại sao. Mặt khác, tôi đang cố gắng tối đa hóa thông lượng cho một bên, vì vậy, theo một cách nào đó, vâng, tôi cần luồng TCP tối đa hóa. Tôi sẽ di chuyển một số tệp lớn với rất ít công việc đồng thời.
lá cờ us
Ngoài ra còn có Multipath TCP, phù hợp với trường hợp sử dụng của bạn. Tuy nhiên, vẫn còn sớm đối với nó, vì vậy bạn có thể không tìm thấy triển khai ổn định cho môi trường của mình.https://en.wikipedia.org/wiki/Multipath_TCP có thêm thông tin.
dacabdi avatar
lá cờ cn
Điều đó thật tuyệt, tôi không biết về MPTCP. Tôi sẽ đọc một số, ngay cả khi chưa được áp dụng rộng rãi, đó là thứ tôi có thể thử nghiệm trong một số băng ghế trong phòng thí nghiệm.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.