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上逻辑独立时才可使用;
-
锁优化
无锁数据结构,将并发最大化;
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一致性问题
原则是避免多个核访问同一个内存地址或数据结构
在数据结构上,每个核都有独立的数据结构
多个核访问同一个网卡:每个核都创建单独的接收队列和发送队列
-
代码优化技巧
Cache Line 对齐,减少dCache miss, 避免伪共享;
数据预取,减少dCache miss, prefetch 指令;
分支预测,优化代码布局, 提高CPU流水线效率;
函数内联,减少函数调用开销;
CPU扩展指令集SIMD:sse,avx,减少指令数量,最大化的利用一级缓存访存的带宽;
多重循环处理报文,更好地优化CPU流水线;
编译器优化;
http代理服务器(3-4-7层代理)-网络事件库公共组件、内核kernel驱动 摄像头驱动 tcpip网络协议栈、netfilter、bridge 好像看过!!!!
但行好事 莫问前程
--身高体重180的胖子
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2021-02-24 内核协议栈 netfilter中tproxy新版本对比