使用dpdk测试平台转发性能

本文详述了使用Intel Skylake微处理器架构进行DPDK测试的过程,包括一个口自收自发、两个口互相转发和四个口互相转发的测试场景,探讨了性能瓶颈、CPU核分配以及网卡通道宽度对转发性能的影响。测试结果显示,在某些配置下,小包转发未能达到线速,可能存在的优化选项未设置正确。

引言

Intel新的SKYLAKE微处理架构自15年发布至今,已经相对成熟可以进入商用阶段,最近很多供货商也都在积极推广;公司之前用的主要都是Sandy bridge架构,18年据说也要停产了,所以需要考虑升级相关事宜。从供货商那边选了两款样机,准备详细测试下网络性能,是否有针对之前架构有性能提升,及提升效能能到多少。

本文主要记录下测试方法,以及测试过程中遇到的问题和解决步骤,具体的测试对比结果只在内部开放,请谅解。

理论知识

Intel Skylake是英特尔第六代微处理器架构,采用14纳米制程,是Intel Haswell微架构及其制程改进版Intel Broadwell微架构的继任者, 提供更高的CPU和GPU性能并有效减少电源消耗。
主要特性包括:

  • 14纳米制程,6th Gen processor
  • 同时支持DDR3L和DDR4-SDRAM两种内存规格,最高支持64GB;
  • PCIE支持3.0,速度最高支持8GT/s;
  • 去掉了Haswell引入的FIVR,使用分离的PCH,DMI3.0

测试拓扑及环境准备

项目 描述
操作系统 linux,内核2.6.X (影响不大)
CPU Intel® Core™ i7-6700 CPU @ 3.40GHz
内存 32GB
网卡芯片 intel x710,4口10G
dpdk版本 dpdk-16.04
测试程序 l2fwd,l3fwd
测试套件 Spirent RFC 2544套件

使用dpdk sample程序前需要做一些初始化动作,加载对应的module、驱动,配置对应的大页内存等,写了个初始化脚本如下:

#!/bin/bash
mount -t hugetlbfs nodev /mnt/huge
#set hugepage memory
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

#add kernel module
modprobe uio
insmod /root/dpdk-16.04/x86_64-native-linuxapp-gcc/kmod/igb_uio.ko

#down interfaces to disable routes
#ifconfig eth0 down

#display netcard driver before bind
/root/dpdk-16.04/tools/dpdk_nic_bind.py -s

#bind driver
/root/dpdk-16.04/tools/dpdk_nic_bind.py -b igb_uio 0000:01:00.0
/root/dpdk-16.04/tools/dpdk_nic_bind.py -b igb_uio 0000:01:00.1
/root/dpdk-16.04/tools/dpdk_nic_bind.py -b igb_uio 0000:01:00.2
/root/dpdk-16.04/tools/dpdk_nic_bind.py -b igb_uio 0000:01:00.3

#display netcard driver after bind
/root/dpdk-16.04/tools/dpdk_nic_bind.py -s

具体的测试拓扑如下:
测试拓扑

测试过程及问题解决

由于dpdk的sample运行时需要手动绑定端口和CPU核的关系,所以在运行前最好能了解当前的核分布情况:

root>python cpu_layout.py 
==
### 使用DPDK框架测试网卡性能 #### 测试环境准备 为了使用DPDK进行网卡性能测试,需先安装并配置好DPDK开发环境。确保已正确加载网卡驱动至用户空间,并完成基本的EAL(Environment Abstraction Layer)初始化[^1]。 ```bash modprobe uio_pci_generic dpdk-devbind.py --status ``` 通过上述命令确认网卡已被绑定到`uio_pci_generic`模块下,这一步骤对于后续操作至关重要。 #### 编写测试程序 编写简单的发送接收循环来评估网络接口的数据吞吐量和延迟特性。下面是一个基于L2转发逻辑实现的例子: ```c #include <rte_ethdev.h> #include <rte_mbuf.h> #define RX_RING_SIZE 1024 #define TX_RING_SIZE 1024 #define NUM_MBUFS 8191 #define MBUF_CACHE_SIZE 250 static const struct rte_eth_conf port_conf_default = { .rxmode = { .max_rx_pkt_len = ETHER_MAX_LEN } }; int main(int argc, char **argv) { int ret; unsigned nb_ports; /* 初始化 EAL */ ret = rte_eal_init(argc, argv); if (ret < 0) rte_exit(EXIT_FAILURE, "Error with EAL initialization\n"); nb_ports = rte_eth_dev_count_avail(); if (nb_ports == 0) rte_exit(EXIT_FAILURE, "No Ethernet ports found!\n"); // 配置端口... while(1){ // 发送包处理... // 接收包处理... usleep(1); // 控制CPU占用率 } return 0; } ``` 此代码片段展示了如何设置RX/TX队列大小以及缓冲区参数等基础配置项。实际应用中还需加入具体的报文构造、传输及统计功能。 #### 性能指标收集 利用内置工具如`testpmd`可以方便快捷地获取详细的流量统计数据。启动时指定必要的选项以适应特定场景需求: ```bash ./build/app/testpmd -l 0-3 -n 4 \ --eth-peer=0,<peer_mac> \ --total-num-mbufs=NUM_MBUF \ --txq=<num_queues> --rxq=<num_queues> ``` 这里设置了核心数范围(-l),内存通道数目(-n),并通过一系列参数调整工作模式与连接属性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值