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

Vtune: Accuracy of Intel sampling drivers when vtune measurement run on a machine running other tasks

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

我想 运行 使用 Intel 采样驱动程序对这台机器上的工作负载进行 vtune 测量。但是,鉴于存储服务器应用程序同时 运行ning.

,我怀疑测量结果是否准确

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

如果 VTune 类似于 perf 使用的 Linux PAPI 子系统,它基本上 saves/restores HW 事件计数器在上下文切换时与常规寄存器状态一起注册。所以像 instructionsuops_retired 这样的事件应该不受影响。对其他事件的影响将归因于实际 影响,例如额外的缓存未命中。

(硬件性能事件的基本机制是每个逻辑内核都有自己的可编程性能计数器,每次发生一些微体系结构事件时该计数器都会递增。如果溢出,它会引发中断以供驱动程序收集计数。或者对于 perf record 类型的功能,perf 或 VTune 会对它们进行编程以进行倒计时,因此会定期触发中断,并在该点对保存的用户 space RIP 进行采样。这会在超标量输出上产生一些时髦的效果-of-order CPU,例如“责怪”等待数据的指令,而不是缓存未加载本身。但关键是核心内事件完全是每个核心的。 uncore / L3 缓存事件计算有关 L3 缓存等共享资源的内容,因此更容易受到系统负载的干扰。)

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

所以是的,当它 运行 在一个并非完全空闲的系统上时,您应该能够相当准确地测量过程中实际发生的事情。这可能与在完全空闲的系统上 运行 时发生的情况有些不同,但可能差别不大。特别是如果它是单线程的,或者您可以将它限制在少于所有内核的情况下,那么至少还有一个供 OS 安排其他任务。