范桂飓
AWS Global Community Hero,EdgeGallery 开源社区架构组副主席及秘书处成员,跑步与自行车运动爱好者。
- 2016 年度十大博客之星得主
- 2021 年度十大博客之星得主
- 2022 年度博客新星评委
- 2023 年度博客之星评委
- 2024 年度博客之星评委
展开
-
软硬件融合加速技术系列文章
目录文章目录目录计算机组成原理Linux 操作系统原理处理器进程管理内存管理I/O 系统文件系统网络协议栈资源管理设备管理GPUFPGASmartNIC/DPU计算机组成原理《计算机组成原理 — 冯诺依曼体系结构》《计算机组成原理 — 基本硬件设备》《计算机组成原理 — CPU 中央处理器》《计算机组成原理 — 指令系统》《计算机组成原理 — 总线系统》《计算机组成原理 — 存储系统》《计算机组成原理 — 输入输出系统 — 存储控制器接口类型》《计算机组成原理 — 服务器》《计算机组成原创 2022-04-02 19:09:18 · 5263 阅读 · 0 评论 -
8 卡 GPU 服务器与 NVLink/NVSwitch 互联技术
NVLink 是一种点对点的高速互连技术,单条 NVLink 就是一条全双工双路信道,每条 NVLink 链路可以将 2 个 GPU 直连起来,并且每个 GPU 可以提供多条 NVLink 接口连接多个 GPU。另外,PCIe Switch 互联拓扑中的 GPU 之间可能存在 GPU0→Switch0→CPU0→CPU1→Switch1→GPU7 的通信链路,它的通信不可避免的存在一定的延迟,因而更适合用于对信号效率不敏感且追求性价比的使用场景,如:推理、云计算等领域。本文讨论的是单机 GPU 卡间互联。原创 2025-02-06 22:02:48 · 1441 阅读 · 0 评论 -
DPDK — L3 Forwarding 与 ACL 访问控制
ACL(Access Control List,访问控制列表)的本质是一种通配符匹配算法。而 ACL Rule 是一个 N-tuple,由 N 个 Fields 组成,在定义具体的 ACL Rule 之前,首先需要定义好每个 Fields 的实例。ACL Rule 的 Fields 的定义通过 rte_acl.h rte_acl_field_def 结构体来完成。原创 2023-04-10 16:44:53 · 1175 阅读 · 1 评论 -
DPDK — 数据面性能测试
带宽(Bandwidth,频带宽度)指的是网络传输介质的 “宽度”,是一个网络传输性能指标,也称为吞吐量(Throughput),单位为 bit/s(bps)。单位:CPS,数值越大性能越好。传播时延等于两台路由器之间的距离除以传播速率,即传播时延是 D/S,其中 D 是两台路由器之间的距离,S 是该链路的传播速率。延迟(Latency),通常指 RTT(Round-Trip Time,往返时间)延迟,即:E2E(端到端,包括两端和网络中间件)网络传输所需要使用的时间,单位是 ms(毫秒)。原创 2023-04-03 23:55:52 · 2008 阅读 · 1 评论 -
DPDK — RSS 多队列网卡
在多核时代,为了充分利用 Multi-CPU cores,NIC 也相应的提供了 Multi-Queue(多队列)功能,结合 NIC RSS(Receive Side Scaling,接收侧扩展)功能,可以将多个 Rx queues 通过硬中断绑定到不同的 CPU cores 上处理,以此均衡利用 CPU 资源并提高网络吞吐量。:设置 struct rte_eth_conf.rte_eth_rxmode.mq_mode = ETH_MQ_RX_RSS。原创 2023-03-21 16:18:20 · 1495 阅读 · 0 评论 -
DPDK — Pktgen 生成器
DPDK pktgen 可以生成各种协议类型和大小的数据包,例如:Ethernet、IPv4、IPv6、UDP、TCP、ICMP 等。此外,还支持各种测试模式,包括:线速测试、延迟测试、丢包测试、拥塞控制测试等。DPDK pktgen 是一个高性能的数据包生成器,基于 DPDK 开发,可以用于测试和评估网络或协议栈的性能。DPDK pktgen 通过在发送端和接收端同时进行数据包统计和分析,以此来评估网络性能和设备性能。环境中已经安装了 DPDK 18.08,并绑定了 igb_uio 网卡驱动。原创 2023-03-15 17:05:33 · 1247 阅读 · 0 评论 -
DPDK — L2 Forwarding 与网卡设备初始化流程
L2fwd 使用了 DPDK Ring Queue 来实现数据包的转发,Ring Queue 是一个多生产者多消费者队列,支持高效的数据包缓存和转发。此外,还是使用了 DPDK Memory Pool 来实现快速的内存分配和释放,可以提高数据包处理的效率。总而言之,通过 L2fwd 我们可以学习到 DPDK 的 Ring Queue、Memory Pool、Mbuf 和数据报文二层转发等知识点。原创 2023-03-15 17:04:11 · 957 阅读 · 0 评论 -
C 语言网络编程 — Linux I/O 处理流程与优化
Linux Kernel 为了提高 I/O 性能,划分了一部分物理内存空间作为 I/O buff/cache,当 Kernel 接收到 read() / write() 等读写请求时,首先会到 buff/cache 查找,如果找到,则立即返回。Page Cache(页缓存)是最常用的 I/O Cache 技术,以页为单位的,内容就是磁盘上的物理块,用于减少 Application 对 Storage 的 I/O 操作,能够令 Application 对文件进行顺序读写的速度接近于对内存的读写速度。原创 2023-03-08 01:14:41 · 621 阅读 · 0 评论 -
Linux 操作系统原理 — 内存管理 — Swap 交换内存
虚拟地址的页表遍历过程中,当访问到某个页面时,通过页表项中的有效位,可以得知此页面是否在内存中,如果不存在,则通过缺页异常,将磁盘对应的数据拷贝到内存中,如果没有空闲内存,则选择牺牲页面,替换掉其他页面。当 Memory 已满时使用,页面可以移出内存并放入磁盘中,这个过程称为交换,但速度会慢很多。常应用于内存容量紧张的场景中。有时候我们并不希望使用 Swap 分区,则可以修改 vm.swappiness=0 来设置内存尽量少使用 Swap 分区,或者干脆使用 swapoff 命令禁用掉 Swap 分区。原创 2023-02-26 14:45:09 · 1072 阅读 · 1 评论 -
DPDK — TIMER(librte_timer,Timer Manager,定时器管理组件)
TIMER 的时间参考来自 EAL 层提供的时间接口。为 DPDK 应用程序的执行单元提供了定时服务,支持以异步的方式执行函数。定时器可以设置周期调用,也可以设置为只调用一次。DPDK 应用程序可以使用 EAL 提供的 HPET 接口来获取高精度时钟的引用,并且能在每个 Core 上根据需要进行初始化。提供一些异步周期执行的接口(也可以只执行一次),可以指定某个函数在规定时间内的异步执行,就像 LIBC 中的 timer 定时器。但是这里的定时器需要 DPDK 应用程序在主循环中周期内调用。原创 2023-02-19 23:51:17 · 781 阅读 · 0 评论 -
DPDK — MBUF(librte_mbuf,Packet Buffer Management,数据包缓存块管理组件)
为 DPDK 应用程序提供创建和释放用于存储数据报文信息的缓存块的接口。提供了两种类型的 MBUF,一种用于存储一般信息,一种用于存储实际的报文数据。这些 MBUF 存储在一个内存池中。原创 2023-02-19 23:49:59 · 630 阅读 · 0 评论 -
DPDK — RING(librte_ring,Ring Manager,环缓冲区管理组件)
单生产者出队,将一个或多个(批量出队)旧的 objs 从 consumer 方向出队,因为只有一个 lcore 充当 Consumer 角色,所以只会对 cons_head 和 cons_tail 进行更改。单生产者入队,将一个或多个(批量入队)新的 objs 入队 producer 方向,因为只有一个 lcore 充当 Producer 角色,所以只会对 prod_head 和 prod_tail 进行更改。:2 个 Producer 的 prod_head 和 prod_tail 都指向相同的位置。原创 2023-02-19 23:33:07 · 699 阅读 · 0 评论 -
DPDK — MEMPOOL(librte_mempool,Memory Pool Manager,内存池管理组件)
运行在某个 CPU Core 上的 lcore(EAL Thread)在申请内存块时,首先会在 CPU Core 的 Cache 中的 Local Buffer Queue 中分配,直至减少到阈值后,才会从 Main Memory 的 Ring Buffer Zone 中分配。DPDK MEMPOOL 是一个由多个固定大小的内存块所组成的 Memory Pool,可用于存储多种不同的实体类型,例如:Pkt SKB(数据报文缓冲块)等。原创 2023-02-19 18:19:34 · 996 阅读 · 0 评论 -
DPDK — MALLOC(librte_malloc,Memory Manager,内存管理组件)
前两个标识了正常内存块的分配状态,后者用于指示元素结构是在块开始填充结束时的虚拟结构,即:由于对齐限制,块内的数据开始的地方不在块本身的开始处。值得注意的是,不建议将 rte_malloc() 接口应用到数据面处理逻辑中,因为 MALLOC 库相较于 MEMPOOL 库的分配速度要更慢,并且 MALLOC 库在分配和释放的过程中使用了锁操作。从这个元素头中,我们获得指向块所分配的堆的指针及必须被释放的位置,以及指向前一个元素的指针, 并且通过 size 字段,可以计算下一个元素的指针。原创 2023-02-19 17:11:01 · 1006 阅读 · 0 评论 -
Linux 操作系统原理 — 进程管理 — NUMA 架构中的多线程调度开销与性能优化
NOTE:本文中所指 “线程” 均为可执行调度单元 Kernel Thread。原创 2023-02-18 16:34:08 · 1782 阅读 · 0 评论 -
Linux 操作系统原理 — NUMA 体系结构
现代计算机系统中,处理器的处理速度已经超过了主存的读写速度,限制计算机计算性能的瓶颈转移到了存储器带宽之上。SMP 由于集中式共享存储器的设计限制了处理器访问存储器的频次,导致处理器可能会经常处于对数据访问的饥饿状态。**NUMA(Non-Uniform Memory Access,非一致性存储器访问)**的设计理念是将处理器和存储器划分到不同的节点(NUMA Node),它们都拥有几乎相等的资源。原创 2023-02-18 01:34:37 · 1497 阅读 · 1 评论 -
DPDK — 性能优化手段
如果编译器的版本不支持该款 CPU 的特性,比如 Intel AVX 指令,那么它在编译时只会选用自己支持的指令集,这可能导致编译后生成的 DPDK 应用的性能下降。下图展示了一个通用双路处理器(2 个 CPU Socket)服务器的内部架构,它包含了 2 个 CPU,配有 2 个分离的内存控制单元来连接各自的 Main Memory,芯片组会扩展出大量高速的 PCIe 2.0/3.0 接口,用于连接外设,如 10Gbps 或者 25Gbps 网卡外设。原创 2023-02-18 00:41:06 · 1395 阅读 · 0 评论 -
DPDK — 数据加速方案的核心思想
但是,UIO Framework 也有着不足之处,例如:不支持 DMA(不受 IOMMU 的保护)、中断支持有限、需要 Root 权限运行等,所以通过 DMA 传输大流量数据的 I/O 设备,例如:被 Passthrougth 的 NIC 或 GPU 等设备,是无法使用 UIO Framework 的。这些拷贝处理的时间会占报文处理总时长的 57.1%。:一次中断处理,首先需要将 CPU 的状态寄存器数据保存到虚拟内存空间中的堆栈,然后运行中断服务程序,最后再将状态寄存器数据从堆栈中夹在到 CPU。原创 2023-02-17 23:58:02 · 1622 阅读 · 0 评论 -
异构计算 — Overview
从供给侧来看,是因为随着芯片硬件的开源开放,降低了硬件生产的门槛,使得不同的设备厂商可以结合不同的场景,设计并开发出适合的芯片来进行业务处理。其中,分离式架构的缺点在于 PCIe 传输成了其中的性能瓶颈,例如:PCIe Gen3 x1 理论带宽约为 1000MB/s,所以对于 Gen3 x32 的最大带宽约为 32GB/s,而受限于本身的实现机制,有效带宽往往只有理论值的 2/3,甚至更低。由 CPU 主处理器和多种协处理器组成的异构计算体系结构,在摩尔定律失效的当下,会越来越广泛的被市场接受。原创 2022-10-14 14:19:33 · 1227 阅读 · 0 评论 -
P4 开发实践 — 编程基础 — Annotations 注解
Annotations 机制用于在不改变 P4 语法的前提下,对 P4 language 的功能进行扩展的一种方式。类似于 Kubernetes Annotations,同样是一种功能扩展机制。P4 Annotations 使用 @ 语法糖,可以将一个 Annotation instance 附加到变量、数据类型、Block 类型等对象之上。下面不完全列出一些 P4 内建的 Annotations:@optional:附加在 Package、Extern 方法、Extern 函数、Extern 对象构造函数原创 2022-10-06 15:51:00 · 1059 阅读 · 0 评论 -
P4 开发实践 — 编程基础 — SR-MPLS over UDP 示例程序
Use Case : Tunnelling SR Across a Non-SR CoreUse Case : SR in a Mixed Mode IP Network原创 2022-09-27 17:41:25 · 1357 阅读 · 0 评论 -
P4 开发实践 — 编程基础 — L3 Forwarding 示例程序
使用 basic.json 文件启动 simple_switch 进程。原创 2022-09-27 11:39:49 · 1241 阅读 · 0 评论 -
P4 开发实践 — 编程基础 — Controls 控制逻辑
在 Control Block 中定义了 Tables、Actions、Control Flows 之后,需要通过 apply 关键字来定义 Condition control logic(条件控制语句),将这些元素根据预期的逻辑组织起来。Table Key 在 Table Block 中使用 key 关键字来声明,在 P4 program 表现为一个 Key:Value(键值对)数据结构,类似 Python 的 Dict。Controls,是 P4 用于对 Packet 处理流程进行控制的一种机制。原创 2022-09-26 18:38:28 · 1363 阅读 · 0 评论 -
P4 开发实践 — 编程基础 — Parser 解析器
NOTE:通过 next 或 last 属性访问 Header stacks 中不存在的元素时,会触发 transition reject 状态转换,并设置错误为 error.StackOutOfBounds。在 Parser 中使用的 Header stacks 有两个属性:next 和 last。NOTE:读取数据报文头时,可能会触发 PacketTooShort or StackOutOfBounds 的 Error。:每个 State 会被执行 0 或以上次,之后转换为 other State。原创 2022-09-24 01:52:00 · 1076 阅读 · 0 评论 -
P4 开发实践 — 编程基础 — 数据类型
无符号整型,Bit-String,又称 “位串”。特征是当 bit 类型数据进行算术运算时,操作数必须是 “字节对齐” 的,即:数据的长度必须为 8 的倍数。Struct 是一个 “无序的数据类型集合”,类似于 Python 的 Dict 数据类型。此外与 bit 类型一致。原创 2022-09-23 19:23:04 · 974 阅读 · 0 评论 -
P4 开发实践 — 编程基础 — 编译安装开发环境
NOTE:同时启用 PI P4Runtime API 和 Thrift API 时,意味着存在 2 个 Control Plane,我们需要注意数据写入的唯一性,即:使用前者来执行 Get/Set 操作,而后者仅仅执行 Get 操作。PI 和 simple_switch_grpc 依赖 gRPC 和 Protobuf,同时,安装 gRPC 时会把 Protobuf 作为子模块一并安装了,所以实际上只需要安装 gRPC 即可。原创 2022-09-22 23:18:47 · 1125 阅读 · 0 评论 -
P4 开发实践 — 编程基础
根据 Header types 来定义某个具体的 Header Parsers,包括:解析的顺序、要提取的 HeaderData、要生成的 Metadata 等。:定义 P4 architecture 相关的对象,可以由 P4 program 通过定义明确的 API 来调用。:定义与每个报文相关联的、且由 P4 architecture 提供的元数据。:定义在 P4 target 上进行报文处理的流程,例如:处理报文顺序。:定义与每个报文相关联的、且有 User 提供的元数据。:Parser 的声明;原创 2022-09-21 23:50:24 · 1203 阅读 · 0 评论 -
P4 开发实践 — 硬件 DSA 架构
RMT(Reconfigurable Match Tables,可重配置 Match-Action 表)是一种基于 RISC 交换芯片的 Pipeline 架构,定义了 Programmable parsing(可编程解析)、Programmable match(可编程匹配)和 Programmable action(可编程动作)等数据报文的处理行为。只要遵守了 PSA 定义的 API 和各种行为,那么开发者编写的 P4 program 就可以进行跨设备移植,前提是这些设备兼容 PSA 体系结构。原创 2022-09-21 17:56:07 · 1914 阅读 · 0 评论 -
P4 开发实践 — NG-SDN Tutorial — Exercise 6: Segment Routing v6 (SRv6)
【代码】P4 开发实践 — NG-SDN Tutorial — Exercise 6: Segment Routing v6 (SRv6)原创 2022-09-16 17:32:47 · 1217 阅读 · 0 评论 -
P4 开发实践 — NG-SDN Tutorial — Exercise 5: IPv6 Routing
【代码】P4 开发实践 — NG-SDN Tutorial — Exercise 5: IPv6 Routing。原创 2022-09-16 15:52:08 · 947 阅读 · 0 评论 -
P4 开发实践 — NG-SDN Tutorial — Exercise 4: Enabling ONOS Built-in Services
【代码】P4 开发实践 — NG-SDN Tutorial — Exercise 4: Enabling ONOS Built-in Services。原创 2022-09-16 14:24:45 · 821 阅读 · 0 评论 -
P4 开发实践 — NG-SDN Tutorial — Exercise 3: Using ONOS as the control plane
使用 ONOS 纳管 Mininet 构建的虚拟网络拓扑,核心配置在 mininet/netcfg.json 文件中。NOTE:输入到 onos> 的指令不能复制粘贴,只能手敲,否者会卡住。查看特定设备的 Pipeconf。登陆 ONOS GUI。原创 2022-09-16 11:28:56 · 957 阅读 · 0 评论 -
P4 开发实践 — NG-SDN Tutorial — Exercise 2: Yang, OpenConfig, and gNMI basics
【代码】P4 开发实践 — NG-SDN Tutorial — Exercise 2: Yang, OpenConfig, and gNMI basics。原创 2022-09-16 10:26:06 · 1108 阅读 · 0 评论 -
P4 开发实践 — NG-SDN Tutorial — Exercise 1: P4Runtime Basics
P4 runtime shell(p4rt-sh)是一个由 Python 实现的交互式 CLI 工具,用于连接到 P4 runtime server 并执行 Commands,例如:对 Flow table 执行 CRUD 操作。使用 p4rt-sh 连接到 leaf1 stratum_bmv2,并将 Pipeline configuration(p4info.txt 和 bmv2.json)推送过去。执行成功后,则通过远程的方式进入到了 leaf1 的 P4 runtime server shell。原创 2022-09-15 23:17:40 · 1170 阅读 · 0 评论 -
P4 开发实践 — NG-SDN Tutorial — 快速搭建实验环境
BMv2 的设计初衷是供开发人员进行 P4 程序的学习、开发、测试、调试等。BMv2(Behavior Model Version 2,https://github.com/p4lang/behavioral-model)是一款参考的 P4 可编程软件交换机。P4C(P4 complier,https://github.com/p4lang/p4c)是一款参考的 P4 程序编译器。而 P4C 自己的编译器后端 p4c-bm2-ss,则是面向 BMv2 的,能够编译出用于 BMv2 的 JSON 格式。原创 2022-09-15 16:14:24 · 1367 阅读 · 0 评论 -
P4 开发实践 — 软件 DSL 架构
P4 实现了一种 Programmable Match-Action Pipeline(流水线可编程)架构,作为 Pipeline,就是:开发者可以自定义 Match Fields、自定义 Action Type、从而实现自定义的 Match-Action Table,再由多张这样的 Tables 进而形成一条 Pipeline。原创 2022-09-15 12:53:12 · 1294 阅读 · 0 评论 -
计算机组成原理 — PCI-E on Linux
Host 在枚举设备的同时也会对设备进行配置,每个 PCI-E 设备都会指定一段 CPU memory 访问空间,从上面的图中我们可以看到这个设备支持两段访问空间,一段的大小是 1M byte,另一段的大小是 256K byte,系统会分别指定它们的 BAR(基地址)。在 Linux 操作系统中,我们可以通过 lspci –v -t 命令来查询系统上电阶段扫描到的 PCI-E 设备,执行结果会以一个树的形式列出系统中所有的 PCI-E 设备。其中黄色方框中的 PCI-E 设备是。原创 2022-09-15 01:48:03 · 1463 阅读 · 0 评论 -
计算机组成原理 — PCI-E 总线
第三步,系统继续扫描 Bus 2,将会发现 Bridge 4。继续扫描,系统会发现 Bridge 下面挂载的 NVMe SSD 设备,系统将 Bridge 4 下面的 PCI-E Bus 定为 Bus 3,并将该桥的 Primary Bus Number 和 Secondary Bus Number 寄存器分别设置成 2 和 3,因为 Bus3 下面挂的是端点设备(叶子节点),下面不会再有下游总线了,因此 Bridge 4 的 Subordinate Bus Number 的值可以确定为 3。原创 2022-09-15 01:43:58 · 1413 阅读 · 0 评论 -
NVIDIA DPU — 配置使用
【代码】NVIDIA DPU — 配置使用。原创 2022-09-14 15:26:03 · 1614 阅读 · 0 评论 -
NVIDIA DPU — 安装部署
BlueField boot stream file (BFB) 是用于启动 BlueField-2 DPU OS 的 Image file,包含了:DPU OS image、底层 BootLoader 代码、以及相应的 Drivers 套件。文档:https://docs.nvidia.com/doca/sdk/installation-guide/index.html#doca-dpi-installation。在 Server 上以 Ethernet 模式安装 DPU 硬件,详见《原创 2022-09-08 23:12:25 · 1969 阅读 · 0 评论