gperftools 是如何工作的?

How does gperftools work under the hood?

我正在寻找 gperftools 工作原理的简单说明。到目前为止,这是我学到的:

除了一般概述之外,这里还有一些我想回答的具体问题:

我问这个问题是为了推断在 Go 服务器上使用 pprof 引入的开销。

它是一个采样分析器。

基本上,有两种类型的分析:要么跟踪程序所做的一切(记录每次调用,将每个函数包装在计时器中,换句话说,用你的工具渗透代码)要么你让它 运行 自己但只是不时地检查一下(取样)。

检测的问题在于它改变了程序的执行方式。它会减慢程序速度,同时也会扭曲结果。 (例如,生产代码可能在等待 IO 上花费了太多时间,但经过检测的代码可能不会表现出这一点。)它还收集了比统计上必要的多得多的数据(如果最终你关心的只是确定大部分时间在哪里花了)。

通过 运行ning strace,您可以看到 Google-perftools 使用 SIGPROF 信号工作(HPCToolkit 和 Open|SpeedShop 也是如此)。据推测它只是设置一个事件处理程序然后在内存中徘徊,不消耗任何 CPU 周期,直到 hardware/OS 中断你的程序(这可以像你喜欢的那样不频繁),然后大概它只是保存在将控制 return 交给您的程序之前,调用堆栈的副本(并安排下一个中断)。调用堆栈列出了您的程序执行的函数(以及哪个父函数调用了该函数,等等,这就是 "return" 语句的工作方式......)。