问题标签 [intel-pmu]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - 为什么 mov reg,reg 指令读取负载结果会占用性能记录这么多的周期?
我正在使用 perf 工具在 Linux 中分析我的程序,当检查报告时,我发现一个地方真的让我感到困惑。我在下面附上几行报告:
我的困惑是为什么这条线(mov %r8,%11
)花费这么多时间,据我了解,这条指令只将寄存器中的数据移动%r8
到%r11
. 中的数据%r8
加载到位置451acb。
我的猜测是这条指令 ( mov (%rdi),%r8d
) 只是触发了一个读取动作,但实际上并没有“阻塞”,当指令需要使用寄存器的内容时r8
,它会“阻塞”直到内容被加载到 CPU 缓存中。
我的问题是我猜对了吗?
CPU : 英特尔 E5-2660 v4
c - ARM PMU 周期计数器的值不一致
我正在尝试使用 pmu 在 linux 内核中测量我的代码的性能。首先,我想测试 pmu,因此在内核中创建了简单的耦合操作循环。我将它置于禁用中断的自旋锁下,因此我的测试代码不能被抢占。然后我打印了循环计数器来检查这个循环需要多少 CPU 周期。但我在每次打印时看到的值非常不同:100、500、1000、200,......我的问题是:为什么我每次看到的值都如此不同?PS:与循环计数器相反,pmu 的指令计数器是稳定的,我每次看到的值都相同。我也尝试使用 arm 计时器,但它也显示了与 pmu 的周期计数器类似的不同值。以下是我使用 ARM 计时器测量性能的方法:
和真实设备上的输出是(皮质 A-57):
memory - 为什么较新的英特尔 CPU 不支持停滞周期后端的性能计数器?
我正在使用内存预取来对抗内存延迟。来自 Intel 的一些(较旧的)CPU 支持性能计数器,用于计算 CPU 因等待内存 ( stalled-cycles-backend
) 而浪费的周期,例如 Intels E5-2690
。
在较新的 CPU(例如)上Gold 6230
,Gold 6226
我找不到这个计数器。是否有另一种方法来计算 CPU 在等待内存控制器加载缓存线时浪费的周期?
performance - 使用 perf 基于可变事件计数的采样
每当特定事件计数器使用 perf 溢出时,我都会尝试读取 PMU 事件计数器。我知道 perf 适用于固定的采样周期。我正在寻找的是每次在应用程序中以不同的采样周期读取 PMU 计数器的可能性。?是的,我有一个要求可变采样周期的要求。例如,如果一个应用程序有 1000 条指令。我想在 200、150、300、50、150、100、50 条指令处读取 PMU 事件计数器。任何方向都会非常有帮助。
performance - 在采样模式下使用 perf 时从 mmap 共享内存中读取
我有一个父进程分叉一个子进程,该进程在采样模式下使用 perf 进行分析(每 N 个事件采样一次)。正在生成大约 10000 个样本。我知道通过使用 mmap() 我们可以访问存储样本的共享内存。但是,在生成样本或将样本写入mmap
ed 部分时,其他孩子是否可以访问这些样本?如果是这样,怎么做?这样我就减少了分配大量内存的需要。
monitoring - windows 7上的pmi句柄问题
我正在尝试在计数器溢出时设置性能监控中断以收集一些信息。为此,我创建了驱动程序。我跳过了一些不相关的代码部分。
驱动程序.c
pmihandle.asm
句柄.c
我打开计数器的main.c应用程序
当我启动应用程序时,我的电脑死机(不响应鼠标移动和按键)。
但是,如果我使用汇编指令 INT 生成中断就可以了。
我通过 WinDbg 检查了 IDT 和 LVT 条目,它们是正确的。
可能是什么问题呢?
一些信息:我的处理器是 Intel Core i5-3210M。操作系统视窗 7 x64。我在笔记本电脑上这样做。
kernel - 如何在虚拟化环境中启用英特尔处理器跟踪 (IPT)?
我试图在虚拟机中运行 Alex Ionescu 的WinIPT 界面,但没有成功。(这是运行 Windows 10 VM 的 Windows 10 Pro 主机,两者都是 18363 更新)
我已经在主机上成功构建并运行了 Intel 的驱动程序以及 Alex 的工具链,并使用 ptxed 处理了跟踪。我还运行了 Intel 的cpuid实用程序,并验证了主机上的 INTEL_PROCESSOR_TRACE 功能是否处于活动状态。但是,当我在 VM 中运行该实用程序时,它不会显示 INTEL_PROCESSOR_TRACE 标志,实际上,驱动程序会返回一个错误,表明该功能未启用。
我尝试在几个不同的虚拟环境中运行相同的设置,包括最新版本的 VirtualBox、VMWare Workstation 和 Hyper-V。
当我启用 Hyper-V 平台时,它会静默禁用主机上的 INTEL_PROCESSOR_TRACE 功能。
VMWare Workstation 没有直接禁用它,但是当我在启动 VM 后尝试在主机上再次运行我的跟踪工具时,它抛出了一个 BSoD,所以我对此并不抱太大希望。
VirtualBox 至少没有带走任何功能,但即使我启用了 VT-x 直通选项,它仍然没有设置启用 IPT 的标志。
根据微软的说法,理论上存在一个在 Hyper-V 中启用此功能的过程,尽管我遇到了上述问题,它最终在我的主机上被禁用:
有没有人让这个工作?我更喜欢我当前环境中的解决方案(Windows 主机上的 Windows VM),但我很感激在 Linux 上使用 perf 或任何其他方法的任何见解。我还发现了 2017 年的一些帖子和问题,表明 IPT “尚未”得到支持,但在过去一年左右没有任何支持。技术和架构似乎仍在不断发展,所以我真的很想知道是否有人以任何形式取得了成功,以及关于该做什么或避免做什么的任何见解。
其他资源:
英特尔处理器跟踪的背景: 处理器跟踪
编辑添加(2/10/2020)
更仔细地查看 Microsoft 说明,他们提到您需要“支持 IPT 和 PT2GPA 功能的 Intel 处理器”才能在虚拟机中启用 IPT。 据英特尔称,他们列出的唯一支持 PT2GPA 的架构是 Ice Lake。
我目前正在使用的计算机正在运行早期的微架构(Coffee Lake),这可以解释我在主机上看到 IPT 正常的行为。任何人都可以确认他们可以在更新的处理器上使用它吗?
profiling - 使用 perf 工具测量挂钟时间的最佳事件计数器
简单但复杂的问题:
使用什么计数器来获取性能工具来测量挂钟时间?
作为基线,我认为在分析代码时需要测量的第一件事就是挂钟时间,以初步了解代码大部分时间在哪里。我不在乎它是否是 IO 或带宽限制或其他我只想知道它慢的地方。
听起来很简单的要求,但现代 CPU 为高效工作而采取的所有技巧(如频率缩放等)以及 perf 中可用的大量不同(没有很好记录的)性能计数器,要确保测量正确并不容易事物。
目前我做:
我认为这是未缩放的 CPU 频率,因此与部分代码运行的挂钟时间量成正比。但是谁知道呢?
performance - 使用 PERF_EVENT_IOC_PERIOD 在运行时更改采样周期
我在 pi 3b 上使用 raspbian Linux 4.9.78-v7+。
我正在使用 perf 进行一些性能实验。
我正在尝试使用PERF_EVENT_IOC_PERIOD
perf 来更改流程运行时的时间段。
struct perf_event_attr
我在数据结构 中设置了初始采样周期。
我想pe.sample_period
在每个样本之后覆盖属性中的这个初始采样周期。
我使用信号来捕获溢出,并使用用户定义的处理程序来更改使用PERF_EVENT_IOC_PERIOD
. 但ioctl(fd, PERF_EVENT_IOC_PERIOD, interval);
不起作用。相反,我在初始采样期间获取样本。
真的有用吗PERF_EVENT_IOC_PERIOD
。?使用PERF_EVENT_IOC_PERIOD
.
我的示例代码如下。
代码基于 此处提供的示例
linux-kernel - 如何读取 x86 intel 处理器的 PMC(Performance Monitoring Counter)
我的桌面是带有 Ubuntu 操作系统的 Intel x86_64 处理器。
我知道有 perf 工具可以获取程序的统计信息列表。但我想做的是直接读取性能计数器而不使用 perf 工具。
- 第一个问题
第一个问题是我从 Github 下载了这段代码:Github Code Reference。
它使用 linux-headers-5.3.0-40-generic 内核成功编译,没有任何错误。一旦我使用“insmod”.ko 文件,系统就会挂起。检查 dmesg 时未插入 .ko 文件,因此在对 .ko 文件执行“insmod”后必须停止它。发生这种情况是因为我尝试了未经授权的访问吗?如果有我可以尝试的建议,我很高兴听到。
对应的代码如下。
- 第二个问题
第二个问题是我在我的 Ubuntu 桌面上使用 linux-headers-5.3.0-40-generic 内核版本。我从 kernel.org 下载了内核代码版本 5.5.3。我彻底遵循了 5.5.3 内核代码中给出的 perf 代码,发现 linux-5.5.3/arch/x86/events/intel 目录下的 core.c 文件实际上是在设置和读取性能计数器。我使用 core.c 文件内容将其作为模块来读取性能计数器。当我编译它时,它会产生一堆错误,因为我使用 linux-headers-5.3.0-40-generic 来构建模块,但是我的 ubuntu 内核没有从内核代码链接到 core.c 文件的所有头文件来自 kernel.org。
如何让我的 Ubuntu 内核使用从 kernel.org 链接到 core.c 的所有文件并构建 .ko 文件?
或者是否有任何具有 x86 性能计数器读数的模块源代码可以用作参考?
提前谢谢你的帮助。