前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PCIe 课程典型问题解答

PCIe 课程典型问题解答

作者头像
Linux阅码场
发布2023-09-22 08:47:03
6690
发布2023-09-22 08:47:03
举报
文章被收录于专栏:LINUX阅码场LINUX阅码场

ØPCIe 设备的数据流有哪些,分别是什么场景?

PCIe 设备的数据流主要为4大类:

1.CPU 发起的,访问PCIe设备配置空间的数据流。这种数据流主要是BIOS/Linux PCIe driver 对设备进行初始化、资源分配时,读写配置空间的。包括PCIe 枚举,BAR 空间分配, MSI 分配等。 设备驱动通过 pci_wirte_config() / pci_read_config() 发起配置空间访问。 lspci / setpci 也是对应到配置空间访问。

2.CPU 发起的,访问PCIe设备MMIO/IO的数据流。将Bar空间mmap 到系统地址空间后,设备驱动可通过地址访问PCIe 设备的 Bar / MMIO 空间。 一般的,设备会将特定的寄存器和存储实现在MMIO空间内。CPU可使用 iowrite32() / ioread32() 等方式访问 MMIO 空间。这是一种效率较低的PCIe使用方式.

3.PCIe 设备发起的,访问 Host Memory 的 DMA 数据流。这种数据流由PCIe 设备的DMA Engine 发起,是一种常见的、高性能的PCIe 数据流。CPU通过配置 PCIe 设备内的DMA Engine (通过MMIO寄存器),启动设备PCIe DMA。网卡,GPU 等PCIe 设备,数据通路均有PCIe DMA完成。

4.PCIe 设备发起的,访问PCIe设备MMIO/IO的数据流, 亦称P2P (Peer to Peer)。同(3)类似,也是利用PCIe 设备的DMA engine, 但是数据访问的是其他PCIe 设备的MMIO地址空间而非Host Memory. CPU须配置桥片端口路由地址。 GDR (GPU direct RDMA) 就是利用这种数据流,避免主机内存的数据拷贝。

ØCPU访问设备内存(Bar空间)和访问主机内存,有什么不同?

Prefetchable MMIO 映射到系统地址空间后,软件可以通过地址对PCIe MMIO空间进行直接访问(CPU使用MOV指令),这一点与系统内存访问在操作上是一致的。

Root Complex 会根据CPU 访问的地址决定数据访问路由,对于系统内存地址空间,数据会被路由到iMC (integrated Memory Controller) 访问DDR;对于MMIO地址空间,数据会被路由到Host Bridge 转换为 TLP 发起对设备的PCIe 通信。

一般的,Host Memory 分配都是Cacheable (writeback) 的,而 MMIO 通常是Uncacheable的,加之两者带宽和通信机理的不同,导致了CPU 使用地址直接访问PCIe MMIO空间无法达到访问系统内存的性能,也无法用满PCIe带宽。使用memcpy() 在Host Memory 和MMIO 地址拷贝数据也是一种低效方式。

对于连续的MMIO 空间访问,可以通过支持write combine的方式( mmap_wc() )来提升性能。

Ø为什么需要使用PCIe DMA,在设备与主机间搬运数据?

PCIe DMA 能够实现高性能的数据搬运。

1.CPU 仅需要配置DMA Engine, 大块的数据搬运过程无需CPU参与,CPU占用率低;

2.DMA Engine 是全硬件化的通信方式,TLP payload 大overhead 小,PCIe链路使用率高;

3.支持descriptor 的DMA 能够实现用户态数据的零拷贝,减小内存带宽消耗;

4.支持多队列的DMA,能够提高系统并行度,支持多核,多进程应用,硬件解决IO抢占和调度问题,软件编程简单;

Ø如何使用PCIe设备的中断?

PCIe 协议定义了三种中断:INTx (legacy), MSI, MSIX

1.INTx 中断是相对古老的PCIe设备中断方式,整个系统仅支持8个INTx 中断,所有设备共用。PCIe 中的INTx 中断是通过PCIe message发送到 switch 和 IO APIC的。CPU收到 IO APIC 转发到 local APIC 的 INTx 中断后,需要查询ISR确定中断源设备,并进一步查询中断含义,才能执行中断处理函数。中断数量少,中断查询复杂,响应延迟大,与数据流不保序等问题的存在,是INTx的主要缺陷。

2.MSI 是实现在配置空间的消息中断,每个PCIe function可支持最多32个MSI 中断。MSI 中断是一笔PCIe 写报文,向APIC 地址域写入特定的数据,触发CPU中断。因为其通过PCIe write TLP 实现,中断与业务数据的保序性容易实现,硬件处理Racing Condition的代价更小。MSI中断可以具备特定的含义,设备之间不耦合,中断响应快。

3.MSIx 是实现在Bar空间的消息中断,优点与MSI类似,但其数量支持更多,每个function 最多可以支持2K条中断向量。

MSI 和MSIx 是目前主流的中断实现方式,在虚拟化的场景下,中断可以通过IOMMU 实现remap 和 posting, 进一步提升系统性能。

Ø网卡接收方向性能低,进行调优有哪些思路?

网卡收包性能性能调优,需先识别出性能瓶颈,可通过performance监控工具(如Intel PCM), 查看 CPU 利用率,内存带宽使用,PCIe流量等。

一般的,优化方向包括:

1.确定NUMA的亲和性,保证CPU/Memory/PCIe 三者的亲和性

2.确定PCIe全链路的带宽匹配,确保内存带宽(读+写双向)有余量

3.设备合理的PCIe通路MPS/MRRS

4.查看并打开IDO/RO (需注意应用场景无保序风险)

5.DMA Engine 参数的调优,Batch 操作的阈值配置(队列doorbell, completion notify等)

6.中断频率的调优和控制(一般在20K/100k 每秒,需结合应用和CPU)

7.DDIO 和 cacheable / uncacheable 内存空间的分配

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-09-15 09:06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linux阅码场 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档