dpdk代码总体思路

1.用户空间轮询

减少中断带来开销;

减少系统调用带来开销;

零拷贝减少内存拷贝的时间;

轮询 Polling,busy looping 提供了I/O批量处理的可能性;

避免中断性能瓶颈是DPDK提升数据包处理速度的关键之一;

2.多核CPU性能优化

RSS硬件队列;

CPU独占:独占CPU资源,减少调度影响,提高系统性能;

CPU绑定:减少CPU上下文切换,提高系统性能;

中断亲和 : 中断负载均衡,减轻其他CPU负担,提高系统性能;

进程亲和:减少CPU上下文切换,提高系统性能;

中断隔离:减少中断对CPU调度影响,提高系统性能;

Per CPU:Per-CPU是基于空间换时间的方法, 让每个CPU都有自己的私有数据段(放在L1中),并将一些变量私有化到 每个CPU的私有数据段中. 单个CPU在访问自己的私有数据段时, 不需要考虑其他CPU之间的竞争问题,也不存在同步的问题.  注意只有在该变量在各个CPU上逻辑独立时才可使用;
  1. 锁优化

    无锁数据结构,将并发最大化;

    Per-CPU设计,尽量避免资源竞争;

    采用RCU机制,读写共享数据可以无锁并行;

    深入理解RCU|核心原理
    

    spinlock,采用非阻塞锁,防止上下文切换导致cache miss;

    采用CAS原子操作(Compare and Swap)进行无锁设计;

4.批量处理

轮询机制允许一次接收或发送多个报文;

批量处理分摊的接收或发送操作本身的开销;

绝大部分报文需要做相同或相似的计算处理,意味着相同的指令会被反复地执行,报文的批量计算分摊了函数调用的上下文切换,堆栈的初始化等等开销,同时大大减少了l1i cache miss

对于某一个函数,l1icache miss 仅仅发生在第一个报文被处理的时刻

批量计算提供了更好的代码优化可能性(数据预取,多重循环等)

5.Cache优化

CPU的速度远远大于RAM的速度

程序在运行时具有局部性规律

    时间局部性,很快还会访问

    空间局部性,相邻也会访问

不同级别cache速度差异 L1 > L2 > L3

减少Cache Miss是提升性能的关键

Cache 层次化结构


iCacheMiss 常常被忽略
更优的代码,编译器优化选项
更小的代码尺寸
更好的代码布局- 分支预测

Cache一致性问题

原则是避免多个核访问同一个内存地址或数据结构

在数据结构上,每个核都有独立的数据结构

多个核访问同一个网卡:每个核都创建单独的接收队列和发送队列
  1. 代码优化技巧

    Cache Line 对齐,减少dCache miss, 避免伪共享;

    数据预取,减少dCache miss, prefetch 指令;

    分支预测,优化代码布局, 提高CPU流水线效率;‍‍‍‍‍‍

    函数内联,减少函数调用开销;

    CPU扩展指令集SIMD:sse,avx,减少指令数量,最大化的利用一级缓存访存的带宽;

    多重循环处理报文,更好地优化CPU流水线;

    编译器优化;

posted @ 2023-02-24 10:05  codestacklinuxer  阅读(84)  评论(0编辑  收藏  举报