海思 PCIe 性能监控单元 (PMU)

在 Hip09 上,海思 PCIe 性能监控单元 (PMU) 可以监控 PCIe 的带宽、延迟、总线利用率和缓冲区占用率数据。

每个 PCIe Core 都有一个 PMU 来监控此 PCIe Core 的多个 Root Port 以及这些 Root Port 下游的所有 Endpoint。

海思 PCIe PMU 驱动

PCIe PMU 驱动程序使用其 sicl-id 和 PCIe Core 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 监控的 Root Port 的总线编号。此外,用户可以分别从 “bdf_min” 和 “bdf_max” sysfs 属性中获取 [bdf_min, bdf_max] 中的 Root Port 范围。

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/

相关事件通常用于计算带宽、延迟或其他指标。 它们需要在同一时间开始和结束计数,因此相关事件最好在同一事件组中使用以获得预期值。 有两种方法可以知道它们是否是相关事件

  1. 按事件名称,例如延迟事件 “xxx_latency, xxx_cnt” 或带宽事件 “xxx_flux, xxx_time”。

  2. 按事件类型,例如 “event=0xXXXX, event=0x1XXXX”。

perf group 的用法示例

$# perf stat -e "{hisi_pcie0_core0/rx_mwr_latency,port=0xffff/,hisi_pcie0_core0/rx_mwr_cnt,port=0xffff/}"

当前的驱动程序不支持采样。 因此不支持 “perf record”。 并且 PCIe PMU 也不支持附加到任务。

过滤器选项

  1. 目标过滤器

    PMU 只能监控下游目标 Root Port 或下游目标 Endpoint 的流量性能。 PCIe PMU 驱动程序支持 “port” 和 “bdf” 接口供用户使用。 请注意,必须设置这两个接口之一,并且不支持同时设置这两个接口。 如果它们都被设置,则只有 “port” 过滤器有效。 如果 “port” 过滤器未被设置或显式设置为零 (默认),则 “bdf” 过滤器将生效,因为 “bdf=0” 意味着 0000:00:00.0。

    • port

      “port” 过滤器可用于所有 PCIe PMU 事件,可以通过配置 16 位位图 “port” 来选择目标 Root Port。 可以为 AP 层事件选择多个端口,并且只能为 TL/DL 层事件选择一个端口。

      例如,如果目标 Root Port 是 0000:00:00.0 (x8 lanes),则应设置位图的 bit0,port=0x1;如果目标 Root Port 是 0000:00:04.0 (x4 lanes),则设置 bit8,port=0x100;如果同时监控这两个 Root Port,port=0x101。

      perf 的用法示例

      $# perf stat -e hisi_pcie0_core0/rx_mwr_latency,port=0x1/ sleep 5
      
    • bdf

      “bdf” 过滤器只能在带宽事件中使用,通过将 BDF 配置为 “bdf” 来选择目标 Endpoint。 计数器仅计算目标 Endpoint 请求的消息的带宽。

      例如,“bdf=0x3900” 表示目标 Endpoint 的 BDF 是 0000:39:00.0。

      perf 的用法示例

      $# perf stat -e hisi_pcie0_core0/rx_mrd_flux,bdf=0x3900/ sleep 5
      
  2. 触发过滤器

    当第一个 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
    
  3. 阈值过滤器

    当 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
    
  4. 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