我正在寻找有关gperftools如何工作的简单解释。到目前为止,这是我所学到的:
除了一般概述之外,这里还有一些我想回答的特定问题:
我问这个问题来解释在Go服务器上使用pprof引入的开销。
最佳答案
它是一个采样探查器。
基本上,有两种类型的分析:要么跟踪程序执行的所有操作(保持每次调用的计数,将每个函数包装在计时器中,换句话说,将代码渗透到您的仪器中),要么让它自己运行但只是不时地简要检查一下(取样)。
检测的问题在于它会改变程序的执行方式。它减慢了程序速度,同时也会扭曲结果。 (例如,生产代码可能花费太多时间等待IO,但是插装的代码可能不会显示此信息。)它还会收集比统计上必要的数据多得多的数据(如果最终您只关心确定大部分时间在哪里)花费)。
通过运行strace,您可以看到Google-perftools使用SIGPROF信号起作用(HPCToolkit和Open | SpeedShop也是如此)。大概它只是设置了一个事件处理程序,然后在内存中徘徊,不占用任何CPU周期,直到硬件/操作系统中断了您的程序(这可能很少发生),然后大概只是保存了调用堆栈的副本(并安排下一个中断),然后让控制权返回到您的程序。调用堆栈列出了程序要使用的功能(以及哪个父功能已调用该功能,以及“返回”语句的工作方式。)。