9

如何在 Go 程序中使用 pprof?

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

该文件说go tool pprof http://localhost:6060/debug/pprof/heap,这是行不通的。

而且,下面的_是什么意思?

import _ "net/http/pprof"

4

2 回答 2

11

根据您的评论,问题可能是您没有使用正确的端口号。

如果您正在运行 http 服务器http://localhost:9997,那么我认为您希望使用以下命令运行命令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 语言规范,这将只为它的副作用导入包。我认为,这些副作用包括执行包源文件中定义的init() 函数,显然还有已注册的变量

此外,您可能会发现这篇博文很有帮助:

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

于 2012-12-11T07:52:13.783 回答
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 初始化的副作用。这可能包括例如注册由 foo 提供的功能,以便在其他包中可用。一个具体的例子是特定的图像格式处理包(见底部的“子目录”)和抽象图像包。

于 2012-12-04T09:24:14.120 回答