海思 PCIe 性能监控单元 (PMU)¶
在 Hip09 上,海思 PCIe 性能监控单元 (PMU) 可以监控 PCIe 的带宽、延迟、总线利用率和缓冲区占用率数据。
每个 PCIe 核心都有一个 PMU 来监控此 PCIe 核心的多个根端口以及这些根端口的所有下游端点。
海思 PCIe PMU 驱动程序¶
PCIe PMU 驱动程序使用其 sicl-id 和 PCIe 核心 id 注册 perf PMU。
/sys/bus/event_source/hisi_pcie<sicl>_core<core>
PMU 驱动程序在 sysfs 中提供可用事件和过滤器选项的描述,请参阅 /sys/bus/event_source/devices/hisi_pcie<sicl>_core<core>。
“format” 目录描述 perf_event_attr 结构的 config(事件)和 config1(过滤器选项)字段的所有格式。“events” 目录描述 perf list 中显示的所有已记录事件。
“identifier” sysfs 文件允许用户识别 PMU 硬件设备的版本。
“bus” sysfs 文件允许用户获取 PMU 监控的根端口的总线号。此外,用户可以分别从 “bdf_min” 和 “bdf_max” sysfs 属性中获取 [bdf_min, bdf_max] 中的根端口范围。
perf 的使用示例
$# perf list
hisi_pcie0_core0/rx_mwr_latency/ [kernel PMU event]
hisi_pcie0_core0/rx_mwr_cnt/ [kernel PMU event]
------------------------------------------
$# perf stat -e hisi_pcie0_core0/rx_mwr_latency,port=0xffff/
$# perf stat -e hisi_pcie0_core0/rx_mwr_cnt,port=0xffff/
相关的事件通常用于计算带宽、延迟或其他值。它们需要同时开始和结束计数,因此相关事件最好在同一事件组中使用,以获得预期值。有两种方法可以知道它们是否是相关事件
按事件名称,例如延迟事件 “xxx_latency, xxx_cnt” 或带宽事件 “xxx_flux, xxx_time”。
按事件类型,例如 “event=0xXXXX, event=0x1XXXX”。
perf 组的使用示例
$# perf stat -e "{hisi_pcie0_core0/rx_mwr_latency,port=0xffff/,hisi_pcie0_core0/rx_mwr_cnt,port=0xffff/}"
当前驱动程序不支持采样。因此不支持 “perf record”。也不支持附加到 PCIe PMU 的任务。
过滤器选项¶
目标过滤器
PMU 只能监控下游目标根端口或下游目标端点的流量性能。PCIe PMU 驱动程序为用户提供 “port” 和 “bdf” 接口。请注意,必须设置这两个接口之一,并且这两个接口不能同时支持。如果同时设置,则只有 “port” 过滤器有效。如果 “port” 过滤器未设置或显式设置为零(默认值),则 “bdf” 过滤器将生效,因为 “bdf=0” 表示 0000:000:00.0。
port
“port” 过滤器可用于所有 PCIe PMU 事件,可以通过配置 16 位位图 “port” 来选择目标根端口。可以选择多个端口用于 AP 层事件,而只能选择一个端口用于 TL/DL 层事件。
例如,如果目标根端口为 0000:00:00.0(x8 通道),则应设置位图的 bit0,port=0x1;如果目标根端口为 0000:00:04.0(x4 通道),则设置 bit8,port=0x100;如果这两个根端口都被监控,则 port=0x101。
perf 的使用示例
$# perf stat -e hisi_pcie0_core0/rx_mwr_latency,port=0x1/ sleep 5
bdf
“bdf” 过滤器只能用于带宽事件,通过将 BDF 配置为 “bdf” 来选择目标端点。计数器仅计算目标端点请求的消息的带宽。
例如,“bdf=0x3900” 表示目标端点的 BDF 为 0000:39:00.0。
perf 的使用示例
$# perf stat -e hisi_pcie0_core0/rx_mrd_flux,bdf=0x3900/ sleep 5
触发器过滤器
当 TLP 长度第一次大于/小于触发条件时,事件统计开始。您可以通过写入 “trig_len” 来设置触发条件,并通过写入 “trig_mode” 来设置触发模式。此过滤器只能用于带宽事件。
例如,“trig_len=4” 表示触发条件为 2^4 DW,“trig_mode=0” 表示当 TLP 长度 > 触发条件时统计开始,“trig_mode=1” 表示当 TLP 长度 < 条件时开始。
perf 的使用示例
$# perf stat -e hisi_pcie0_core0/rx_mrd_flux,port=0xffff,trig_len=0x4,trig_mode=1/ sleep 5
阈值过滤器
当 TLP 长度在指定范围内时,计数器会进行计数。您可以通过写入 “thr_len” 来设置阈值,并通过写入 “thr_mode” 来设置阈值模式。此过滤器只能用于带宽事件。
例如,“thr_len=4” 表示阈值为 2^4 DW,“thr_mode=0” 表示当 TLP 长度 >= 阈值时计数器计数,而 “thr_mode=1” 表示当 TLP 长度 < 阈值时计数。
perf 的使用示例
$# perf stat -e hisi_pcie0_core0/rx_mrd_flux,port=0xffff,thr_len=0x4,thr_mode=1/ sleep 5
TLP 长度过滤器
在计算带宽时,数据可以由 TLP 数据包的某些部分组成。您可以通过 “len_mode” 来指定它
2'b00: 保留(请勿使用此项,因为行为未定义)
2'b01: TLP 有效负载的带宽
2'b10: TLP 标头的带宽
2'b11: TLP 有效负载和标头的带宽
例如,“len_mode=2” 表示仅计算 TLP 标头的带宽,而 “len_mode=3” 表示最终带宽数据由 TLP 标头和有效负载组成。如果未指定,则默认值为 2'b11。
perf 的使用示例
$# perf stat -e hisi_pcie0_core0/rx_mrd_flux,port=0xffff,len_mode=0x1/ sleep 5