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

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

  • 除了一般概述之外,这里还有一些我想回答的特定问题:
  • 是gperftools的“event based profiler”还是“instrumentation profiler”。据我了解,这些事件探查器通过这些修改来修改程序的运行方式并收集样本
  • gperftools在操作系统的哪个“级别”上进行配置?它是否像SystemTapperf一样描述了内核?
  • gperftools是否可以在高流量的生产服务器上安全运行?

  • 我问这个问题来解释在Go服务器上使用pprof引入的开销。

    最佳答案

    它是一个采样探查器。

    基本上,有两种类型的分析:要么跟踪程序执行的所有操作(保持每次调用的计数,将每个函数包装在计时器中,换句话说,将代码渗透到您的仪器中),要么让它自己运行但只是不时地简要检查一下(取样)。

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

    通过运行strace,您可以看到Google-perftools使用SIGPROF信号起作用(HPCToolkit和Open | SpeedShop也是如此)。大概它只是设置了一个事件处理程序,然后在内存中徘徊,不占用任何CPU周期,直到硬件/操作系统中断了您的程序(这可能很少发生),然后大概只是保存了调用堆栈的副本(并安排下一个中断),然后让控制权返回到您的程序。调用堆栈列出了程序要使用的功能(以及哪个父功能已调用该功能,以及“返回”语句的工作方式。)。

    09-07 10:47