2023年C/C++高性能技术知识大整理(进阶到大神级别)

简介: 2023年C/C++高性能技术知识大整理(进阶到大神级别)

DPDK简介

2008年,DPDK由英特尔公司的网络通信部门提出,主要是针对基于Intel的处理器和网卡开发。正如其全称(Data Plane Development Kit,数据平面开发套件),DPDK提供丰富、完整的框架,让CPU快速实现数据平面应用的数据包处理,高效完成网络转发等工作。

说到这里,有必要解释一下数据平面的概念。在通信框架中,数据传输和连接管理通常被拆分为多个独立的操作,这些操作被称为“平面”,平面包括管理平面、数据平面、控制平面。在传统网络,这些平面都在路由器和交换机的固件中实现,管理平面负责为网络堆栈各个层级和网络系统的其他部分提供管理、监控和配置服务;控制平面决定流量的传输路径;数据平面又称为用户平面,承载用户流量,并负责接口间的数据包转发。

工作环境

DPDK的环境抽象层向应用与函数库隐藏了底层环境的细节,因而能扩展到任何处理器上使用。就操作系统来说,它提供了对Linux和FreeBSD的支持。

工作原理

DPDK使用了轮询(polling)而不是中断来处理数据包。在收到数据包时,经DPDK重载的网卡驱动不会通过中断通知CPU,而是直接将数据包存入内存,交付应用层软件通过DPDK提供的接口来直接处理,这样节省了大量的CPU中断时间和内存拷贝时间。

还不熟悉的朋友,这里可以先领取一份dpdk新手学习资料包(入坑不亏):

640.png

本文介绍下DPDK进阶到高性能专家的学习路线,整个学习路线,直接对标DPDK资深架构师岗位,知识点包括dpdk、储存、网关开发、网络协议栈、网络安全、TRex、vpp、OVS、DDos、虚拟化技术等等 。其次你把整个内容,全部消化,是完全可以胜任任何DPDK资深架构师岗位招聘,DPDK开发招聘。

DPDK高性能专家

1.DPDK网络专栏

(1)dpdk基础知识

  • 1.多队列网卡,vmxnet/e1000
  • 2.igb_ uio与vfio模块
  • 3.kni模块
  • 4.hugepage的理解
  • 5.零拷贝
  • 6.dpdk与netmap区别
  • 7.dpdk的工作环境

(2)网络协议栈

  • 1.dpdk-arp
  • 2.netsh静态arp表设置
  • 3.dpdk-icmp
  • 4.udp协议格式分析
  • 5.udp协议sendto, recvfrom实现
  • 6.dpdk-ip
  • 7.dpdk-tcp
  • 8.tcp协议栈bind,listen, accept实现
  • 9.tcp协议栈recv, send, close的实现
  • 10.tcp三次握手实现
  • 11.tcp四次挥手实现
  • 12.tcp acknum与seqnum的确认机制实现
  • 13.tcp的并发连接设计
  • 14.epoll并发的实现
  • 15.tcp协议栈与epoll之间的回调实现

(3)dpdk组件项目

  • 1.dpdk-ac
  • 2.dpdk-kni
  • 3./dev/ kni的原理分析
  • 4.kni_ dev的流程
  • 5.kni的t缓冲区,rx缓冲区
  • 6.kni的用户空间与内核空间映射
  • 7.mbuf如何转化为kernel的sk_ buff
  • 8.dpdk- timer
  • 9.bpftrace的使用
  • 10.dpdk- bpf源码流程

(4)dpdk经典项目

  • 1.dpdk- dns
  • 2.dpdk- gateway
  • 3.dpdk-ddos熵计算源码
  • 4.ddos attach检测精确度调试
  • 5.ddos attach测试T具hping3
  • 6.布谷鸟hash原理与使用

2.储存技术专栏

(1)高效磁盘io读写spdk(C)

  • 1.存储框架spdk,为技术栈打开扇存储的大门
  • 2.spdk运行环境与vhost
  • 3.NVMe与PCl的关系
  • 4.手把手实现spdk_ server
  • 5.nvme与pcie以及手写nvme读写操作
  • 6.bdev与blob之间的关系
  • 7.实现blob异步读写
  • 8.blobstore的读写操作实现与rpc的关系
  • 9.fio性能测试性能对比libaio,io_ uring,psync
  • 10.fio plugin工作流程
  • 11.fio plugin开发

(2)spdk文件系统的实现

  • 1.文件系统功能拆解
  • 2.spdk_ env_ init与spdk_ app init的差别
  • 3.spdk_ _thread_ poll实现rpc回调
  • 4.fs_ operations结构体定义
  • 5.file_ operations结构体定义
  • 6.dir_ operations结构体定义
  • 7.syscall的hook实现
  • http://8.io内存管理
  • 9.基数树对文件系统内存管理
  • 10.spdk_ blob的open,read,write,close
  • 11.测试用例与调试入口函数

(3)spdk kv存储的实现

  • 1.KV存储拆解Set, Get, Mod, Del
  • 2.app/.a库/so库对于kv存储的选择
  • 3.bdev与blob对于kv存储的选择
  • 4.kv service启动blob资源操作
  • 5.kv service关闭blob资源回收
  • 6.kv service接口set,get,modify,delete
  • 7.kv遍历与查找实现
  • 8.page存储chunk的管理
  • 9.pagechunk的get与put
  • 10.page单查找与多页查找
  • 11.btree, artree, hashmap,radixtree, rbtree之间的选择
  • 12.slab的实现
  • 13.slab分配slot与释放slot
  • 14.为kv加上conf文件
  • 15.测试用例与性能测试

3.安全与网关开发专栏

(1)可扩展的矢量数据包处理框架vpp(c/c++)

  • 1.vpp命令详解
  • 2.mac/ip转发plugin
  • 3.load_ balance plugin
  • 4.flowtable plugin
  • 5.vpp源码之间的差异
  • 6.多网卡数据接收与转发
  • 7.解决plugin编译加载
  • 8.vpp启动load so的流程
  • 9.vpp的结构体vlib_ _main实现分析
  • 10.vpp的结构体vnet_ main
  • 11.vector的操作实现
  • 12.vpp vcl库与LD_ PRELOAD实现分析
  • 13.vcl原理讲解
  • 14.vcl tcpserver实现原理
  • 15.vcl tcpclient实现原理
  • 16.vcl与iperf3的客户端与服务器
  • 17.vcl与nginx的wrk性能测试
  • 18.vcl与haproxy的性能测试
  • 19.vpp 1801版本与vpp 2206版本
  • 20.vpp httpserver的实现源码
  • 21.vpp plugin quic源码分析
  • 22.vpp plugin hs_ app的源码
  • 23.vpp plugin rdma的实现分析
  • 24.vpp plugin loadbalance
  • 25.vpp plugin nat的源码分析
  • 26.vpp host-stack tcp协议实现
  • 27.vpp plugin的测试用例实现

(2)golang的网络开发框架nff-go(golang)

  • 1.nff-go实现的技术原理
  • 2.nff-go/low.h实现分析
  • 3.nff- go数据接收的实现
  • 4.nff-go数据发送的实现
  • 5.ipsec协议解析与strongswan的ipsec
  • 6.nff go的缺陷与不足

4.虚拟化与云原生专栏

(1)DPDK的虚拟交换机框架OvS

  • 1.ovs编译安装,ovs核心组件内容
  • 2.ovs-vswitchd的工作原理
  • 3.ovs-vswitchd与dpdk的关系
  • 4.ovs-vsctl的网桥,网口操作
  • 5.qemu-system-x86_ 64构建多子网
  • 6.ovs与qemu数据流分发
  • 7.ovs搭建docker跨主机通信
  • 8.ovsdb server与ovsdb协议
  • 9.json-rpc为控制面提供开发
  • 10.ovs-tcpdump/ovs-l3ping
  • 11.OvS 4种数据路径
  • 12.VXL AN数据协议
  • 13.ovs流量统计

(2)高性能4层负载均衡器DPVS

  • 1.dpvs的技术组件与功能边界
  • 2.lvs+keepalived配置高可用server
  • 3.dpvs与|lvs+ keepalived的关系
  • 4.dpvs.conf的配置文件
  • 5.dpvs的FNat/NAT/SNAT模式
  • 6.dpvs的DR模式
  • 7.dpvs的tun模式
  • 8.通过quagga配置ospf
  • 9.dpvs的tc流控操作与源码实现
  • 10.dpvs代码架构分析
  • 11.dpvs测试用例ipset, tc,mempool

5.测试工具专栏

(1)perf3

  • 1.vpp vcl的perf3接口hook
  • 2.perf3测网络带宽
  • 3.tcp吞吐量测试
  • 4.udp丢包与延迟测试
  • 5.json测试结果输出

(2)TRex

  • 1.TRex的运行原理
  • 2.TRex与dpdk
  • 3.构建TRex测试系统
  • 4.t-rex -64- debug gdb调试
  • 5.bg-sim- 64模拟单元测试
  • 6.YAML文件编写
  • 7.流编排与自动化框架
  • 8.报文变量设置

(3)dpdk-pktgen

  • 1.pktgen命令讲解
  • 2.default.cfg配置文件分析
  • 3.120M bits/s的转发速率

(4)fio

  • 1.ioengine的实现
  • 2.ioengine_ ops的分析
  • 3.iodepth的分析
  • 4.spdk_ nvme的fio分析
  • 5.spdk_ bdev的fio分析
  • 6.spdk_ blob的ioengine实现
  • 7.psync,io_ uring, libaio性能对比

6.性能测试专栏

(1)性能指标

  • 1.吞吐量bps
  • 2.拆链/建链pps
  • 3.并发
  • 4.最大时延
  • 5.最小时延
  • 6.平均时延
  • 7.负载
  • 8.包速fps
  • 9.丢包率

(2)测试方法

  • 1.测试用例
  • 2.vpp sandbox
  • 3.perf3灌包
  • 4.rfc2544

适学人群

  1. 工作中技术没有挑战,工作中接触不到新技术的在职工程师
  2. 从事嵌入式开发对网络存储底层感兴趣在职工程师
  3. 自己研究学习速度较慢,不能系统构建知识体系的开发人员
  4. 从事网络存储安全的工程师,想深入了解底层技术原理

课程目标岗位

  • 高级网络开发工程师
  • DPDK开发工程师
  • 云基础开发工程师
  • NFV开发工程师
  • 高性能优化工程师
  • 云产品研发工程师
  • SDN开发工程师

学习成果检验

640.png

640.png

640.png

640.png

系统学习课程咨询,扫码添加小雯老师(备注AAA领取专属优惠券。

DPDK技术特点

传统的数据包捕获瓶颈往往在于Linux Kernel,数据流需要经过Linux Kernel,就会带来Kernel Spcae和User Space数据拷贝的消耗;系统调用的消耗;中断处理的消耗等。

DPDK针对Linux Kernel传统的数据包捕获模式的问题,进行了一定程度的优化。DPDK的优化可以概括为:

  • UIO+mmap 实现零拷贝(zero copy)
  • UIO+PMD 减少中断和CPU上下文切换
  • HugePages 减少TLB miss
  • 其他代码优化

内核弊端:

  • 1、中断处理:当网络中大量数据包到来时,会频繁产生中断请求,频繁的中断会产生较高的性能开销、并造成上下文的切换产生时延。
  • 2、内存拷贝:网络数据包到来时,网卡通过 DMA 等拷贝到内核缓冲区,内核协议栈再从内核空间拷贝到用户态空间,在 Linux 内核协议栈中,这个耗时操作甚至占到了数据包整个处理流程的 57.1%。
  • 3、局部性失效:目前主流处理器都是多个CPU核心的,这意味着一个数据包的处理可能跨多个 CPU 核心。比如:一个数据包可能中断在 cpu0,内核态处理在 cpu1,用户态处理在 cpu2,这样跨多个核心,容易造成 CPU 缓存失效,造成局部性失效。

DPDK优点:

从前面的分析得知目前网络IO的实现的方式中,内核是导致性能瓶颈的原因所在,要解决性能问题就需要绕过内核,直接在用户态收发包。

  • 1、内核bypass:通过UIO(Userspace I/O)旁路数据包,实现用户态数据包收发,减少上下文切换以及内存拷贝。
  • 2、使用多核编程代替多线程编程:设置 CPU 的亲和性,将线程和 CPU 核进行一比一绑定,减少彼此之间调度切换。
  • 3、使用大页内存代替普通的内存:减少 cache-miss。
  • 4、采用无锁技术:解决资源竞争问题。

零声白金卡限时优惠活动:高性能存储spdk文件系统项目实战

  • 1、spdk blob文件系统设计分析
  • 2、文件系统引入线程与json配置解析
  • 3、文件系统四层架构设计与构建git版本管理
  • 4、从blob读写到文件系统的原语操作实现
  • 5、syscall的hook实现
  • 6、基数树对文件系统内存管理
  • 7、文件系统hook api的设计与实现
  • 8、文件系统posix api的兼容问题与文件夹设计

DPDk应用场景

dpdk 作为优秀的用户空间高性能数据包加速套件,现在已经作为一个“胶水”模块被用在多个网络数据处理方案中,用来提高性能。如下是众多的应用。

1.网络虚拟化

网络虚拟化是一种将物理网络资源虚拟化为多个逻辑网络资源的技术,它可以帮助企业节省网络设备成本,提高网络资源利用率。DPDK可以帮助网络虚拟化平台实现高性能、低延迟的数据包处理,从而提高虚拟网络的性能和可靠性。

2.云计算

云计算是一-种将计算资源虚拟化为多个逻辑计算资源的技术,它可以帮助企业节省计算资源成本,提高计算资源利用率。DPDK可以帮助云计算平台实现高性能、低延迟的数据包处理,从而提高云计算的性能和可靠性。

3.网络安全

网络安全是一种保护网络资源免受恶意攻击的技术,它可以帮助企业保护网络资源的安全性和可靠性。DPDK可以帮助网络安全平台实现高性能、低延迟的数据包处理,从而提高网络安全的性能和可靠性。

4.5G通信

5G通信是一-种新一代的移动通信技术,它可以帮助企业实现更快、更可靠的移动通信服务。DPDK 可以帮助5G通信平台实现高性能、低延迟的数据包处理,从而提高5G通信的性能和可靠性。

5.数据面(虚拟交换机)

  • OVS:Open vSwitch 是一个多核虚拟交换机平台,支持标准的管理接口和开放可扩展的可编程接口,支持第三方的控制接入。
  • VPP:是 cisco 开源的一个高性能的包处理框架,提供了交换/路由功能,在虚拟化环境中,使它可以当做一个虚拟交换机来使用。在一个类 SDN 的处理框架中,它往往充当数据面的角色。经研究表明,VPP 性能要好于 ovs+dpdk 的组合,但它更适用于NFV,适合做特定功能的网络模块。
  • Lagopus:是另一个多核虚拟交换的实现,功能和 OVS 差不多,支持多种网络协议,如 Ethernet,VLAN,QinQ,MAC-in-MAC,MPLS 和 PBB,以及隧道协议,如 GRE,VxLan 和 GTP。
  • Snabb: 是一个简单且快速的数据包处理工具箱。

6.数据面(虚拟路由器)

  • OPENCONTRAIL:一个集成了 SDN 控制器的虚拟路由器,现在多用在 OpenStack 中,结合 Neutron 为 OpenStack 提供一站式的网络支持。
  • CloudRouter:一个分布式的路由器。

7.用户空间协议栈

  • mTCP:是一个针对多核系统的高可扩展性的用户空间 TCP/IP 协议栈。
  • IwIP:针对 RAM 平台的精简版的 TCP/IP 协议栈实现。
  • Seastar:是一个开源的,基于 C++ 11/14 feature,支持高并发和低延迟的异步编程高性能库。
  • f-stack:腾讯开源的用户空间协议栈,移植于 FreeBSD协议栈,粘合了 POSIX API,上层应用(协程框架,Nginx,Redis),纯 C 编写,易上手。

DPDK的影响力

1.通信行业

通信行业正逐步迁移至虚拟化,以便在其网络环境中增强弹性、灵活性和标准化,随着时间的推移,这种趋势的发展已经变得更加多元化。SDN、NFV、DPDK、Openflow 和 Open vSwitch 都得以使用。移动网的PGW网元和宽带网络的BRAS类转发设备,对转发性能有着非常高的要求。如果用x86架构的NFV服务器取代上述设备,由于Linux内核的限制和通用I/O报文读写方式,这种基于传统Linux和虚拟化技术的转发平面万兆端口普遍仅有1 Gbit/s以内的转发能力;而目前的电信级硬件转发设备可以轻松做到64 byte小报文不分组丢失线速转发。

2.下一代防火墙

持续优化网路安全需要不断改进防火墙的实施,这将受益于DPDK并不断发展。下一代防火墙也可以是 NFV 解决方案的一部分。用于简单数据分组过滤的基本防火墙已演进多年,可以执行更加高级的应用,比如入侵检测与防御 (IPS)、网络杀毒、IPsec、SSL 和应用控制等。这些功能均位于数据平台,要求对数据流进行深度数据包检查、具备加密和压缩功能,以及执行大量数据分组内容处理。下一代防火墙在设计时运用了采用DPDK的 Wind River 网络加速平台以及QuickAssist 。DPDK 提供了相应的机制,支持通过其他高性能方法来替代 Linux 系统调用,从而避免 Linux 内核出现的常见问题。Wind River 网络加速平台能够加速 Apache 服务器 等本机 Linux 应用,并为移植在网络加速引擎上的安全应用提供更高的加速性能。

3.大数据分析

关于涉及大数据分析的使用案例,Aspera公司与英特尔公司研究了超高速数据传输解决方案,该解决方案能够在裸机和虚拟化硬件平台上帮助商用互联网连接达到可预测的超高 WAN 传输速度,包括超过往返时间为数百毫秒的网络,以及常见远距离 WAN 几个百分点的数据分组丢失率。借助DPDK,软件工程师可减少收发数据分组所需的内存副本数量。Aspera公司因此成功地将测试系统上单个流数据的传输速度提高至 37.75 Gbit/s,加上以太网帧和 IP 数据分组标头,网络利用率达到了 39 Gbit/s。通过在基于内核的虚拟机 (KVM) 管理程序上进行测试,对虚拟化平台的传输性能开始了初步研究,并实现了 16.1 Gbit/s 的初始传输速度。

4.电网

作为全球最大的电力公司,中国国家电网公司承担着向大约 11 亿人口供电的坚决任务。SGCC 依赖高性能计算集群确保电网的安全和平稳运行。伴随着中国电网规模的不断扩大,SGCC 急需增强其全数字实时仿真系统,以满足国家日益增长的电力供应需求。DPDK 是其中一项关键组件,帮助将 ADPSS 的延迟降到 50μs之内。这也是为 3,000 台发电机和 30,000 根电网线路创建大型电力系统仿真的必要条件。

最后:

给校招的小伙伴一句话:第一份工作不亚于一次高考,珍惜校招,社招的竞争是你目前想象不到的。能去大厂觉不妥协,IT行业第一份工作背景越好,起点越高,后续发展空间越好!

给那些1-3年的安于现状的伙伴一句话:

不要抱怨市场,不要安于现状,在低端,往中端领域看,在中端往高端领域看。认知以及对自身的要求,都会有所改变。

给那些担心35岁的伙伴一句话:

决定上限的不是年纪,而是技术。最后:希望学习路线对你有所帮助,希望码农的我们越来越好!

相关文章
|
19天前
|
存储 编解码 监控
C++与OpenGL结合实现的屏幕监控软件:高性能屏幕录制解决方案
使用C++和OpenGL结合,本文展示了如何创建高性能屏幕录制软件。通过OpenGL的`glReadPixels`获取屏幕图像,存储为视频文件,再利用C++的网络编程(如libcurl)将监控数据提交到网站。示例代码包括了屏幕捕获和数据上传的简单实现。
81 2
|
23天前
|
编译器 C++
【C++初阶】13. 模板进阶
【C++初阶】13. 模板进阶
25 2
|
29天前
|
算法 Linux 程序员
嵌入式工程师以及C++程序员到公司就业需要掌握那些技术?
嵌入式工程师以及C++程序员到公司就业需要掌握那些技术?
|
2月前
|
C++
二叉树进阶面试题(精华总结)【C++版本】
二叉树进阶面试题(精华总结)【C++版本】
|
2月前
|
存储 缓存 算法
高效编程:我们应该了解哪些编译器优化技术?如何做出成熟的优化行为,掌握C++编程中的编译器优化艺术。
高效编程:我们应该了解哪些编译器优化技术?如何做出成熟的优化行为,掌握C++编程中的编译器优化艺术。
92 4
|
1天前
|
消息中间件 算法 Java
C++实时通信优化技术探究
C++实时通信优化技术探究
10 3
|
2天前
|
编译器 C++
【C++进阶】引用 & 函数提高
【C++进阶】引用 & 函数提高
|
7天前
|
存储 C++
【C++进阶(九)】C++多态深度剖析
【C++进阶(九)】C++多态深度剖析
|
7天前
|
编译器 C++
【C++进阶(八)】C++继承深度剖析
【C++进阶(八)】C++继承深度剖析
|
7天前
|
编译器 C语言 C++
【C++进阶(七)】仿函数深度剖析&模板进阶讲解
【C++进阶(七)】仿函数深度剖析&模板进阶讲解