Mmap 建议
DOCA Mmap Advise 用于向 NVIDIA® BlueField® DPU 提供高级内存相关指令,以提高系统或应用程序性能。
要将 DOCA Mmap Advise 与 BlueField 结合使用,设备必须配置为在 DPU 模式下工作,如BlueField 工作模式中所述。
指令中的操作旨在影响应用程序的性能,而不是其语义。这些操作允许应用程序告知 NIC 它期望如何使用某些映射的内存区域,以便 BlueField 的硬件可以选择适当的优化技术。
DOCA Mmap Advise 是一个上下文,并遵循 DOCA Core Context 的架构,建议在继续之前阅读 DOCA Core 页面的以下部分
DOCA Mmap Advise 是 DOCA Core 定义的 DOCA Context。有关更多信息,请参见DOCA Core Context。
DOCA Mmap Advise 目前支持以下建议的操作列表
缓存失效操作
缓存失效操作
当数据被 BlueField 的内核处理时,它可能会临时存储在内核的系统级缓存(即 L3 缓存)中。当缓存行被占用并且必须将新数据写入其中时,缓存管理子系统会逐出现有数据,通常基于 LRU 策略,方法是执行写回操作以将此数据存储在主 (DDR) 内存中。当不需要将此数据存储在 BlueField 的内存中时(例如,它是主机数据,在复制到主机的内存后不再需要),缓存的写回操作会浪费内存带宽,从而降低整体系统性能,这是不可取的。避免此写回操作的最简单方法是将适当的缓存行标记为“无效”。这使其能够立即重用,而无需额外的操作。
缓存失效操作有助于使一组缓存行失效。
基于 DOCA Mmap Advise 的应用程序可以在 BlueField 目标上运行。
对象
设备和设备代表
MMAP Advise 上下文需要 DOCA 设备才能运行。该设备用于访问内存并执行复制操作。参见DOCA Core 设备发现。
对于同一 DPU,使用哪个设备(即 PF、VF、SF)都无关紧要,因为所有这些设备都使用相同的硬件组件。
只要 MMAP Advise 实例未被销毁,设备就必须保持有效。
内存缓冲区
缓存失效任务需要一个 DOCA 缓冲区,其中包含要失效的地址空间,具体取决于缓冲区的分配模式(请参阅“库存类型”部分中的表格)。要查找支持哪种类型的内存,请参阅“缓冲区支持”部分中的表格。
在缓存失效操作期间,不得修改或读取缓冲区。
要开始使用上下文,用户必须按照DOCA Core Context 配置阶段中所述完成配置阶段。
本节介绍如何配置和启动上下文,以允许执行任务和检索事件。
配置
可以配置上下文以匹配应用程序的用例。
要查找是否支持某个配置,或其最小/最大值是多少,请参阅“设备支持”部分。
强制配置
这些配置是强制性的,必须由应用程序在尝试启动上下文之前设置
设备支持
DOCA Mmap Advise 需要设备才能运行。要选择设备,请参阅DOCA Core 设备发现。
由于设备功能可能会发生变化(请参阅DOCA Core 设备支持),建议使用以下方法选择您的设备
doca_mmap_advise_cap_task_cache_invalidate_is_supported
某些设备公开不同的功能,如下所示
最大缓存失效缓冲区大小可能不同。
缓冲区支持
任务支持具有以下功能的缓冲区
缓冲区类型 | 缓冲区 |
本地 mmap 缓冲区 | 是 |
来自 PCIe 导出缓冲区的 MMAP | 否 |
来自 RDMA 导出缓冲区的 MMAP | 否 |
链表缓冲区 | 否 |
本节介绍如何使用DOCA Core 进度引擎在 CPU 上执行。
任务
DOCA Mmap Advise 公开异步任务,这些任务根据 DOCA Core 架构利用 DPU 硬件。有关信息,请参见DOCA Core 任务。
缓存失效任务
缓存失效任务有助于使一组缓存行失效,防止它们被写回 RAM(从而提高性能)。
任务配置
描述 | 用于设置配置的 API | 用于查询支持的 API |
启用任务 |
|
|
任务数 |
| – |
最大缓冲区大小 | – |
|
最大缓冲区列表大小 | – | – |
任务输入
如DOCA Core 任务中所述的通用输入。
名称 | 描述 |
缓冲区 | 指向要失效的内存的缓冲区 |
任务输出
如DOCA Core 任务中所述的通用输出。
任务完成成功
任务成功完成后
缓存已失效
任务完成失败
如果任务中途失败
如果发生致命错误,上下文可能会进入停止状态
缓存未失效
任务限制
操作不是原子性的
提交任务后,不应读取/写入缓冲区
其他限制在DOCA Core 任务中描述
事件
DOCA Mmap Advise 公开异步事件,以根据DOCA Core 架构通知意外发生的更改。
DOCA Mmap Advise 公开的唯一事件是DOCA Core Event中描述的通用事件。
DOCA Mmap Advise 上下文遵循DOCA Core Context 状态机中描述的上下文状态机。
以下部分描述如何移动状态以及每个状态允许的操作。
空闲
在此状态下,应用程序应执行以下操作
销毁上下文
启动上下文
允许的操作
根据“配置”部分配置上下文
启动上下文
可以通过以下方式达到此状态
上一个状态 | 转换操作 |
无 | 创建上下文 |
运行中 | 在确保所有任务都已释放后调用 stop |
停止中 | 调用 progress 直到所有任务都已完成并释放 |
启动中
无法达到此状态。
运行中
在此状态下,应用程序应执行以下操作
分配和提交任务
调用 progress 以完成任务和/或接收事件
允许的操作
分配先前配置的任务
提交任务
调用 stop
可以通过以下方式达到此状态
上一个状态 | 转换操作 |
空闲 | 配置后调用 start |
停止中
在此状态下,应用程序应执行以下操作
调用 progress 以完成所有正在进行的任务(任务完成失败)
释放任何已完成的任务
允许的操作
调用 progress
可以通过以下方式达到此状态
上一个状态 | 转换操作 |
运行中 | 调用 progress 并且发生致命错误 |
运行中 | 在未释放所有任务的情况下调用 stop |
缓存失效示例
该示例说明了在使用 DOCA DMA 复制内存范围后如何使该范围的缓存失效。
示例逻辑包括
定位 DOCA 设备。
初始化所需的 DOCA core 结构。
使用两个相关缓冲区填充 DOCA 内存映射。
为每个缓冲区在 DOCA 缓冲区清单中分配元素。
初始化 DOCA DMA 内存复制任务对象。
初始化 DOCA Mmap Advise 缓存失效任务对象
提交 DMA 任务。
轮询完成情况
处理 DMA 任务完成 – 在 DMA 任务完成回调主体中提交缓存失效任务。
处理缓存失效任务完成。
轮询完成情况。
销毁 DMA、DOCA MMAP Advise 和 DOCA Core 对象。
参考
/opt/mellanox/doca/samples/doca_common/cache_invalidate/cache_invalidate_sample.c
/opt/mellanox/doca/samples/doca_common/cache_invalidate/cache_invalidate_main.c
/opt/mellanox/doca/samples/doca_common/cache_invalidate/meson.build