Mesh MCX516A-CCAT trên DAC 100G: lshw báo 40Gbit/s còn một luồng iperf3 chỉ đạt tối đa 21 Gbit/s
Bọn mình chạy một cluster ba node với các node đấu cáp trực tiếp với nhau qua DAC 100G, không có switch nào trên đường truyền, và các interface được đưa vào một broadcast bond để traffic replication có fabric riêng của nó. Trước khi đặt tải thật lên đó, mình muốn có một baseline, và các con số lại không khớp với nhau.
- 3x Mellanox ConnectX-5 EN, MCX516A-CCAT, hai cổng QSFP28
- Một DAC 100G giữa mỗi cặp node
- Host AMD EPYC, Proxmox trên cả ba
ethtool thì hoàn toàn hài lòng:
# ethtool ens1
Settings for ens1:
Supported link modes: 100000baseCR4/Full
Advertised link modes: 100000baseCR4/Full
Speed: 100000Mb/s
Duplex: Full
Link detected: yes
lshw thì không:
# lshw -class network
*-network
description: Ethernet interface
vendor: Mellanox Technologies
capacity: 40Gbit/s
Và iperf3 giữa hai trong số các node nằm ở khoảng 21 Gbit/s, chẳng gần với con số nào trong hai con số kia cả.
Đã làm:
- chuyển cáp sang cổng thứ hai trên cả hai card, không đổi
- đổi sang một DAC khác cùng loại, không đổi
- link giữ up suốt thời gian, không có lỗi nào tăng trên counter
Vậy công cụ nào trong hai công cụ đang nói dối mình, và mình nên truy theo cáp, card, hay driver?
Comments 5
Không có gì bạn đăng lên chỉ về phía DAC cả. Có hai chuyện không liên quan đến nhau đang xảy ra ở đây.
Thứ nhất, chuyện không khớp nhau.
lshw -class networkin ra một con số capability mà nó tự tính lấy, và trên các card này nó sẽ vô tư nóicapacity: 40Gbit/svề một link đã lên ở 100G. Tốc độ đã negotiate mới là thứethtoolbáo cáo, và của bạn nóiSpeed: 100000Mb/svới100000baseCR4/Fullđược advertise. Phần đó ổn rồi, chẳng có gì phải sửa.Thứ hai, chuyện throughput. Kiểm tra khe cắm trước khi đụng vào bất cứ thứ gì khác:
Nếu
LnkStatrain ở 2.5GT/s trong khiLnkCapnói 8GT/s, bạn đang bị giới hạn thấp hơn hẳn so với khả năng thực, và đổi cáp bao nhiêu lần cũng chẳng giúp được gì. Cắm lại card và đảm bảo nó nằm trong một khe thực sự được đi dây đủ full width.Rồi ngừng đo bằng một luồng duy nhất:
Khoảng 21 Gbit/s là mức mà một core sẽ cho bạn trên loại host này, nên riêng con số đó chẳng nói lên được bao nhiêu. Theo dõi CPU trong lúc chạy và xem cả idle state đang làm gì nữa: các core rơi vào C-state sâu giữa các đợt burst sẽ tốn thật sự băng thông ở tốc độ này.
Trước khi bạn đặt mua bất cứ thứ gì để thay thế, đăng dòng
LnkStatừlspci -vvcho card đó và dòng lệnh iperf3 chính xác bạn đã dùng. Một luồng ở 100G đo một CPU core duy nhất, không phải đo link, và nhiều người đã tốn cả ngày trời vì chuyện này. Và xác nhận luôn là cổng thứ hai thực sự đang mang leg còn lại của mesh trong lúc bạn test, chứ không phải đang nằm không: một khe nuôi hai cổng 100G đang sống là một ngân sách khác hẳn so với một cổng. Mình sẽ gáclshwsang một bên lúc này, nó không phải công cụ cho câu hỏi này.Một chỉnh sửa về phần C-state: nếu host là EPYC, mấy công tắc
intel_idleđược dán vào mọi thread kiểu này chẳng có tác dụng gì với bạn đâu, driver đó hoàn toàn không nằm trên đường đi ở AMD. Cái đòn bẩy có tác dụng với mình làprocessor.max_cstate=2trên kernel command line. Cùng ý tưởng, khác platform. Phần còn lại của bài đó vẫn đúng, đặc biệt là chuyện không đọc tốc độ đã negotiate từlshw.Một lỗi hơi khác, cùng họ phần cứng, đáng để loại trừ khi khe cắm đã ổn: một mesh trực tiếp giữa các cổng QSFP28 ConnectX-5 rất dễ bị sai ở layer 3. Mình từng có ba node trên MCX516A-CCA_Ax, firmware 16.35.4030 với driver DOCA 2.8.0, đấu bằng DAC đồng MCP1600-C003E30L 3 m. Mọi link đều báo active ở 100 Gbps và không một ping nào đi qua được. Cả sáu interface trong mesh đều có địa chỉ từ cùng một subnet 10.5.5.x mà không có switch nào trên đường truyền, nên kernel không có cách nào quyết định đích đến cho trước thuộc về cổng vật lý nào. Mỗi cặp node một subnet riêng, 10.5.5.x, 10.5.6.x và 10.5.7.x, và nó bắt đầu hoạt động. Đáng để chạy
ip avàip routetrên cả ba box trước khi ai đó đổ lỗi cho dây đồng.Cả hai điểm đều đúng.
lspci -vvcho thấy card train ở 2.5GT/s so vớiLnkCaplà 8GT/s, nên đó là nghi phạm số một. Mình chuyển card sang khe khác trên cả ba box,LnkStagiờ lên ở 8GT/s, và vớiiperf3 -P 8cùng cặp node đó vượt qua ngay con số đo bằng một luồng.Mình cũng từ bỏ broadcast bond và xây lại mesh trên Open vSwitch với RSTP. Với iperf trải trên ba luồng CPU và cả hai cổng, giờ mình đo được khoảng 95 Gbit/s, đủ gần với line rate cho những gì cluster này làm.
lshwvẫn khăng khăng 40Gbit/s và mình đã ngừng để ý tới nó.