我有最新的咖啡机,主要用作存储服务器。单独运行存储服务器时,每个核心(4 个核心)的平均工作负载约为 5-10%。
我想使用英特尔采样驱动程序在这台机器上运行工作负载的 vtune 测量。但是,考虑到存储服务器应用程序同时运行,我怀疑测量是否准确。
但是正如英特尔的文件所暗示的那样,采样驱动程序安装在 Linux 内核上,那么如果与其他应用程序同时运行,测量结果是否真的会不准确呢?换句话说,英特尔采样驱动程序究竟是如何工作的?他们是否能够区分工作负载进程和系统上运行的其他进程?
我有最新的咖啡机,主要用作存储服务器。单独运行存储服务器时,每个核心(4 个核心)的平均工作负载约为 5-10%。
我想使用英特尔采样驱动程序在这台机器上运行工作负载的 vtune 测量。但是,考虑到存储服务器应用程序同时运行,我怀疑测量是否准确。
但是正如英特尔的文件所暗示的那样,采样驱动程序安装在 Linux 内核上,那么如果与其他应用程序同时运行,测量结果是否真的会不准确呢?换句话说,英特尔采样驱动程序究竟是如何工作的?他们是否能够区分工作负载进程和系统上运行的其他进程?
如果 VTune 类似于使用的 Linux PAPI 子系统perf
,它基本上会在上下文切换时保存/恢复硬件事件计数器寄存器以及常规寄存器状态。所以事件喜欢instructions
并且uops_retired
应该不受影响。对其他事件的影响将是由于实际影响,例如额外的缓存未命中。
(硬件性能事件的基本机制是每个逻辑内核都有自己的可编程性能计数器,每次发生一些微体系结构事件时都会递增。如果一个溢出,它会引发一个中断以供驱动程序收集计数。或者对于perf record
功能类型, perf 或 VTune 会将它们编程为倒计时,因此定期触发中断,并在该点对保存的用户空间 RIP 进行采样。这会对超标量无序 CPU 产生一些时髦的效果,例如“责备”等待等待的指令例如,数据,而不是缓存未命中本身。但关键是核心内事件完全是每个核心的。非核心/ L3缓存事件计算有关共享资源的内容,例如L3缓存,因此更容易受系统负载干扰。)
另一点是,如果您在 CPU 内核上运行某些东西,Linux 不会希望在那里安排其他任务。因此,您的后台负载将倾向于避免您的测试在哪个内核上运行,使其能够使用 100% 的单个内核而无需大量上下文切换。(尽管网络/磁盘中断可能仍会在该核心上处理。)
所以,是的,您应该能够相当准确地测量您的进程在不是完全空闲的系统上运行时实际发生的情况。这可能与在完全空闲的系统上运行时会发生的情况有所不同,但可能差别不大。特别是如果它是单线程的,或者您可以将其限制为少于所有内核,因此操作系统至少还剩下一个可以安排其他任务。