构建自己的分析器:如何捕捉事件?

Posted

技术标签:

【中文标题】构建自己的分析器:如何捕捉事件?【英文标题】:Building your own profiler: how to catch events? 【发布时间】:2011-07-25 14:17:54 【问题描述】:

我无法真正得到this question 的答案,所以我将尝试编写一个自定义的,虽然简单的分析器。只是开始:假设我需要在不重新编译的情况下找出运行我的代码的(以及哪个)核心。假设我还想捕捉给定函数的执行时间。最后,关于处理线程的任何想法?关于如何开始的任何其他提示? C 是我选择的语言,我正在运行 Linux。谢谢。

编辑:我分析过的 Oprofile、CallGrind、Helgrind、gprof、papi、tau 和其他似乎不符合我的需求。

【问题讨论】:

您的需求是什么?请详细解释它们,甚至可以举例说明您想要得到什么。这是因为您将所有流行的分析器都列为“不符合您的需求”。 对,对不起。所以,我希望每个线程:时间、tid、运行的 cpu、线程状态等。 你想要“样品”吗,例如每 1 毫秒检查一次 CPU 上的线程是否处于活动状态以及哪个函数处于活动状态? 【参考方案1】:

我确定之前you've seen this。

我发现区分两个不同的目标很有帮助:

测量各种事情需要多长时间,以便您进行演示。作为本演示文稿的一部分,您可能会说“看起来 frob 例程花费了太多时间,或者被调用了太多次,建议我们尝试加快速度或少叫它。”

精确定位 1) 不必要且 2) 值得修复的代码或指令行,因为它们将节省很大一部分执行时间。

我怀疑总体目标是后者。 但要做到这一点,测量是一种非常间接的方法。 相反,您可以利用这样一个事实,即如果某些东西浪费了足够多的时间而值得一看,您可以通过拍摄程序状态的快照来简单地抓住它

因此,您进行测量并不是为了找出需要时间的事情。 这需要时间这一事实正是它毫不含糊地暴露出来,不涉及建议

Zoom is a profiler 以这种方式工作。 LTProf 也是如此。 我曾经构建过一个,但坦率地说,我认为手动方法,虽然更多的工作,is more effective,因为它让我更加思考为什么程序会做它正在做的事情。

【讨论】:

谢谢,迈克。是的,我会看到您链接到的第一个答案。我并不是真的想以通常意义上的寻找瓶颈的方式进行分析。我想要分析的是线程:它们在哪里执行、它们的状态(R、S、...)、正在消耗多少 CPU,等等。我想要一个线程的总体图景。我明白你在说什么。 “手工”劳动,但这就是我迄今为止一直在做的事情(我从事算法研究),我想要一个更通用的解决方案:我编写了一个 30 LOC 的算法,而分析又增加了 100+ LOC!谢谢。 @Dervin:lsstackpstack 是否提供您想要的信息?它可以在一个单独的进程中循环运行。 pstack 必须附加到正在运行的进程,据我所知。我需要一个时间敏感的跟踪。我找不到lsstack @Dervin:看起来它可以处理bunch of processes/threads。【参考方案2】:

你应该试试linux的性能https://perf.wiki.kernel.org/index.php/Tutorial 这个工具有来自内核的直接支持,并且知道页面错误、CPU 迁移、上下文切换(例如查看perf stat 输出)。此统计信息可以按进程或按 CPU 汇总。 perf record 可以像 oprofile 一样使用。

要添加简单的分析,您可以使用setitimer(采样信号是进程范围的)或timer_create(可以为线程安装定时器信号)。您无法直接获取有关线程使用的物理 cpu 数量的信息,但在每个示例中,您可以使用 getrusageRUSAGE_THREAD 对每个线程运行时间。

【讨论】:

以上是关于构建自己的分析器:如何捕捉事件?的主要内容,如果未能解决你的问题,请参考以下文章

如何将每个 Jenkins 构建链接到它自己的 SonarQube 分析版本?

Chromium网页输入事件捕捉和手势检测过程分析

Chromium网页输入事件捕捉和手势检測过程分析

数据分析师如何构建自己的网气 IP

使用 redis “捕捉” “用户登录过期” 事件

企业如何基于Serverless构建自己的云上应用 | GMTC