ODP/DPDK代码级性能优化总结Tips
以下过程基于ARM 64位CPU, 仅供参考
ODP是Linaro基金下面的开源框架,类似于DPDK。最近用ODP程序DEMO公司SOC性能,性能不理想,优化了一圈又一圈,发现驱动水分很大,包括ODP框架本身。中间不听Architect的建议,自作主张用DPDK+ODP来展示一下我们的多样化驱动, 找到方案,开发中发现DPDK驱动性能也不理想,自己吹的牛,含着泪也要优化完。
前提:
这里主要用64B小包简单反射仪表进来的数据,目的是确认驱动性能最优。进一步读取报文内容会导致加载额外cacheline,性能会下降一些。10G网口小包线速14.88Mpps, 对于2G CPU来说134个时钟周期,平均到每个报文的指令数是关键。
Perf性能检测工具:
如果不能用ubuntu直接安装,比如自己编译的Kernel源码,到tools/perf下make, 生产的perf就是了,复制到usr/bin下面去。
perf list 可以列出你当前cpu支持的性能参数
perf stat -p 'pidof your_app` -e task-clock,...用来检测程序的性能参数
注意-p参数附加到现有进程,可以避免看到程序启动过程的影响。
-e 中要有task-clock这样可以看到更多的%和M/s的统计参数
如果你的cache miss rate大于5%, 输出会有颜色标识
Perf在跟踪cache load miss rate和write miss rate特别有用,没有被cache到的数据访用它能明显看出差别。
高精度时钟:
千万别用系统函数来去时间评估性能,系统开销太大。rte_rdtsc() 是个很好的实现,一条汇编指令。在我的环境下对性能影响微乎其微。用全局变量分别累计batch处理中rx/rd/tx/free时间,每个局部需要统计的代码段的累加时间都除以这个总数,以%显示出来,这样一两个指令的节省都能明显看到%在变化。下面是我用到的几个宏,哪段代码怀疑有问题马上加上去
PERF_VAR xxx; //定义 全局performance counter
PERF_START(); //用在需要统计的代码段开头
PERF_COUNT(xxx); //统计某计数器
PERF_DUMP(xxx, sum); //命令行调用或者exit时打印性能百分比
注意ÿ
以下过程基于ARM 64位CPU, 仅供参考
ODP是Linaro基金下面的开源框架,类似于DPDK。最近用ODP程序DEMO公司SOC性能,性能不理想,优化了一圈又一圈,发现驱动水分很大,包括ODP框架本身。中间不听Architect的建议,自作主张用DPDK+ODP来展示一下我们的多样化驱动, 找到方案,开发中发现DPDK驱动性能也不理想,自己吹的牛,含着泪也要优化完。
前提:
这里主要用64B小包简单反射仪表进来的数据,目的是确认驱动性能最优。进一步读取报文内容会导致加载额外cacheline,性能会下降一些。10G网口小包线速14.88Mpps, 对于2G CPU来说134个时钟周期,平均到每个报文的指令数是关键。
Perf性能检测工具:
如果不能用ubuntu直接安装,比如自己编译的Kernel源码,到tools/perf下make, 生产的perf就是了,复制到usr/bin下面去。
perf list 可以列出你当前cpu支持的性能参数
perf stat -p 'pidof your_app` -e task-clock,...用来检测程序的性能参数
注意-p参数附加到现有进程,可以避免看到程序启动过程的影响。
-e 中要有task-clock这样可以看到更多的%和M/s的统计参数
如果你的cache miss rate大于5%, 输出会有颜色标识
Perf在跟踪cache load miss rate和write miss rate特别有用,没有被cache到的数据访用它能明显看出差别。
高精度时钟:
千万别用系统函数来去时间评估性能,系统开销太大。rte_rdtsc() 是个很好的实现,一条汇编指令。在我的环境下对性能影响微乎其微。用全局变量分别累计batch处理中rx/rd/tx/free时间,每个局部需要统计的代码段的累加时间都除以这个总数,以%显示出来,这样一两个指令的节省都能明显看到%在变化。下面是我用到的几个宏,哪段代码怀疑有问题马上加上去
PERF_VAR xxx; //定义 全局performance counter
PERF_START(); //用在需要统计的代码段开头
PERF_COUNT(xxx); //统计某计数器
PERF_DUMP(xxx, sum); //命令行调用或者exit时打印性能百分比
注意ÿ