Yêu cầu tiền đề và cài đặt thư viện
Trước khi bắt đầu quy trình biên dịch, bạn cần đảm bảo hệ thống đã cài đặt đầy đủ các công cụ phụ thuộc cần thiết cho việc xây dựng dự án DPDK và hỗ trợ gỡ lỗi.
# Cài đặt gói thư viện nén và quản lý
sudo yum install -y zlib-devel python3-pip
# Cài đặt công cụ Meson và phân tích file ELF thông qua pip
pip3 install meson pyelftools
Biên dịch mã nguồn với chế độ Debug
Sử dụng trình xây dựng Meson để tạo ra bản thực thi chứa ký hiệu gỡ lỗi (debug symbols). Hãy tránh sử dụng chế độ tối ưu hóa cao để thuận tiện cho việc theo dõi lỗi.
# Tải mã nguồn và tạo thư mục đích 'obj_debug'
meson setup obj_debug --buildtype=debug
ninja -C obj_debug
Cấu hình bộ nhớ trang lớn (Hugepages)
DPDK yêu cầu sử dụng bộ nhớ Hugepages để đạt hiệu năng cao. Thực hiện gắn điểm mount và cấp phát số lượng trang nhớ mong muốn (ví dụ 64 trang 2MB).
# Tạo và kiểm tra điểm mount
mkdir -p /dev/hugepages
mountpoint -q /dev/hugepages || mount -t hugetlbfs nodev /dev/hugepages
# Cấp phát 64 trang nhớ kích thước 2MB
echo 64 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
Xây dựng cấu trúc mạng mẫu
Môi trường kiểm thử được thiết kế dựa trên hai không gian mạng ảo độc lập kết nối với nhau qua một cặp thiết bị ảo. Dưới đây là sơ đồ mô tả luồng giao tiếp:
+-----------------------+ +-----------------------+
| Không gian Client | | Không gian Server |
| (client_ns) | | (server_ns) |
| A | | B |
| | | | | |
| vx_if_0 <-----------> vx_if_1 | vx_if_2 <-------->|
| | DPDK App | |
+-----------------------+ (Core) +-----------------------+
^ ^
| |
vx_if_3 vx_if_4
Tiến hành thiết lập các không gian tên (namespace) và kết nối veth pair tương ứng:
# Khởi tạo không gian mạng mới
sudo ip netns add client_ns
sudo ip netns add server_ns
# Tạo cặp thiết bị ảo thứ nhất và gán vào bên trái
sudo ip link add vx_if_0 type veth peer name vx_if_1
sudo ip link set vx_if_1 netns client_ns
# Tạo cặp thiết bị ảo thứ hai và gán vào bên phải
sudo ip link add vx_if_2 type veth peer name vx_if_3
sudo ip link set vx_if_3 netns server_ns
Chạy ứng dụng kiểm thử DPDK
Khởi động tool testpmd từ thư mục biên dịch, chỉ định các thiết bị ảo giả lập qua cổng net PCAP để bắt gói tin đi ra/vào.
# Tham chiếu đến đường dẫn bin trong thư mục obj_debug
./obj_debug/app/dpdk-testpmd -c 7 \
--vdev=net_pcap0,iface=vx_if_0 \
--vdev=net_pcap1,iface=vx_if_2 \
-- -i --nb-cores=2 --nb-ports=2 --total-num-mbufs=2048
Trong cửa sổ console của testpmd, bật chế độ chi tiết và bắt đầu hoạt động:
testpmd> set verbose 1
testpmd> start
Kiểm tra luồng dữ liệu
Xác nhận khả năng liên lạc giữa hai miền bằng cách gửi ICMP request từ phía Client và giám sát lưu lượng tại phía Server.
Thực hiện lệnh Ping từ không gian Client:
sudo ip netns exec client_ns ping 192.168.0.6 -c 1
Bắt gói tin trực tiếp trên giao diện đối tác tại Server:
sudo ip netns exec server_ns tcpdump -i vx_if_3 -nn
# Kết quả hiển thị ARP Request/Reply và ICMP Echo tương ứng
Thiết lập IDE VSCode cho gỡ lỗi từ xa
Danh sách file cấu hình dưới đây giúp kết nối Visual Studio Code qua SSH tới máy chủ chứa ứng dụng đang chạy. Lưu ý thay thế đường dẫn khóa SSH và địa chỉ IP phù hợp với môi trường của bạn.
Cấu hình SSH trong file ~/.ssh/config:
Host remote_dpdk_host
HostName 100.85.244.203
User root
IdentityFile "/home/user/.ssh/id_rsa_custom"
Cấu hình Debugger (.vscode/launch.json):
{
"version": "0.2.0",
"configurations": [
{
"name": "Gắn DPDK Testpmd (Remote)",
"type": "cppdbg",
"request": "attach",
"program": "${workspaceFolder}/obj_debug/app/dpdk-testpmd",
"cwd": "${workspaceFolder}",
"processId": "${command:pickRemoteProcess}",
"MIMode": "gdb",
"setupCommands": [
{
"description": "Bật hiển thị đẹp cho GDB",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"miDebuggerPath": "/usr/bin/gdb"
}
]
}