gperftools如何在引擎盖下工作?

Ben*_*ler 7 google-perftools gperftools pprof

我正在寻找一个关于gperftools如何工作的简单解释.到目前为止,这是我所学到的:

  • 它运行一个世界各地的采样器.换句话说,它会定期停止正在分析的程序以收集信息.
  • Golang的pprof库使用下面的gperftools.

除了一般概述,以下是我想回答的一些具体问题:

  • gperftools是" 基于事件的分析器 "还是" 仪器分析器 ".据我所知,这些分析器修改程序运行的方式并通过这些修改收集样本
  • 在操作系统的"级别"中,gperftools的配置文件是什么?它是否像SystemTapperf一样描述核心?
  • gperftools可以安全地在高流量的生产服务器上运行吗?

我问这个问题来推断在Go服务器上使用pprof引入的开销.

ben*_*min 5

它是一个抽样分析器.

基本上,有两种类型的分析:要么跟踪程序所做的一切(保持每个调用的计数,将每个函数包装在一个计时器中,换句话说,用你的乐器渗透代码),否则你让它自己运行但是不时地对它进行简单检查(取样).

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

通过运行strace,您可以看到Google-perftools使用SIGPROF信号(如HPCToolkit和Open | SpeedShop).据推测,它只是设置一个事件处理程序,然后在内存中徘徊,不消耗任何CPU周期,直到硬件/操作系统中断你的程序(这可能是你喜欢的偶然),然后可能只是保存了一个调用堆栈的副本(并安排下一个中断)然后让控制权返回到您的程序.调用堆栈列出了程序的功能(以及调用了哪个父函数,以及"返回"语句的工作原理.).