Bee*_*ope 12 performance x86 intel-pmu
英特尔PMU可用于测量每核读/写内存带宽使用情况吗?这里"存储器"意味着DRAM(即,不在任何高速缓存级别中命中).
是(ish),间接的.您可以使用计数器之间的关系(包括时间戳)来推断其他数字.例如,如果您采样1秒间隔,并且有N个最后一级(3)缓存未命中,则您可以非常自信地每秒占用N*CacheLineSize字节.
将它准确地与程序活动联系起来有点棘手,因为这些未命中可能反映了cpu预取,中断活动等.
除非这个配置位处于这种状态,否则还有一个'这个cpu不计数(MMX,SSE,AVX,..)的泥潭; 因此滚动你自己很麻烦....
是的,这是可能的,尽管它不一定像对通常的 PMU 计数器进行编程那样简单。
一种方法是使用通过 PCI 空间访问的可编程内存控制器计数器。一个好的起点是pcm-memory在pcm-memory.cpp 中检查英特尔自己的实现。此应用程序向您显示每个套接字或每个内存控制器的吞吐量,这适用于某些用途。特别是,带宽在所有内核之间共享,因此在安静的机器上,您可以假设大部分带宽与被测进程相关联,或者如果您想在套接字级别进行监控,这正是您想要的。
另一种选择是对“offcore 响应”计数器进行仔细的编程。据我所知,这些与 L2(最后一个核心私有缓存)和系统其余部分之间的流量有关。您可以通过非核心响应的结果进行过滤,因此您可以使用各种“L3 未命中”事件的组合并乘以缓存线大小以获得读写带宽。事件的粒度非常细,因此您可以通过首先导致访问的原因进一步细分:指令获取、数据需求请求、预取等。
非核心响应计数器通常落后于类似工具的支持perf,likwid但至少最近的版本似乎有合理的支持,即使对于像 SKL 这样的客户端部分也是如此。
非核心响应性能监控工具可用于对来自特定核心的 IDI 上所有核心发起的请求进行计数。请求类型字段可用于统计特定类型的请求,例如需求数据读取。但是,要测量每核内存带宽,必须以某种方式将请求数转换为每秒字节数。大多数请求都是缓存行大小,即 64 字节。其他请求的大小可能是未知的,并且可能会向内存带宽添加一些小于或大于缓存线大小的字节数。这些包括缓存行拆分锁定请求、WC 请求、UC 请求和 I/O 请求(但这些不影响内存带宽),以及需要完成所有挂起写入的栅栏请求(MFENCE、SFENCE,和序列化指令)。
如果您只对可缓存带宽感兴趣,那么您可以计算可缓存请求的数量并将其乘以 64 字节。这可能非常准确,假设可缓存的缓存行拆分锁定请求很少见。不幸的是,从 L3(或 L4,如果可用)到内存的写回不能被任何当前微体系结构上的非核心响应工具计算在内。这样做的原因是这些写回不是核心发起的,通常是 L3 中的冲突未命中的结果。因此,可以计算在 L3 中丢失并导致写回的请求,但非核心响应工具无法确定对 L3(或 L4)的任何请求是否导致了写回。这就是为什么不可能计算“每个内核”对内存的写回。
此外,offcore 响应事件需要一个可编程的性能计数器,它是 0、1、2 或 3 之一(但在禁用 hyptherhtreading 时不是 4-7)。
英特尔至强 Broadwell 支持多种资源导向技术 (RDT) 功能。特别是,它支持内存带宽监控(MBM),这是通常准确测量每个内核的内存带宽的唯一方法。
MBM 与非核心响应相比具有三个优势:
非核心响应的优势在于它支持请求类型、供应商类型和监听信息字段。
Linux 从内核版本 4.6开始支持 MBM 。在 4.6 到 4.13 上,支持perf使用以下事件名称的 MBM 事件:
intel_cqm_llc/local_bytes - bytes sent through local socket memory controller
intel_cqm_llc/total_bytes - total L3 external bytes sent
Run Code Online (Sandbox Code Playgroud)
也可以通过编程方式访问这些事件。
从4.14开始,Linux 中 RDT 的实现发生了重大变化。
在运行内核版本 4.16 的 BDW-E5(双插槽)系统上,我可以使用以下命令序列查看 MBM 的字节数:
// Mount the resctrl filesystem.
mount -t resctrl resctrl -o mba_MBps /sys/fs/resctrl
// Print the number of local bytes on the first socket.
cat /sys/fs/resctrl/mon_data/mon_L3_00/mbm_local_bytes
// Print the number of total bytes on the first socket.
cat /sys/fs/resctrl/mon_data/mon_L3_00/mbm_total_bytes
// Print the number of local bytes on the second socket.
cat /sys/fs/resctrl/mon_data/mon_L3_01/mbm_local_bytes
// Print the number of total bytes on the second socket.
cat /sys/fs/resctrl/mon_data/mon_L3_01/mbm_total_bytes
Run Code Online (Sandbox Code Playgroud)
我的理解是自系统重置以来计算字节数。
请注意,默认情况下,被监控的资源是整个套接字。
不幸的是,大多数RDT的功能,包括MBM原来是越野车在支持它的SKYLAKE微架构的处理器。根据SKZ4和SKX4:
英特尔® 资源导向技术 (RDT) 内存带宽监控 (MBM) 不计算本地内存的可缓存写回流量。这导致 RDT MBM 功能在计算消耗的总带宽时。
这就是为什么它在 Linux 上在 Skylake-X 和 Skylake-SP(这是唯一支持 MBM 的 Skylake 处理器)上运行时默认禁用的原因。您可以通过将以下参数 添加rdt=mbmtotal,mbmlocal到内核命令行来启用 MBM 。某些寄存器中没有用于启用或禁用 MBM 或任何其他 RDT 功能的标志。相反,这是在内核中的某些数据结构中跟踪的。
在英特尔酷睿 2 微架构上,可以使用此处BUS_TRANS_MEM讨论的事件来测量每个内核的内存带宽。
| 归档时间: |
|
| 查看次数: |
823 次 |
| 最近记录: |