声明:此文档只做学习交流使用,请勿用作其他商业用途
author:朝阳_tony
E-mail : [email protected]
create date:2013-4-6 23:53:31 Sunday
Last Change: 2013-9-4 17:49:30 Wednesday
转载请注明出处:http://blog.csdn.net/linzhaolover
最近一直在学习intel dpdk的知识,一点头绪都没有,就说说我遇到的问题吧和简单的解决方法;
首先你的机器上要有intel的网卡1G的或10G的;比方82576千兆网卡;网卡还要有网线连接到路由器上,这样在运行l2fwd测试程序时你才能看到 link up 的状态;
DPDK使用应用层的网卡驱动,在启动时将原始网卡的驱动unbind,例如你的intel网卡是 eth2 eth3 ,当你运行l2fwd后你就用ifconfig 看不到这两个网卡了;如果有兴趣可以了解一下 linux uio 驱动相关知识;
如果运行起l2fwd测试程序,却没有数据转发,显示统计数据是0 ,这时看看你内核消息中是否提示 dma fault ,或 dmar fault 之类的错误消息,用dmesg 查看;
如果有说明你的intel_iommu 打开了,可以试着在 /etc/grub.conf 中往内核传参数时 将 intel_iommu=off 传进去,每次启动时不启动 intel_iommu
也许你的BIOS中的VT-D选项打开了,这时硬件虚拟化的选项,似乎与intel_iommu 选项有冲突;
用内核的这个pktgen这个模块去发送大量的数据,我目前是这样测试的,但发现测试效果不佳,没有精确的测算出l2fwd的吞吐率;l2fwd只是显示了转发了多少包,但没有进行有效的计算,或许我对这不太懂吧;
还是换个高点版本的内核;我的测试目前用的kernel 3.0以上的;而且我的系统用的rhel6.2 的,我其他文章中有 rhel6.3和rhel6.4版本的系统下载地址;
Read-only access:
git clone git://dpdk.org/dpdk
Or if git is blocked in your network:
git clone http://dpdk.org/git/dpdk
这有dpdk的一些文档在官网的地址;目前(2013-9-4 17:49:06)intel dpdk code 更新到了1.4.1版本,
http://www.intel.com/content/www/us/en/intelligent-systems/intel-technology/packet-processing-is-enhanced-with-software-from-intel-dpdk.html
2013-8-1 15:26:15 星期四 ,默认上面的git clone 获得的分支是1.3.1 , 我们用git 工具查看一下官网到底推送了哪些分支到远端代码库,
# git branch -r origin/1.2.3 origin/1.3.1 origin/HEAD -> origin/1.2.3 origin/intel发现远端 intel 分支,目前我们的HEAD指向的是1.2.3版本的分支,接下来我们可以轻松拷贝一份远端的不同分支到本地,采用下面的命令;
git checkout -b intel origin/intel命令大意是从远端 分支origin/intel 检出拷贝 一份 到本地,命名为 intel ;intel这个分支应该和intel的官网代码很相似;
如果还是不明白命令大意,建议你有时间学习git这个版本管理工具;
对于其他的分支,采用类似的命令就行了;
error: inlining failed in call to ‘kzalloc.clone.0’: --param max-inline-insns-single limit reached
将dpdk目录中 lib/librte_eal/linuxapp/igb_uio/igb_uio.c 下面的kzalloc 修改为 kmalloc 就好了 ,也许这个函数在我的rhel 6.2 系统中有问题;
udev = kzalloc(sizeof(struct rte_uio_pci_dev), GFP_KERNEL);
在RHEL6.2 的系统,更换kernel 版本为2.6.35.7的时候,运行l2fwd程序时,执行发包,发包失败, 将kernel更换到 3.0.36后成功,建议将系统内核升级的到更高版本;
可以查看lib/librte_eal/common/include/rte_pci_dev_ids.h 这文件,其中定有了所有dpdk目前支持的设备id;
查询自己设备的id方法,以我的机器为例;
1)、查询自己的网卡
# lspci | grep Ethernet 1a:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01) 1a:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
我的机器设备是1a:00.0 和1a:00.1
2)、查询设备id# cat /sys/bus/pci/devices/0000\:1a\:00.0/device 0x10c9其中的 ' 0000\:1a\:00.0" 是在上面用lspci命令查询到的;
拿着0x10c9这个数去rte_pci_dev_ids.h 文章中找,如果有,说明支持你的网卡;
其中写到支持设备82575EB 但实际在系统中运行不起来,它的设备id 应该是 0x10a7 , 原因是下面的宏RTE_PCI_DEV_NO_USE_I350_COPPER没有定义,可以将 这个 ifdef 和endif 这两行注释掉,再编译通过,就可以了;
/* This device is the on-board NIC on some development boards. */ #ifdef RTE_PCI_DEV_USE_82575EB_COPPER RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_INTEL, E1000_DEV_ID_82575EB_COPPER) #endif
鸣谢:
感谢 小菜_默 和我一起努力修改解决这个问题;
在此谢谢 wwwlkk 给我提的宝贵意见;
我还在学习中,希望学习intel dpdk的朋友加入我创建的dpdk qq群,一起学习dpdk;QQ群号:289784125