首页 > 其他 > 详细

DPDK编程指导——编写高效代码(翻译)

时间:2015-12-04 20:28:46      阅读:737      评论:0      收藏:0      [点我收藏+]


34 writing efficient code 编写有效的代码
34.1 Memory 内存

34.1.1 Memory Copy: Do not Use libc in the Data Plane 内存拷贝:不要再数据面使用lic

数据面数据操作使用rte_memcpy()

34.1.2 Memory Allocation 内存申请

数据面动态分配内存使用rte_malloc()

34.1.3 Concurrent Access to the Same Memory Area 并发访问同一内存区域

多核对同一内存区域的读写会产生很多数据缓存miss,性能消耗非常高。可以使用每核变量,例如,在统计的时候。
·使用RTE_PER_LCORE
·使用表结构(每个核一个,即每核的),这种情况,每个结构必须是cache-aligned(缓存对齐)
读为主的变量可以被多核共享,而没有性能损耗,如果没有读写变量在同一个cache line。

34.1.4 NUMA 非统一内存访问

访问本地内存,访问远地内存慢。
memzone、ring、rte_malloc 和 mempool 提供了在指定的socket上创建池的接口。

34.1.5 Distribution Across Memory Channels 分散访问内存通道

34.2 Communication Between lcores 核间通信

建议使用DPDK的ring,无锁环形队列。
支持批量bulk和突发burst访问。

34.3 PMD Driver

PMD可以工作在批量bulk/突发burst模式。
PCI设备通过DMA写入系统存储时,如果写操作在完整的cache line上,而非部分cache line,那消耗很少。PMD中的代码,已采取行动避免部分写入。

34.3.1 Lower Packet Latency 低数据包延迟

传统上,吞吐和延迟间存在一个权衡。提高吞吐,导致延迟增大;相反降低延迟,导致吞吐变低。

为了实现更高的吞吐,DPDK通过批量处理,来聚合单独处理每个包的消耗。

数据包不会被发送,直到tail指针被网卡相应的发送队列更新。

为了始终保持低延迟,即使在高负载情况下,应用程序开发者也应该避免批量处理。把burst值调整为1,这样可以保证一次只处理一个包,但是会降低吞吐。

34.4 Locks and Atomic Operations 锁和原子操作

原子操作意味着在指令之前暗含着lock前缀,这会引起处理器的LOCK信号被断言在执行后续指令期间。这在多核环境下对性能有很大的影响。通过在数据平面避免锁机制,让性能得到提升。使用每核变量,使用RCU代替rwlock。

34.5 Coding Considerations 编码注意事项

34.5.1 Inline Functions 内联函数

使用 static inline ,小的函数可以在头文件中声明为静态内联。

34.5.2 Branch Prediction 分支预测

使用 likely()、unlikely()

34.6 Setting the Target CPU Type 设置目标CPU类型

编译优化 -O3

35 PROFILE YOUR APPLICATION 分析应用程序

英特尔处理器提供的性能计数器来监控事件。由英特尔提供的一些工具可以用来分析和基准测试应用程序。请参阅从英特尔按VTune性能分析器必备出版物以获取更多信息。
对于DPDK的应用程序,这可以在Linux应用程序只的环境中进行。

应通过事件计数器进行监控的主要情况是:
·Cache misses 高速缓存未命中
·Branch mis-predicts 分支误预测
·DTLB misses
·Long latency instructions and exceptions 长延迟指令和异常

请参阅英特尔性能分析指南,了解应用程序分析的详细信息。

 

DPDK编程指导——编写高效代码(翻译)

原文:http://www.cnblogs.com/yilipika/p/5019958.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!