2015-06-17 49 views
5

我正在寻找gperftools如何工作的简单解释。到目前为止,这是我所学到的:Gperftools如何在引擎盖下工作?

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

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

  • 是gperftools的 “event based profiler” 或 “instrumentation profiler”。据我所知,这些配置文件修改程序运行的方式并通过这些修改收集示例
  • 操作系统中的哪个“级别”确定gperftools配置文件?它是否像SystemTapperf那样描绘内核?
  • Gperftools是否可以安全地在高流量的生产服务器上运行?

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

回答

4

这是一个采样分析器。

基本上,有两种类型的性能分析:要么跟踪程序所做的一切(保持每次调用的计数,将每个函数包裹在计时器中,换句话说,用仪器渗透代码),否则你让它自己运行,但只是暂时检查一下它(抽样)。

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

通过运行strace,您可以看到Google-perftools使用SIGPROF信号(HPCToolkit和Open | SpeedShop)。据推测,它只是设置一个事件处理程序,然后在内存中徘徊,而不消耗任何CPU周期,直到硬件/操作系统中断您的程序(可能很少出现您喜欢的程序),然后推测它只会保存一份调用堆栈(并计划下一个中断),然后再让控制权返回到您的程序。调用堆栈列出了程序的功能(以及哪个父功能调用了该功能,因此,“return”语句的工作原理是什么..)。

+0

+1这并不是很好的理解,如何信息堆栈样本实际是如何,特别是如果个别的检查。可悲的是,这种缺乏理解会导致一个普遍的假设,即需要大量的这些假设,因此必须对它们进行总结(自我时间,累积时间,呼叫图,火焰图等)。这很容易大型加速器可以隐藏在这些摘要中,但是他们无法掩盖程序员仅仅检查少量样本的情况。 [* Examples。*](http://stackoverflow.com/a/25870103/23771) –

+0

SIGPROF由间隔计时器生成,['setitimer()'](http://man7.org/linux/man -pages/man2/setitimer.2.html) - https://github.com/gperftools/gperftools/blob/7822b5b0b9fa7e016e1f6b46ea86f26f4691a457/src/profile-handler.cc#L482'setitimer(timer_type_,&timer,0);' – osgx