通过dpdk例子的学习,中间遇到了很多问题,期间也向过自己的同事求教过。在这里写一下总结吧。
首先你需要去官网下载一下dpdk源码包。并且按照网上的操作步骤编译目标环境。所谓的目标环境就是dpdk的库和头文件和内核模块。这个你需要设置两个环境变量。RET_SDK,RTE_TARGET这两个环境变量。这两个环境变量是你自己创建项目获运行dpdk例子的时候。makefile中需要用到,需要查询的路径。这里我曾有很天真的想法,就是自己去创建c的项目,然后用到一部分dpdk的东西。然后自己去写一个makefile。编译不过,然后去看dpdk例子的makefile,你会发现dpdk例子中的makefile很复杂.所以基本上就只能在人家的makefile上面去改。
dpdk的优势在于他可以越过操作系统内核,接管网卡,不断的去轮询网卡,避免系统中断带来的消化,零拷贝。采用大页内存机制,减少页表未命中带来的消耗。线程—和cpu内核之间绑定。减少线程切换带来的消耗。所以在你运行dpdk的时候需要去做一些设置来支持dpdk运行。
大页内存设置:首先你需要用lscpu查看一下你的服务器是否是numa架构,非numa和numa设置大页内存方式不同。还有就是全局设置,和逐个numa设置也不同。这里如果是学习千万别上了就设置1G大页,因为默认启动是2M,如果你设置1G大页,还需要重起系统的。我就犯过错误,导致运行例子m_buf分配不了。然后就是放你的dpdk程序中能够去使用,所以需要创建/mnt/huge文件夹,并且去挂载这个文件夹。
载入用户态驱动:就是驱动可以运行在内核态也可以运行在用户态,在这里不去讨论这些,正常在操作系统中的驱动是uio.但是在dpdk中我们需要用到的驱动是igb_uio. 嵌入内核中的操作命令是modprobe igb_uio
网口绑定:需要用到dpdk的工具进行操作,操作步骤网上有很多。不过我这里遇到的问题就是,就是我用dpdk的工具设置网口绑定成功,并且用工具查询状态也没有问题,但是当运行dpdk例子的却运行失败,我在里面加一步步打印,发现rte_eth_dev_count 为0或小于我的绑定端口数。原因是当前这台机器上应该有其他程序正在用这个网口。所以如果学习和测试例子最好找一台干净的机器去操作。
网友评论