
DPDK
文章平均质量分 60
redwingz
这个作者很懒,什么都没留下…
展开
-
DPDK memfd检测
在检测函数test_memfd_create中,使用系统调用memfd_create,参数flags指定MFD_HUGETLB(即RTE_MFD_HUGETLB),意味着在hugetlbfs文件系统中创建匿名文件。此信息在DPDK中输出,如下在DPDK函数eal_memalloc_init中,根据memfd_create函数的的执行结果,返回值为1时,表明memfd可用。参数flags还可指定要使用的hugetlbfs文件系统的页面大小,例如MFD_HUGE_2MB, MFD_HUGE_1GB等。原创 2022-10-30 22:20:00 · 485 阅读 · 0 评论 -
DPDK初始化hugepages
hugepages初始化入口函数hugepage_info_init。hugepages目录sys_dir_path指向"/sys/kernel/mm/hugepages",目前此目录下包含两个子目录,分别对应1G和2M页面大小的hugepages:遍历sys_dir_path的子目录,解析页面大小保存到全局hugepage_info数组中。检查当前页面大小的hugepage是否已经进行了mount操作,将mount目录保存到hugedir中。如果还没有执行mount,使用get_num_hugepag原创 2022-07-10 22:21:43 · 887 阅读 · 0 评论 -
DPDK下X710网卡丢包
环境 -处理器:Intel® Xeon® Gold 5122 CPU @ 3.60GHz 4核8线程DPDK: v20.05测试: 4对接口双向对打流量,报文长度1518字节。发现有接口丢包,打印出来接口的统计信息,其中rte_eth_stats->imissed字段有数值,查看获取统计的函数i40e_dev_stats_get,可见imissed由两部分组成:static inti40e_dev_stats_get(struct rte_eth_dev *dev, struct rte_原创 2020-09-10 08:15:25 · 4479 阅读 · 0 评论 -
DPDK示例l3fwd性能测试
测试环境CPU: Intel® Xeon® Gold 5122 CPU @ 3.60GHzCache: 16896 KBMemory: 16GX710 driver: i40e-2.11.29X710 expansion-rom-version: 4.53 0x80001cdf 0.0.0DPDK: dpdk-20.05BIOS设置CPU Power and Performance Policy CPU C-state Disabled原创 2020-07-27 19:19:24 · 3455 阅读 · 0 评论 -
DPDK基础库LPM
DPDK中LPM(Longest Prefix Match)的实现,使用了DIR-24-8算法的一个变种,实际上就是用空间换时间。其由一个224大小的表,和256(RTE_LPM_TBL8_NUM_GROUPS)个大小为28的表组成。前者叫做tbl24,可使用IP地址的前24位进行索引。后者叫做tbl8,可使用IP地址的后8位进行索引。理论上,tbl8表的数量应为2^24个,但是考虑的内存的消耗,DPDK默认仅设置为256,事实上长度超过24位的路由表项并不多见。LPM初始化LPM的主要配置参数就是支原创 2020-07-09 22:31:56 · 2270 阅读 · 0 评论 -
DPDK-l3fwd示例IPv6测试
测试环境操作系统: Ubuntu 20.04 LTS;处理器为: Intel® Core™ i7-4790K CPU @ 4.00GHz。网卡使用的是Intel的X710万兆网卡。DPDK版本19.02。测试拓扑: |----------------| | Ubuntu(DPDK) | | |原创 2020-07-05 20:49:26 · 1515 阅读 · 0 评论 -
测试DPDK示例程序l3fwd
测试环境操作系统: Ubuntu 20.04 LTS;处理器为: Intel® Core™ i7-4790K CPU @ 4.00GHz。网卡使用的是Intel的I210千兆网卡。DPDK版本19.02。测试拓扑: |----------------| | Ubuntu(DPDK) | | |原创 2020-07-02 22:28:00 · 3161 阅读 · 0 评论 -
DPDK在testpmd中修改队列数量
一是可以在启动testpmd时,通过命令参数txq和rxq分别制定发送和接收队列的数量。# ./build/app/testpmd -l 0-3 -n 4 -- -i --txq=8 --rxq=8 ... testpmd> show port info allDriver name: net_i40e...Current number of RX queues: 8Max possible RX queues: 192Current number of TX queues: 8原创 2020-05-28 19:45:14 · 3239 阅读 · 0 评论 -
使用DPDK应用示例l2fwd进行性能测试
系统环境,处理器为:Intel® Core™ i7-4790K CPU @ 4.00GHz。# cat /etc/issueUbuntu 20.04 LTS \n \l# # uname -aLinux flyingshark 5.4.0-31-generic #35-Ubuntu SMP Thu May 7 20:20:34 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux# BIOS需要开启VT-x、VT-d支持,并且内核启动参数增加:"iommu=pt原创 2020-05-26 20:46:55 · 6289 阅读 · 1 评论 -
OVS中DPDK pdump工具
pdump允许你监听DPDK端口并查看正在通过的流量。要使用此工具,必须在系统上安装libpcap库。此外,DPDK必须在编译时打开选项config-rte-librte-pdump=y和CONFIG_RTE_LIBRTE_PMD_PCAP=y。警告:使用如DPDK pdump的监控程序将导致性能的下降.要使用pdump,只需像往常一样启动OVS,然后导航到DPDK目录app/pdump中...原创 2019-06-22 23:23:03 · 1568 阅读 · 0 评论 -
OVS QoS流量控制
Quality of Service (QoS)使用DPDK数据路径时,可以同时应用入口和出口限制。数据路径。它们分别称为QoS和速率限制.QoS (出口策略)假设你有一个vhost-user port <vhost-user>接口传输大小为64字节的数据包流量,下面的命令将限制此接口的出口传输速率为每秒约1 000 000个数据包:$ ovs-vsctl set port ...原创 2019-06-22 23:24:52 · 3854 阅读 · 3 评论 -
OVS中DPDK虚拟设备
DPDK 虚拟设备DPDK为物理和虚拟设备提供驱动程序。物理DPDK设备通过在"dpdk-devargs"参数中指定有效的PCI地址,添加到OVS中。没有PCI地址的虚拟DPDK设备也使用"dpdk devargs"命名参数,但是格式有所不同。重要:要使用任何DPDK支持的接口,你必须确保网桥已正确地配置。更多详细信息,请参阅:doc:bridge。注意:并非所有的DPDK虚拟PMD驱动...原创 2019-06-24 09:37:34 · 1621 阅读 · 0 评论 -
OVS巨型帧配置
默认情况下,DPDK端口配置标准以太网MTU值(1500字节)。为DPDK端口启用巨型帧支持,更改接口mtu_request属性到足够大的值。例如,在添加DPDK physical port <phy> 端口时指定MTU值为9000,运行如下命令:$ ovs-vsctl add-port br0 dpdk-p0 -- set Interface dpdk-p0 type=dpdk \...原创 2019-06-23 09:52:26 · 3939 阅读 · 2 评论 -
OVS中的DPDK Ring 端口
警告:DPDK ring端口不能用于客户机通信,其存在主要是为了向后兼容。几乎所有情况下,都应当使用vhost user ports<vhost user>,其是更好的选择。DPDK数据路径提供DPDK支持的ring端口,其通过DPDK的librte-ring库实现。有关此库的详细信息,请参阅DPDK 官方文档。重要:要使用任何DPDK支持的端口,你必须确保网桥已正确地配置。更...原创 2019-06-23 22:44:51 · 719 阅读 · 0 评论 -
OVS DPDK 网桥
DPDK数据路径需要特殊配置的网桥才能使用DPDK支持的physical <phy>端口和virtual <vhost-user>端口。入门示例此示例演示如何使用为DPDP数据路径添加网桥:$ ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev这假设Open vSwitch是带有DPDK支持选项编...原创 2019-06-23 23:53:03 · 3140 阅读 · 0 评论 -
OVS DPDK 设备内存模型
在OVS DPDK中,DPDK设备内存可以两种方式之一分配,共享内存或每端口内存。以下详述两者的具体情况。共享内存默认情况下,OVS DPDK使用共享内存模型。这意味着多个端口可以共享相同的内存池mempool。例如,当添加端口时,它将具有与之关联的给定MTU和Socket ID。如果之前已经为一个具有相同MTU值和Socket ID的已有端口创建过内存池mempool,该内存池将用于这两个端...原创 2019-06-24 21:08:04 · 996 阅读 · 0 评论 -
OVS中的DPDK 物理端口
netdev数据路径允许关联DPDK支持的物理端口,以便为主机提供高性能的入口/出口流量。重要:要使用任何支持DPDK的接口,必须确保网桥已正确地配置。有关网桥的详细信息,请参阅:DPDP 网桥。Open vSwitch 2.7.0之前,端口名称需要一个dpdk前缀,从2.7.0版本开始,不在要求。快速示例此示例演示如何绑定两个dpdk端口到一个已有的网桥br0上,绑定的物理端口由硬件I...原创 2019-06-24 21:12:26 · 5120 阅读 · 0 评论 -
OVS PMD 线程
轮询模式驱动程序(Poll Mode Driver,PMD)线程负责处理DPDK数据路径上的大部分工作,并执行诸如输入端口的连续轮询等任务。一旦接收到数据包及对其进行分类,分类完成后进行处理动作。PMD线程使用接收(RX)和发送(TX)队列,通常称为rxqs和txqs。TX队列的配置自动产生,RX队列可以由用户进行配置。这可以通过以下两种方式之一实现:对于物理接口,配置通过工具ovs-ap...原创 2019-06-24 21:13:52 · 6011 阅读 · 1 评论 -
OpenStack 使用OVS的DPDK数据路径
本文作为指南,解释如何使用带有DPDK数据路径功能的OVS虚拟交换机,作为Mitaka发布版中的网络服务部分的功能。基础Open vSwitch (OVS) 在2.2版本后,开始支持Data Plane Development Kit (DPDK)数据路径,并在2.4版本后,支持DPDK提供的vhost-user虚拟接口。DPDK数据路径相较标准内核的OVS数据路径可提供低延迟,高性能,DPD...原创 2019-07-04 21:14:26 · 2582 阅读 · 0 评论 -
OVS与DPDK vHost User端口
DPDK数据路径提供DPDK支持的vHost User端口作为与客户机交互的主要方式。有关vHost User的详细信息,请参阅’qemu’在同一文件上。重要:要使用任何基于DPDK的端口,你必须确保网桥已正确配置。更多信息请参见bridge.快速示例本示例演示如何添加两个dpdkvhostuserclient端口到已有的网桥br0中:$ ovs-vsctl add-port br0 d...原创 2019-06-25 21:15:48 · 7481 阅读 · 2 评论 -
DPDK KNI示例程序
Kernel NIC Interface (KNI)是DPDK提供的控制平面解决方案,运行DPDK用户层应用与Linux内核网络协议栈交换数据。DPDK用户层应用通过使用IOCTL系统调用在Linux内核中创建KNI虚拟设备实现此功能。此IOCTL调用提供接口和DPDK的物理地址空间信息,并且地址空间被KNI内核模块重映射到内核地址空间中,KNI内核模块还将相关信息保存在虚拟设备上下文中。DPDK...原创 2019-06-17 20:31:08 · 6646 阅读 · 0 评论 -
利用DPDK的l2fwd例程创建二口交换机
l2fwd示例程序默认情况下会改变数据包的MAC地址,如下:源MAC地址替换为发送端口的MAC地址;目的MAC地址替换为02:00:00:00:00:TX_PORT_ID。static void l2fwd_mac_updating(struct rte_mbuf *m, unsigned dest_portid){ struct ether_hdr *eth; vo...原创 2019-05-08 21:15:47 · 1230 阅读 · 0 评论 -
DPDK的flow_filtering示例
主函数初始化EAL,分配存储mbuf的内存池mempool,初始化接口init_port,DPDK的此示例仅支持一个port接口运行。随后调用完成流控制的generate_ipv4_flow函数。int main(int argc, char **argv){ ret = rte_eal_init(argc, argv); nr_ports = rte_eth_dev_c...原创 2019-04-29 19:59:09 · 3457 阅读 · 0 评论 -
DPDK的示例程序Makefile
以helloworld为例,其makefile位于目录: dpdk-19.02/examples/helloworld/Makefile。 文件中真正必须的为两个变量APP和SRCS-y,前者为示例程序编译生成的目标文件名称,后者为要编译的源文件,helloworld程序仅有一个main.c文件。# binary nameAPP = helloworld# all source are...原创 2019-04-28 20:29:46 · 3285 阅读 · 0 评论 -
DPDK的hugetlb配置
前提是内核需要使能hugetlbfs配置:CONFIG_HUGETLBFS参考DPDK配置文件usertools/dpdk-setup.sh的第二步,第22和第23项分别设置hugepage的映射。---------------------------------------------------------- Step 2: Setup linuxapp environmen...原创 2019-04-22 20:33:26 · 1676 阅读 · 0 评论 -
DPDK的dpdk-devbind.py文件解释
文件dpdk-devbind.py位于DPDK代码的usertools目录下,旨在操作设备与其驱动程序的绑定关系,如下为其帮助信息中的典型使用示例,分别为设备与驱动绑定关系查询status;绑定设备驱动和解绑设备驱动:# ./dpdk-devbind.py --helpUsage:Options:Examples:---------To display current devi...原创 2019-04-17 21:40:05 · 7970 阅读 · 0 评论 -
DPDK install安装配置
在DPDK编译完成之后,默认情况下执行make install会将目标文件安装到系统的/usr/local目录下。通过查看DPDK的安装Makefile文件mk/rte.sdkinstall.mk,可知其将prefix指向了/usr/local目录。ifdef T # defaults with T= will install an almost flat staging treeexpo...原创 2019-04-26 17:47:17 · 3053 阅读 · 0 评论 -
DPDK配置裁剪
DPDK标准配置命令如下:make config T=$(TARGET)以上配置将在代码目录生成build/.config配置文件和build/rte_config.h头文件。不过,DPDK没有类似Linux内核的make menuconfig配置菜单。如果想要去掉一些不需要的模块,可在编译时,将其设置为no,如下:$ make CONFIG_RTE_KNI_KMOD=n \ ...原创 2019-04-16 20:12:12 · 1250 阅读 · 0 评论 -
使用自制的工具链编译DPDK
本文使用的工具链是根据LFS指南编译而来,路径位于系统的/opt/lfs_toolchain/bin目录下,其中gcc为x86_64-lfs-linux-gcc,编译工具的前缀为x86_64-lfs-linux-。其它工具如ar、ld等加上前缀即为自制工具链的工具名称。按照交叉编译的步骤编译DPDK。首先export工具链的目录:export PATH=$(PATH):/opt/lfs_...原创 2019-04-02 21:11:35 · 746 阅读 · 0 评论 -
DPDK创建UIO设备节点
根据DPDK的官方文档说明,其提示IGB_UIO内核驱动程序可以自动创建/dev/uioX设备,但是没有提到uio_pci_generic驱动和vfio-pci驱动的情况。由于目前项目使用的是uio_pci_generic驱动,就遇到如下问题,UIO设备没有创建:EAL: Invalid NUMA socket, default to 0EAL: probe driver: 808...原创 2019-05-06 21:52:14 · 2786 阅读 · 0 评论 -
DPDK的日志log系统代码介绍
全局日志结构变量rte_logs,可见默认的日志级别为调试级别RTE_LOG_DEBUG。/* global log structure */struct rte_logs rte_logs = { .type = ~0, .level = RTE_LOG_DEBUG, .file = NULL,};日志系统的初始化函数rte_log_init,首先是再次设置...原创 2019-05-07 17:39:05 · 4788 阅读 · 0 评论 -
DPDK ACL规则字段到tries树节点转换
示例ACL规则:@39.7.6.0/24 146.11.37.196/32 0 : 65535 514 : 614 0x6/0xFFACL库中定义了三种字段类型,如下:enum { RTE_ACL_FIELD_TYPE_MASK = 0, RTE_ACL_FIELD_TYPE_RANGE, RTE_ACL_FIELD_TYPE...原创 2019-06-04 21:29:48 · 1661 阅读 · 1 评论 -
Open vSwitch结合DPDK的使用
Open vSwitch结合DPDK的使用本文档描述Open vSwitch结合DPDK数据路径的使用。重点:要使用DPDK数据路径功能需要在OVS编译时开启DPDK支持选项。OVS与DPDK的版本对应关系可能随发布版本不同而变化。版本对应信息可参考OVS文档releases FAQ。编译指令可参考/intro/install/dpdk。接口和网桥ovs-vsctl工具可用来创建网桥和...原创 2019-06-20 20:38:10 · 3872 阅读 · 0 评论 -
DPDK内核模块KNI
DPDK Kernel NIC Interface (KNI)接口允许DPDK用户程序访问Linux控制平面。使用DPDK KNI的有点如下:相较现存的Linux TUN/TAP接口更快的速度(消除了系统调用以及copy_to_user()/copy_from_user()内存拷贝的消耗)允许标准Linux网络工具管理DPDK接口,如ethtool, ifconfig 和 tcpdum...原创 2019-06-18 19:37:23 · 5829 阅读 · 0 评论 -
DPDK ACL链表
本文简介DPDK中ACL链表的几个主要函数,以及数据结构。ACL初始化函数rte_acl_init如下,主要初始化工作是选择使用的分类算法。对于AVX2(Advanced Vector Extensions),仅当编译DPDK代码的编译器支持AVX2指令集,并且运行DPDK程序的处理器支持AVX2指令集时,才启用RTE_ACL_CLASSIFY_AVX2算法。否则,退而求其次...原创 2019-05-29 21:39:47 · 3886 阅读 · 0 评论 -
DPDK创建kni设备
DPDK的内核kni驱动程序,在初始化函数kni_init中注册kni设备的时候,使用miscdevice结构的定义kni_misc,其没有明确的指定kni设备的次设备号,使用宏定义MISC_DYNAMIC_MINOR,表示由系统自动分配。misc类型设备的主设备号固定为10(宏MISC_MAJOR)。#define KNI_DEVICE "kni"static struct miscd...原创 2019-06-06 22:37:44 · 1179 阅读 · 0 评论 -
ClassBench工具集问题修复
用于测试报文分类算法性能,以及分类设备(如TCAM)性能的工具集ClassBench,包含三个部分:预先定义的参数文件parameter_files,分类规则集生成器程序db_generator,和报文生成器程序trace_generator。目前由于db_generator在Ubuntu 17.04编译不过,并且开发者已不再维护。在进行了修改之后,将代码提交到了github之上,地址如下:...原创 2019-05-30 21:09:41 · 1070 阅读 · 4 评论 -
DPDK用户工具cpu_layout.py
其位于目录usertools下,用于显示当前系统中CPU的结构布局。首先读取当前系统支持的最大CPU数量。base_path = "/sys/devices/system/cpu"fd = open("{}/kernel_max".format(base_path))max_cpus = int(fd.read())fd.close()即读取如下的sys目录中的文件:...原创 2019-05-23 20:53:30 · 1276 阅读 · 0 评论 -
dpdk-pmdinfo.py运行问题
系统环境Ubuntu 17.04:$ cat /etc/issueUbuntu 17.04 \n \l$问题一,找不到elftools:$ ./dpdk-pmdinfo.py Traceback (most recent call last): File "./dpdk-pmdinfo.py", line 16, in <module> f...原创 2019-05-27 20:34:34 · 1940 阅读 · 0 评论 -
DPDK的RTE_INIT初始化
DPDK代码中广泛使用RTE_INIT宏进行设备驱动或者RTE模块等的初始化工作,其核心是RTE_INIT_PRIO宏,定义在文件rte_common.h中。如下可见,RTE_INIT_PRIO宏的实现,实际为一个附带GCC编译属性的函数定义。此处用到两个属性,constructor和used。其中后一个used比较简单,向GCC编译器表明此函数的有用性,即使函数没有被任何地方引用,也不要警告。c...原创 2019-02-12 17:36:39 · 2615 阅读 · 0 评论