Package pprof

import "runtime/pprof"
Overview
Index
Subdirectories

Overview ▾

软件包pprof以pprof可视化工具所需的格式写入运行时概要分析数据.

Profiling a Go program

对Go程序进行性能分析的第一步是启用性能分析. go测试内置了对使用标准测试包构建的性能分析基准的支持. 例如,以下命令在当前目录中运行基准测试,并将CPU和内存配置文件写入cpu.prof和mem.prof:

go test -cpuprofile cpu.prof -memprofile mem.prof -bench .

要将等效的概要分析支持添加到独立程序中,请将以下代码添加到主函数中:

var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to `file`")
var memprofile = flag.String("memprofile", "", "write memory profile to `file`")

func main() {
    flag.Parse()
    if *cpuprofile != "" {
        f, err := os.Create(*cpuprofile)
        if err != nil {
            log.Fatal("could not create CPU profile: ", err)
        }
        defer f.Close()
        if err := pprof.StartCPUProfile(f); err != nil {
            log.Fatal("could not start CPU profile: ", err)
        }
        defer pprof.StopCPUProfile()
    }

    // ... rest of the program ...

    if *memprofile != "" {
        f, err := os.Create(*memprofile)
        if err != nil {
            log.Fatal("could not create memory profile: ", err)
        }
        defer f.Close()
        runtime.GC() // get up-to-date statistics
        if err := pprof.WriteHeapProfile(f); err != nil {
            log.Fatal("could not write memory profile: ", err)
        }
    }
}

还有一个用于分析数据的标准HTTP接口. 添加以下行将在/ debug / pprof / URL下安装处理程序以下载实时配置文件:

import _ "net/http/pprof"

有关更多详细信息,请参见net / http / pprof软件包.

然后可以使用pprof工具显示配置文件:

go tool pprof cpu.prof

pprof命令行提供了许多命令. 常用的命令包括" top"和" web",其中" top"打印最热门的程序热点的摘要," web"打开热点的交互式图形及其调用图. 使用"帮助"获得所有pprof命令的信息.

有关pprof的更多信息,请参见https://github.com/google/pprof/blob/master/doc/README.md .

func Do 1.9

func Do(ctx context.Context, labels LabelSet, f func(context.Context))

用父上下文的副本调用f,并将给定标签添加到父上下文的标签图中. 执行f时产生的Goroutine将继承扩展的标签集. 标签中的每个键/值对均按提供的顺序插入标签映射,从而覆盖了同一键的所有先前值. 扩展标签图将在对f的调用期间进行设置,并在f返回后恢复.

func ForLabels 1.9

func ForLabels(ctx context.Context, f func(key, value string) bool)

ForLabels在上下文上设置了每个标签的情况下调用f. 函数f应该返回true继续迭代,或者返回false提前停止迭代.

func Label 1.9

func Label(ctx context.Context, key string) (string, bool)

Label返回带有ctx上给定键的标签的值,以及一个指示该标签是否存在的布尔值.

func SetGoroutineLabels 1.9

func SetGoroutineLabels(ctx context.Context)

SetGoroutineLabels设置当前goroutine的标签以匹配ctx. 一个新的goroutine继承了创建它的goroutine的标签. 这是比Do低的API,应尽可能使用Do.

func StartCPUProfile

func StartCPUProfile(w io.Writer) error

StartCPUProfile启用当前进程的CPU性能分析. 进行概要分析时,概要文件将被缓冲并写入w. 如果已启用概要分析,则StartCPUProfile将返回错误.

在类似Unix的系统上,默认情况下,对于使用-buildmode = c-archive或-buildmode = c-shared构建的Go代码,StartCPUProfile默认情况下不起作用. StartCPUProfile依赖于SIGPROF信号,但是该信号将传递到主程序的SIGPROF信号处理程序(如果有),而不是Go所使用的信号处理程序. 要使其工作,请为syscall.SIGPROF调用os / signal.Notify,但请注意,这样做可能会破坏主程序执行的任何性能分析.

func StopCPUProfile

func StopCPUProfile()

StopCPUProfile stops the current CPU profile, if any. StopCPUProfile only returns after all the writes for the profile have completed.

func WithLabels 1.9

func WithLabels(ctx context.Context, labels LabelSet) context.Context

WithLabels返回一个新的context.Context添加了给定的标签. 标签用相同的密钥覆盖先前的标签.

func WriteHeapProfile

func WriteHeapProfile(w io.Writer) error

WriteHeapProfile是Lookup(" heap").WriteTo(w,0)的简写. 保留它是为了向后兼容.

type LabelSet 1.9

LabelSet是一组标签.

type LabelSet struct {
    // contains filtered or unexported fields
}

func Labels 1.9

func Labels(args ...string) LabelSet

标签采用偶数个表示键值对的字符串,并创建一个包含它们的LabelSet. 标签用相同的密钥覆盖先前的标签. 当前,只有CPU配置文件使用标签信息. 有关详细信息,请参见https://golang.org/issue/23458 .

type Profile

配置文件是堆栈跟踪的集合,显示了导致特定事件(例如分配)实例的调用序列. 包可以创建和维护自己的配置文件; 最常见的用途是跟踪必须显式关闭的资源,例如文件或网络连接.

可以同时从多个goroutine中调用Profile的方法.

每个配置文件都有一个唯一的名称. 预定义了一些配置文件:

goroutine    - stack traces of all current goroutines
heap         - a sampling of memory allocations of live objects
allocs       - a sampling of all past memory allocations
threadcreate - stack traces that led to the creation of new OS threads
block        - stack traces that led to blocking on synchronization primitives
mutex        - stack traces of holders of contended mutexes

这些预定义的配置文件会保持自身状态,并对显式的Add或Remove方法调用感到恐慌.

堆概要文件报告截至最近完成的垃圾收集的统计信息; 它避免了最近的分配,以避免使配置文件偏离实时数据并向垃圾方向倾斜. 如果根本没有垃圾回收,则堆概要文件将报告所有已知分配. 此异常主要在未启用垃圾收集的情况下运行的程序中提供帮助,通常是出于调试目的.

堆概要文件跟踪应用程序内存中所有活动对象以及自程序启动以来分配的所有对象的分配站点. Pprof的-inuse_space,-inuse_objects,-alloc_space和-alloc_objects标志选择要显示的显示对象,默认为-inuse_space(活动对象,按大小缩放).

allocs配置文件与堆配置文件相同,但是将默认pprof显示更改为-alloc_space,这是自程序开始以来分配的字节总数(包括垃圾收集的字节).

CPU配置文件不能用作配置文件. 它具有特殊的API,即StartCPUProfile和StopCPUProfile函数,因为它在性能分析期间将输出流传输到写入器.

type Profile struct {
    // contains filtered or unexported fields
}

func Lookup

func Lookup(name string) *Profile

查找将返回具有给定名称的配置文件,如果不存在此配置文件,则返回nil.

func NewProfile

func NewProfile(name string) *Profile

NewProfile使用给定名称创建一个新的配置文件. 如果已经存在具有该名称的配置文件,则NewProfile会出现紧急情况. 惯例是使用"导入/路径". 前缀为每个包创建单独的名称空间. 为了与读取pprof数据的各种工具兼容,配置文件名称不应包含空格.

func Profiles

func Profiles() []*Profile

概要文件返回所有已知概要文件的一部分,按名称排序.

func (*Profile) Add

func (p *Profile) Add(value interface{}, skip int)

Add将当前执行堆栈添加到配置文件中,并与value关联. Add将值存储在内部映射中,因此该值必须适合用作映射键,并且在相应调用Remove之前不会被垃圾回收. 如果配置文件已包含值堆栈,请添加恐慌.

skip参数与runtime的含义相同.Caller的skip可以控制堆栈跟踪的开始位置. 传递skip = 0会在调用Add的函数中开始跟踪. 例如,给定以下执行堆栈:

Add
called from rpc.NewClient
called from mypkg.Run
called from main.main

传递skip = 0将在调用rpc.NewClient内的Add时开始堆栈跟踪. 传递skip = 1时,将在对mypkg.Run中对NewClient的调用处开始堆栈跟踪.

func (*Profile) Count

func (p *Profile) Count() int

Count返回配置文件中当前的执行堆栈数.

func (*Profile) Name

func (p *Profile) Name() string

名称返回此配置文件的名称,该名称可以传递给查找以重新获取该配置文件.

func (*Profile) Remove

func (p *Profile) Remove(value interface{})

删除将从配置文件中删除与值关联的执行堆栈. 如果该值不在配置文件中,则为空操作.

func (*Profile) WriteTo

func (p *Profile) WriteTo(w io.Writer, debug int) error

WriteTo将pprof格式的配置文件快照写入w. 如果写入w返回错误,则WriteTo返回该错误. 否则,WriteTo返回nil.

debug参数启用其他输出. 传递debug = 0只会打印pprof所需的十六进制地址. 传递debug = 1会在地址中添加注释,这些注释会将地址翻译为函数名称和行号,以便程序员无需工具即可阅读配置文件.

预定义的配置文件可以为其他调试值分配含义; 例如,当打印" goroutine"配置文件时,debug = 2表示以与Go程序死于不可恢复的恐慌时使用的形式打印goroutine堆栈.

Bugs

Subdirectories

Name Synopsis
..

by  ICOPY.SITE