linux rhel6.2 intel dpdk FAQ 常见问题和解决办法

声明:此文档只做学习交流使用,请勿用作其他商业用途

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的知识,一点头绪都没有,就说说我遇到的问题吧和简单的解决方法;


1、搭建系统是运行不起来,

首先你的机器上要有intel的网卡1G的或10G的;比方82576千兆网卡;网卡还要有网线连接到路由器上,这样在运行l2fwd测试程序时你才能看到 link up 的状态;

DPDK使用应用层的网卡驱动,在启动时将原始网卡的驱动unbind,例如你的intel网卡是  eth2 eth3 ,当你运行l2fwd后你就用ifconfig 看不到这两个网卡了;如果有兴趣可以了解一下 linux uio 驱动相关知识;


2、 l2fwd 测试程序没有数据包大转发;

如果运行起l2fwd测试程序,却没有数据转发,显示统计数据是0 ,这时看看你内核消息中是否提示  dma  fault  ,或 dmar fault  之类的错误消息,用dmesg  查看;

如果有说明你的intel_iommu 打开了,可以试着在 /etc/grub.conf 中往内核传参数时 将  intel_iommu=off  传进去,每次启动时不启动  intel_iommu 

也许你的BIOS中的VT-D选项打开了,这时硬件虚拟化的选项,似乎与intel_iommu 选项有冲突;


3、用pktgen发送大量的数据包测试;

用内核的这个pktgen这个模块去发送大量的数据,我目前是这样测试的,但发现测试效果不佳,没有精确的测算出l2fwd的吞吐率;l2fwd只是显示了转发了多少包,但没有进行有效的计算,或许我对这不太懂吧;


4、hugepage启动时错误;

intel-dpdk-getting-started-guide.pdf 这个文件中提到,kernel >= 2.6.33 (base kernel, with no patches applied) ,当大于这个内核应该就支持hugepages了;

还是换个高点版本的内核;我的测试目前用的kernel 3.0以上的;而且我的系统用的rhel6.2 的,我其他文章中有 rhel6.3和rhel6.4版本的系统下载地址;


5、dpdk 的下载地址

用git 下载;

Read-only access:

git clone git://dpdk.org/dpdk

Or if git is blocked in your network:

git clone http://dpdk.org/git/dpdk


直接从intel官网下载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这个版本管理工具;

对于其他的分支,采用类似的命令就行了;

6、在编译第一次编译dpdk时 kzalloc 错误;

 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);

7、rhel6.2  kernel 版本2.6.35.7 上发包失败

在RHEL6.2 的系统,更换kernel 版本为2.6.35.7的时候,运行l2fwd程序时,执行发包,发包失败, 将kernel更换到  3.0.36后成功,建议将系统内核升级的到更高版本;


8、intel dpdk支持哪些网卡

可以查看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


你可能感兴趣的:(Intel,study,dpdk)