DPDK-Writing Efficient Code

DPDK的编程规范,用来指导如何写高性能程序,觉得挺有意思的,所以翻译过来。

内存

Memory Copy

不要在数据面上使用libc函数,例如memcpy和strcpy等,推荐用rte_memcpy这样的优化实现,实际上就是SIMD的版本。
为了使用SIMD,需要保证地址不是虚拟地址,例如malloc等产生的是虚拟地址,那么在物理地址上可能是分散的,就做不了SIMD优化。

Memory Allocation

避免使用malloc等在堆上分配内存,毕竟维护堆还是比较麻烦的(CSAPP的Data Lab令我记忆犹新),并且也不容易做parallel allocation(【Q】这是啥)。
更为推荐的做法是对固定大小的对象构建内存池,例如librte_mempool/rte_malloc的实现。在这样的实现中需要考虑内存对齐,无锁访问,NUMA感知,批量读写,每个核心的Cache。

对同一内存的并发访问

NUMA

Distribution Across Memory Channels

各个核心之间的通信

PMD

锁和原子操作

Reference

  1. https://doc.dpdk.org/guides/prog_guide/env_abstraction_layer.html
  2. https://github.com/DPDK/dpdk/blob/main/lib/eal/x86/include/rte_memcpy.h
    rte_memcpy的源码