性能调优

rte_rand()

  • 现象:使用top perf -g查看时发现__drand48_iterate()所占比例达到40%以上。
  • 分析:跟踪__drand48_iterate()跟随机数有关, 查看代码响应记录按权重比例负载时使用了rte_rand().
  • 测试:屏蔽掉rte_rand(),性能上升了100多万。

FAQ

打开DPDK工程Makefile编译详细信息?

答:
1. 打开dpdk/mk/rte.sdkroot.mk文件。

  1. 把变量Q赋为空。

    define Q to ‘@’ or not. $(Q) is used to prefix all shell commands to

    be executed silently.

    Q=

查看某个库或可执行程序的编译参数?

  1. cd dpdk/x86_64-native-linuxapp-gcc/build/
  2. 选择进入app drivers lib之一的目录

3)例如进入lib/librte_meter下
4)使用ls -a查看所有隐藏文件
5)使用cat命令将会看到如下文件内容:
- .rte_meter.o.cmd: 编译生成该.o文件的所有gcc参数。 - .rte_meter.o.d: 编译中依赖的文件 - .librte_meter.a.cmd: 链接生成目标文件的命令参数

出现这个错误: include/dpdk/rte_memcpy.h:870:2: 错误:‘_mm_storeu_si128’的第 2 个实参类型不兼容的解决办法

答:
1. 只要在自己的Makefile中增加如下两行即可。

    include $(RTE_SDK)/mk/rte.vars.mk
    include $(RTE_SDK)/mk/internal/rte.build-pre.mk

在虚拟机中跑DPDK,网卡接收不正常问题。

现象

虚拟出来的网卡只收到了少量的ARP包,并且QANS可以响应ARP请求成功,但收不到icmp与DNS包等。

调试过程

  1. 虚拟网卡虚拟出来的是intel 82540EM网卡。
  2. 查看DPDK官方支持网卡列表,支持intel 82540,但不知道与82540EM有哪些细微差别。
  3. 尝试了virtual下可配的虚拟网卡(82545em,82543gc, 82545em,virtio-net),无一完全成功。
  4. 网卡流量统计,确实只收到了少量与arp包数等同的包(一直ping了10多分钟)。
  5. 查看了KNI创建的虚拟网卡发现每次启动MAC地址都随机的变化,查看了官方文档与网上结论说有些时候网卡MAC会随机变化,但没有说具体原因情况。
  6. 使用DPDK本身提供的接口rte_eth_macaddr_get()进行读取,发现与物理网卡一致而与KNI创建出的虚拟网卡不一致。

原因

使用虚拟机创建出的KNI虚拟机网卡,每次重启后会随机变化并且与物理网卡不一致,到时ARP学习不正常。

解决办法

在KNI创建虚拟机网卡成功后,使用命令: ifconfig XX hw ether XX:XX:XX:XX:XX:XX 进行配置成物理网卡MAC即可。

出现igb_uio: Unknown symbol uio_unregister_device的解决办法?

答:
在dpdk/lib/librte_eal/linuxapp/igb_uio/Makefile中添加如下行:

KBUILD_EXTRA_SYMBOLS=/usr/src/linux-headers-`uname -r`/Module.symvers

使用vmware EXSI虚拟出来的vmnet3类型网卡不能绑定gib网卡将会系统挂掉的解决办法。

答:在vmware中换成E1000类型网卡即可正常。

在最小Ubuntu 16.04系统下要运行dpdk进程需安装文件列表。

答: 只要安装如下软件即可。

  • apt-get update
  • apt-get install openssh-server
  • apt-get install tcpdump
  • apt install gcc
  • apt install libpcap-dev
  • apt install lrzsz
  • apt install kernel-source
  • apt-get install kernel-source
  • apt-get install linux-headers-`uname -r`
  • apt install python
  • apt-get install make
  • apt install libpcap-dev
  • apt install doxygen
  • apt-get install libdbus-1-dev
  • apt-get install libdbus-glib-1-dev
  • ln -sf dbus-1.0/dbus dbus
  • apt install libssl-dev
  • apt-get install libexpat1-dev
  • apt install flex
  • apt install tree
  • apt install linux-tools-generic

在最小Ubuntu 14.04系统下要运行dpdk进程需安装文件列表。

基本按照

先参照如上Ubuntu 16.04所需的文件列表安装,如出现如下错误再逐一安装修改解决。

内核build文件找不到?

http://kernel.ubuntu.com/~kernel-ppa/mainline/ 下载对应的Headers包, 使用dpkg命令进行安装。
例如: dpkg -i linux-headers-4.10.17-041017_4.10.17-041017.201705201051_all.deb, 由于使用tcp_bbr而更新了内核版本。

gcc: 错误: unrecognized command line option ‘-fstack-protector-strong’

Ubuntu 14.04自带的gcc版本为gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4, (‘-fstack-protector-strong’ 选项是gcc4.9以后的版本才加入的,也就是说需要安装gcc4.9以后的版本才可以编译通过).
- 安装gcc 5.4版本

详见:[Ubuntu 14.04 LTS 下升级 gcc 到 gcc-4.9、gcc-5 版本](https://www.cnblogs.com/BlackStorm/p/5183490.html)

DPDK在内核4.10.17下编译不过?

需要打如下3个patch:
1. patch dpdk-dev-1-3-kni-fix-compile-error-for-Linux-4.7.patch, see to http://dpdk.org/dev/patchwork/patch/13100/ 2. patch dpdk-dev-kni-fix-build-with-kernel-4.9.patch, see to http://dpdk.org/dev/patchwork/patch/16651/ 3. patch dpdk-dev-v2-kni-fix-build-with-kernel-4.8.patch, see to http://dpdk.org/dev/patchwork/patch/15717/]

fatal error: dbus/dbus-arch-deps.h: No such file or directory

  • apt-get install libdbus-1-dev
  • apt-get install libdbus-glib-1-dev
  • ln -sf /usr/include/dbus-1.0/dbus /usr/include/dbus
  • cp usr/lib/x86_64-linux-gnu/dbus-1.0/include/dbus/dbus-arch-deps.h /usr/include/dbus-1.0/dbus
  • apt-get install bison

librte_eal.a(eal_common_options.o): undefined reference to symbol ‘dlopen@@GLIBC_2.2.5’的解决办法?

在编译的Makefile中的CFLAGS变量添加上: -Wl,–copy-dt-needed-entries
详见1: linker问题
详见2: https://segmentfault.com/a/1190000002462705

rte_meter.c:57: undefined reference to `ceil’?

编译tcpdump时链接报错,已包含与-lm了, 还是编译不过,待定。

微信扫一扫

作者:mospan
微信关注:墨斯潘園
本文出处:http://mospany.github.io/2016/09/06/dpdk-develop-notes/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。