【问题标题】:perf_event_open and interval countingperf_event_open 和间隔计数
【发布时间】:2020-11-17 11:00:03
【问题描述】:

如果我有perf_event_open(&attr, tid, -1, -1, 0)

attr.sample_period = _interval; (1ms)
attr.sample_type = PERF_SAMPLE_CALLCHAIN;

这究竟是什么意思?这是否意味着当线程在任何 CPU 上花费 1 毫秒时,我的注册处理程序会通过调用链得到通知?如果线程在 CPU-1 上花费了 500us,现在在 CPU-2 上达到了 500us,那么信号 (SIGPROF) 会被 CPU 上运行的同一线程传播到进程的处理程序?

【问题讨论】:

    标签: linux perf


    【解决方案1】:

    根据the manual,它是每次事件周期过去时当前指令的堆栈回溯(因此是函数调用链)。 sample_max_stack 字段提供要存储的最大帧数,exclude_callchain_user/kernel 字段分别排除用户和内核空间帧。

    传递给perf_event_open()的第三个参数决定了要考虑哪个cpu:

    int perf_event_open(struct perf_event_attr *attr,
                               pid_t pid, int cpu, int group_fd,
                               unsigned long flags);
    

    当您为此参数传递 -1 时:

    pid > 0 和 cpu == -1 这会测量任何 CPU 上的指定进程/线程。

    注意:在英特尔架构上,性能监控单元 (PMU) 具有称为基于处理器事件的采样 (PEBS) 的功能和在计数器溢出条件下触发的性能监控中断 (PMI)。 PEBS 使用调试存储机制和 PMI 来存储处理器的一组架构状态信息。

    document 提供了有关 perf 运作方式的一些详细信息。采样周期以事件发生的次数表示,而不是计时器滴答数。

    document 提供了有关在多种硬件架构上实现采样方式的更多信息。

    【讨论】:

    • 是的,我已经阅读了文档。它没有解释如何计算时间.. 跨所有 CPU 一起计算 - 每个 CPU 使用一些全局缓冲区 - 一个线程在多个 CPU 上有缓冲区并且时间没有被收集......或者它的行为不同。
    • 在我的理解中,它不是时间而是事件的计数器。每次计数器达到给定值时,英特尔 PMU 计数器都能够发送中断 (PMI)。所以,我猜perf就是基于这个机制的。
    • 感谢有趣的文章。 man7.org/linux/man-pages/man2/perf_event_open.2.html - sample_period - 我知道通过 sample_period 就像一个事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多