Tại sao các công cụ truyền thống thất bại ở tốc độ cao
Các công cụ Linux tiêu chuẩn như iperf3 hay netperf thường bị nghẽn rất lâu trước khi phần cứng của bạn đạt giới hạn. Những tiện ích này phụ thuộc vào network stack của nhân (kernel) Linux. Mặc dù mạnh mẽ, nhưng kernel tạo ra overhead rất lớn thông qua việc xử lý ngắt (interrupt handling) và chuyển đổi ngữ cảnh (context switching) liên tục. Khi tôi thử đẩy một liên kết 10Gbps với một luồng iperf3 duy nhất, các lõi CPU của tôi đã chạm mức sử dụng 100% trong khi throughput bị kẹt ở mức khiêm tốn 3.8Gbps.
Nếu bạn cần thẩm định một router cao cấp hoặc Next-Gen Firewall (NGFW) trước khi triển khai thực tế, bạn cần lưu lượng ở tốc độ đường truyền (line-rate). Bạn không thể để hệ điều hành làm giới hạn hiệu suất. Đó là lý do tại sao tôi chuyển sang TRex. Sau sáu tháng đo kiểm các kết nối trung tâm dữ liệu, tôi nhận thấy đây là công cụ mã nguồn mở duy nhất có khả năng tạo ra hàng triệu gói tin mỗi giây một cách ổn định mà không hề nao núng.
Lợi thế của DPDK
TRex chạy trên nền tảng Data Plane Development Kit (DPDK). Thay vì yêu cầu kernel Linux di chuyển các gói tin, TRex trực tiếp chiếm quyền điều khiển Card mạng (NIC). Nó bỏ qua hoàn toàn kernel. Sự thay đổi về kiến trúc này cho phép một máy chủ thông dụng duy nhất có thể tạo ra hàng trăm gigabit lưu lượng.
Đây là những điểm khác biệt của TRex so với các trình tạo lưu lượng thông thường:
- Khả năng mở rộng thực thụ: Nó có thể đẩy 14.88 triệu gói tin mỗi giây (pps) trên liên kết 10GbE—mức tối đa lý thuyết cho các gói tin 64-byte.
- Lưu lượng IMIX: Nó mô phỏng các mẫu “Internet Mix”, pha trộn các gói tin 64B, 594B và 1518B để phản ánh thực tế sử dụng thay vì chỉ gửi một luồng dữ liệu phẳng.
- Độ sâu giao thức: Bạn có thể kiểm tra throughput L2/L3 đơn giản hoặc mô phỏng các luồng ứng dụng L7 phức tạp như HTTPS và DNS.
Đội ngũ của tôi sử dụng các chỉ số này để tìm ra điểm chính xác mà phần cứng của firewall bắt đầu quá tải, cung cấp những dữ liệu mà các công cụ tiêu chuẩn đơn giản là không thể chạm tới.
Lựa chọn và chuẩn bị phần cứng
Khả năng tương thích phần cứng là sai lầm phổ biến nhất. Vì TRex dựa vào DPDK, NIC của bạn phải được hỗ trợ. Các dòng card Intel X520, X710 và Mellanox ConnectX-5 là những tiêu chuẩn vàng trong ngành. Trong hướng dẫn này, tôi sử dụng máy chủ Ubuntu 22.04 LTS với NIC Intel X722 dual-port 10G.
Bắt đầu bằng cách cài đặt các gói phụ thuộc cơ bản và xác định địa chỉ PCI bus của bạn:
sudo apt update
sudo apt install -y python3 python3-distutils zlib1g-dev pciutils
# Xác định địa chỉ PCI của NIC
lspci | grep Ethernet
Hãy tìm các địa chỉ như 0000:03:00.0. Bạn sẽ cần chúng để ánh xạ các cổng trong file cấu hình sau này.
Cài đặt và thiết lập
TRex không sử dụng quy trình make install thông thường. Bạn tải xuống gói binary, giải nén và chạy trực tiếp. Cách tiếp cận di động này rất tuyệt vời để di chuyển công cụ giữa các dàn máy thử nghiệm khác nhau trong phòng lab.
mkdir -p /opt/trex
cd /opt/trex
wget https://trex-tgn.cisco.com/trex/release/latest
tar -xzvf latest
cd v3.0* # Truy cập vào thư mục phiên bản hiện tại
Bạn phải tạo một file /etc/trex_cfg.yaml để định nghĩa môi trường của mình. File này ánh xạ các cổng vật lý trên NIC tới phần mềm TRex. Đây là cấu hình cơ bản cho thiết lập hai cổng:
- version: 2
interfaces: ["03:00.0", "03:00.1"]
port_info:
- dest_mac: "00:11:22:33:44:55" # MAC của Port 1 trên Router
src_mac: "00:55:44:33:22:11" # MAC của Port 1 trên TRex
- dest_mac: "00:11:22:33:44:66" # MAC của Port 2 trên Router
src_mac: "00:55:44:33:22:22" # MAC của Port 2 trên TRex
Thực hiện bài Stress Test đầu tiên
TRex sử dụng mô hình server-client. Bạn khởi động engine trước, sau đó sử dụng console để đẩy lưu lượng.
Bước 1: Khởi động Engine
sudo ./t-rex-64 -i
Tham số -i kích hoạt chế độ tương tác. Khi các cổng đã khởi tạo xong, server sẽ ở trạng thái chờ lệnh từ bạn.
Bước 2: Kết nối Console
Mở một terminal thứ hai và khởi chạy bộ điều khiển:
./trex-console
Bước 3: Làm tràn băng thông link 10G
Bây giờ, hãy tải một profile. Chúng ta sẽ sử dụng profile IMIX tiêu chuẩn để đẩy 10Gbps lưu lượng qua cổng 0:
start -f stl/imix.py -p 0 -m 10gbps
Gõ tui để mở giao diện người dùng văn bản. Theo dõi kỹ opackets (đầu ra) và ipackets (đầu vào). Nếu đầu ra là 10Gbps nhưng đầu vào chỉ là 8Gbps, bạn vừa phát hiện ra rằng thiết bị đang thử nghiệm (DUT) bị rớt 20% lưu lượng.
Phân tích đồng thời Throughput và Latency
Throughput cao sẽ vô ích nếu latency tăng vọt đến mức không thể sử dụng. Hầu hết các router đều gặp tình trạng jitter (biến động trễ) rất lâu trước khi chúng bắt đầu làm rơi gói tin. TRex có thể đo lường điều này bằng cách xen kẽ lưu lượng tốc độ cao với các gói thăm dò latency chuyên dụng.
Để kiểm tra điều này, hãy chạy benchmark ở mức tải 90% với tính năng theo dõi latency được bật:
start -f stl/bench.py -p 0 -m 90% --latency
Gần đây tôi đã sử dụng cách này để khắc phục sự cố cho một core switch. Trong khi nó xử lý 9Gbps một cách dễ dàng, latency đã nhảy từ 15μs lên 450μs ở mức tải đó. Điều này tiết lộ vấn đề bufferbloat mà một bài kiểm tra throughput đơn thuần sẽ bỏ lỡ.
Những bài học kinh nghiệm từ phòng lab
Trong năm qua, tôi đã học được rằng môi trường quan trọng không kém gì phần mềm. Dưới đây là ba quy tắc nằm lòng:
- Quy tắc Back-to-Back: Luôn kết nối trực tiếp các cổng TRex với nhau trước. Nếu bạn không thể đạt 10Gbps trong kết nối loopback, thì vấn đề nằm ở máy chủ hoặc cài đặt PCI của bạn, chứ không phải ở router.
- Tôn trọng NUMA: Trên các máy chủ có nhiều socket, hãy đảm bảo NIC và các tiến trình TRex nằm trên cùng một socket CPU. Việc đi qua bus QPI/UPI có thể làm giảm hiệu suất của bạn tới 30%.
- Theo dõi CPS: Khi kiểm tra các stateful firewall, hãy tập trung vào Connections Per Second (CPS). Nhiều firewall bị treo khi cố gắng thiết lập 50.000 phiên mới mỗi giây, ngay cả khi tổng băng thông vẫn còn thấp.
Lời kết
Việc chuyển từ các công cụ cơ bản sang TRex đã thay đổi cách chúng tôi lập kế hoạch cho dung lượng mạng. Chúng tôi không còn phải đoán xem liệu firewall có thể chịu được mức tải đỉnh hay không; chúng tôi có dữ liệu xác thực để chứng minh điều đó. Mặc dù việc thiết lập DPDK đòi hỏi một chút thời gian tìm hiểu, nhưng kết quả mang lại là cấp độ chuyên nghiệp. Bạn đã biến một chiếc máy tính Linux tiêu chuẩn thành một trình tạo lưu lượng cao cấp mà bình thường sẽ tiêu tốn hàng chục nghìn đô la cho phần cứng chuyên dụng.

