如何在Go程序中使用pprof

11

如何在Go程序中使用pprof?

有一个名为net/http/pprof的Go包,但我不知道如何使用它。

文档说要用go tool pprof http://localhost:6060/debug/pprof/heap命令,但是这样无法正常工作。

还有,下划线_代表什么意思?

import _ "net/http/pprof"

2个回答

11
根据您的评论,问题可能是您没有使用正确的端口号。
如果您正在运行位于http://localhost:9997的http服务器,则认为您想要使用http://localhost:9997运行命令。
$ go tool pprof http://localhost:9997/debug/pprof/heap

根据net/http/pprof pkg doc page,如果您的应用程序已经运行http服务器,则无需启动服务器,只需要在程序中的某个位置包含import _ "net/http/pprof"即可。 http://localhost:6060 是作为示例启动的服务器,主机和端口是任意的。 import _ "net/http/pprof" 表示导入了该包,但您不使用其任何导出标识符。根据go language spec,这将仅为其副作用导入包。这些副作用涉及我认为在package's source files中定义的init() functions的执行和明显的registered variables
此外,您可能会发现这篇博客文章有所帮助:

http://blog.golang.org/2011/06/profiling-go-programs.html


2
“不工作”是什么意思?期望的结果是什么,实际观察到的是什么?
运行
$ go tool pprof -h

想要查看此工具的版本帮助信息。我的本地版本既不是最新的,也不是正式版(即中间版本)。它显示:

(10:16) jnml@fsc-r550:~$ go tool pprof -h
Option h is ambiguous (heapcheck, help)
Invalid option(s)

Usage:
pprof [options] <program> <profiles>
   <profiles> is a space separated list of profile names.
pprof [options] <symbolized-profiles>
   <symbolized-profiles> is a list of profile files where each file contains
   the necessary symbol mappings  as well as profile data (likely generated
   with --raw).
pprof [options] <profile>
   <profile> is a remote form.  Symbols are obtained from host:port/pprof/symbol

   Each name can be:
   /path/to/profile        - a path to a profile file
   host:port[/<service>]   - a location of a service to get profile from

   The /<service> can be /pprof/heap, /pprof/profile, /pprof/pmuprofile,
                         /pprof/growth, /pprof/contention, /pprof/wall,
                         /pprof/thread, or /pprof/filteredprofile.
   For instance:
     pprof http://myserver.com:80/pprof/heap
   If /<service> is omitted, the service defaults to /pprof/profile (cpu profiling).
pprof --symbols <program>
   Maps addresses to symbol names.  In this mode, stdin should be a
   list of library mappings, in the same format as is found in the heap-
   and cpu-profile files (this loosely matches that of /proc/self/maps
   on linux), followed by a list of hex addresses to map, one per line.

   For more help with querying remote servers, including how to add the
   necessary server-side support code, see this filename (or one like it):

   /usr/doc/google-perftools-1.5/pprof_remote_servers.html

Options:
   --cum               Sort by cumulative data
   --base=<base>       Subtract <base> from <profile> before display
   --interactive       Run in interactive mode (interactive "help" gives help) [default]
   --seconds=<n>       Length of time for dynamic profiles [default=30 secs]
   --add_lib=<file>    Read additional symbols and line info from the given library
   --lib_prefix=<dir>  Comma separated list of library path prefixes

Reporting Granularity:
   --addresses         Report at address level
   --lines             Report at source line level
   --functions         Report at function level [default]
   --files             Report at source file level

Output type:
   --text              Generate text report
   --callgrind         Generate callgrind format to stdout
   --gv                Generate Postscript and display
   --web               Generate SVG and display
   --list=<regexp>     Generate source listing of matching routines
   --disasm=<regexp>   Generate disassembly of matching routines
   --symbols           Print demangled symbol names found at given addresses
   --dot               Generate DOT file to stdout
   --ps                Generate Postcript to stdout
   --pdf               Generate PDF to stdout
   --svg               Generate SVG to stdout
   --gif               Generate GIF to stdout
   --raw               Generate symbolized pprof data (useful with remote fetch)

Heap-Profile Options:
   --inuse_space       Display in-use (mega)bytes [default]
   --inuse_objects     Display in-use objects
   --alloc_space       Display allocated (mega)bytes
   --alloc_objects     Display allocated objects
   --show_bytes        Display space in bytes
   --drop_negative     Ignore negative differences

Contention-profile options:
   --total_delay       Display total delay at each region [default]
   --contentions       Display number of delays at each region
   --mean_delay        Display mean delay at each region

Call-graph Options:
   --nodecount=<n>     Show at most so many nodes [default=80]
   --nodefraction=<f>  Hide nodes below <f>*total [default=.005]
   --edgefraction=<f>  Hide edges below <f>*total [default=.001]
   --focus=<regexp>    Focus on nodes matching <regexp>
   --ignore=<regexp>   Ignore nodes matching <regexp>
   --scale=<n>         Set GV scaling [default=0]
   --heapcheck         Make nodes with non-0 object counts
                       (i.e. direct leak generators) more visible

Miscellaneous:
   --tools=<prefix>    Prefix for object tool pathnames
   --test              Run unit tests
   --help              This message
   --version           Version information

Environment Variables:
   PPROF_TMPDIR        Profiles directory. Defaults to $HOME/pprof
   PPROF_TOOLS         Prefix for object tools pathnames

Examples:

pprof /bin/ls ls.prof
                       Enters "interactive" mode
pprof --text /bin/ls ls.prof
                       Outputs one line per procedure
pprof --web /bin/ls ls.prof
                       Displays annotated call-graph in web browser
pprof --gv /bin/ls ls.prof
                       Displays annotated call-graph via 'gv'
pprof --gv --focus=Mutex /bin/ls ls.prof
                       Restricts to code paths including a .*Mutex.* entry
pprof --gv --focus=Mutex --ignore=string /bin/ls ls.prof
                       Code paths including Mutex but not string
pprof --list=getdir /bin/ls ls.prof
                       (Per-line) annotated source listing for getdir()
pprof --disasm=getdir /bin/ls ls.prof
                       (Per-PC) annotated disassembly for getdir()

pprof http://localhost:1234/
                       Enters "interactive" mode
pprof --text localhost:1234
                       Outputs one line per procedure for localhost:1234
pprof --raw localhost:1234 > ./local.raw
pprof --text ./local.raw
                       Fetches a remote profile for later analysis and then
                       analyzes it in text mode.

FATAL ERROR: Invalid option(s)
go tool pprof: exit status 1
(10:16) jnml@fsc-r550:~$ 

关于第二个问题:`import _ "foo"` 这种方式仅导入包 foo 的初始化副作用。这可能包括将由 foo 提供的功能注册到其他包中可用。一个具体的例子是特定的图像格式处理包(请参见“子目录”底部)和抽象的image包。

3
我有一个用 Go 语言编写的服务器 API,并且想要对其进行优化。当我启动服务器监听 localhost:9997 时,如何使用 pprof 进行性能分析?我使用命令 go tool pprof http://localhost:6060/debug/pprof/heap,但是得到了以下错误信息:go tool pprof http://localhost:6060/debug/pprof/heap Read http://localhost:6060/debug/pprof/symbol Use of uninitialized value in substitution (s///) at /usr/local/go/pkg/tool/linux_amd64/pprof line 2957. http://localhost:6060/debug/pprof/symbol doesn't exist go tool pprof: exit status 1 - Codefor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接