Vtune:在运行其他任务的机器上运行 vtune 测量时英特尔采样驱动程序的准确性

问题描述

我有最新的 Coffeelake 机器,主要用作存储服务器。单独运行存储服务器时,每个内核(4 个内核)的平均工作负载约为 5-10%。

我想使用英特尔采样驱动程序在这台机器上运行工作负载的 vtune 测量。但是,鉴于存储服务器应用程序正在同时运行,我怀疑测量是否准确。

但是正如intel的文件所暗示的,采样驱动程序安装在Linux内核上,如果与其他应用程序同时运行,测量结果真的会不准确吗?换句话说,英特尔采样驱动程序究竟是如何工作的?他们是否能够区分工作负载进程和系统上运行的其他进程?

解决方法

如果 VTune 就像 perf 使用的 Linux PAPI 子系统,它基本上会在上下文切换时保存/恢复硬件事件计数器寄存器,以及常规寄存器状态。所以像 instructionsuops_retired 这样的事件应该不受影响。对其他事件的影响将取决于实际影响,例如额外的缓存未命中。

(硬件性能事件的基本机制是每个逻辑内核都有自己的可编程性能计数器,每次发生一些微架构事件时,这些计数器都会增加。如果溢出,它会引发一个中断,以便驱动程序收集计数。或者对于 { {1}} 类型的功能,perf 或 VTune 会将它们编程为倒计时,从而定期触发中断,并在那时对保存的用户空间 RIP 进行采样。这会对超标量无序 CPU 产生一些奇怪的效果,就像“指责”等待数据的指令,而不是缓存未命中加载本身,例如。但关键是内核事件完全是每个内核的。非内核/L3 缓存事件计算有关共享资源的内容像L3缓存,所以更容易受到系统负载的干扰。)

另一点是,如果您在 CPU 内核上运行某些东西,Linux 不会想在那里安排其他任务。因此,您的后台负载将倾向于避免您的测试在哪个内核上运行,使其能够 100% 使用单个内核,而无需进行大量上下文切换。 (尽管网络/磁盘中断可能仍会在该核心上处理。)

所以,是的,您应该能够相当准确地衡量您的流程在非完全空闲的系统上运行时实际发生的情况。这可能与在完全空闲的系统上运行时发生的情况略有不同,但可能没有太大不同。特别是如果它是单线程的,或者您可以将其限制为少于所有内核,因此操作系统至少还剩下一个内核可以安排其他任务。