英文:
How to use pprof in Go program
问题
如何在Go程序中使用pprof?
有一个名为net/http/pprof的Go包,但我无法使用它。
文档中说go tool pprof http://localhost:6060/debug/pprof/heap
,但这并不起作用。
还有,下划线(_)代表什么意思?
import _ "net/http/pprof"
英文:
How to use pprof in Go program?
There is a Go package named net/http/pprof,but I can't use it.
The document says go tool pprof http://localhost:6060/debug/pprof/heap
,which does not work.
And,what does the below _ mean?
import _ "net/http/pprof"
答案1
得分: 11
根据你的评论,问题可能是你没有使用正确的端口号。
如果你在http://localhost:9997
上运行一个http服务器,那么我认为你想要使用以下命令运行:
$ go tool pprof http://localhost:9997/debug/pprof/heap
根据net/http/pprof包文档页面,如果你的应用程序已经运行了一个http服务器,你不需要启动一个新的服务器,只需要在程序中的某个地方包含import _ "net/http/pprof"
即可。http://localhost:6060
是作为示例启动的服务器,主机和端口是任意的。
import _ "net/http/pprof"
表示导入了该包,但你不使用它的任何导出标识符。根据go语言规范,这将仅为了其副作用而导入该包。这些副作用涉及到,我认为,执行包的源文件中定义的init()函数,以及显然的注册变量。
此外,你可能会发现这篇博文有帮助:
http://blog.golang.org/2011/06/profiling-go-programs.html
英文:
Based on your comment, the issue might be that you're not using the correct port number.
If you are running an http server at http://localhost:9997
, then I think you want to run the command with http://localhost:9997
:
$ go tool pprof http://localhost:9997/debug/pprof/heap
According to the net/http/pprof pkg doc page, if your application is already running an http server you do not need to start one and only need to include the import _ "net/http/pprof"
somewhere in your program. http://localhost:6060
is the server started as an example and the host and port are arbitrary.
import _ "net/http/pprof"
means the package is imported but you do not use any of its exported identifiers. According to the go language spec, this will import the package solely for its side effects. These side effects involve, I think, the execution of the init() functions defined in the package's source files and, apparently, registered variables.
Also, you might find this blog post helpful:
答案2
得分: 2
什么是“不起作用”的意思?期望的是什么,实际观察到的是什么?
运行
$ go tool pprof -h
查看您版本的此工具的帮助。我的本地版本既不是最新版本也不是发布版本(即介于两者之间)。它显示:
(10:16) jnml@fsc-r550:~$ go tool pprof -h
选项 h 不明确(heapcheck, help)
无效的选项
用法:
pprof [选项] <程序> <配置文件>
<配置文件> 是一个以空格分隔的配置文件名称列表。
pprof [选项] <符号化的配置文件>
<符号化的配置文件> 是一个包含必要的符号映射以及配置文件数据(可能是使用 --raw 生成的)的配置文件列表。
pprof [选项] <配置文件>
<配置文件> 是远程形式。符号从 host:port/pprof/symbol 获取
每个名称可以是:
/path/to/profile - 配置文件的路径
host:port[/<service>] - 获取配置文件的服务位置
/<service> 可以是 /pprof/heap, /pprof/profile, /pprof/pmuprofile,
/pprof/growth, /pprof/contention, /pprof/wall,
/pprof/thread 或 /pprof/filteredprofile。
例如:
pprof http://myserver.com:80/pprof/heap
如果省略 /<service>,则服务默认为 /pprof/profile(CPU 分析)。
pprof --symbols <程序>
将地址映射到符号名称。在此模式下,stdin 应该是一个库映射列表,格式与堆和 CPU 配置文件中找到的格式相同(在 Linux 上大致匹配 /proc/self/maps),然后是要映射的十六进制地址列表,每行一个。
有关查询远程服务器的更多帮助,包括如何添加必要的服务器端支持代码,请参阅此文件名(或类似文件):
/usr/doc/google-perftools-1.5/pprof_remote_servers.html
选项:
--cum 按累积数据排序
--base=<base> 在显示之前从<配置文件>中减去<base>
--interactive 运行交互模式(交互“help”提供帮助)[默认]
--seconds=<n> 动态配置文件的时间长度[默认=30秒]
--add_lib=<file> 从给定库中读取附加符号和行信息
--lib_prefix=<dir> 逗号分隔的库路径前缀列表
报告粒度:
--addresses 按地址级别报告
--lines 按源代码行级别报告
--functions 按函数级别报告[默认]
--files 按源文件级别报告
输出类型:
--text 生成文本报告
--callgrind 生成 callgrind 格式到 stdout
--gv 生成 Postscript 并显示
--web 生成 SVG 并显示
--list=<regexp> 生成匹配的例程的源代码列表
--disasm=<regexp> 生成匹配的例程的反汇编
--symbols 打印在给定地址找到的解码符号名称
--dot 生成 DOT 文件到 stdout
--ps 生成 Postcript 到 stdout
--pdf 生成 PDF 到 stdout
--svg 生成 SVG 到 stdout
--gif 生成 GIF 到 stdout
--raw 生成符号化的 pprof 数据(与远程获取一起使用时有用)
堆配置文件选项:
--inuse_space 显示已使用的(兆字节)[默认]
--inuse_objects 显示已使用的对象
--alloc_space 显示已分配的(兆字节)
--alloc_objects 显示已分配的对象
--show_bytes 以字节显示空间
--drop_negative 忽略负差异
冲突配置文件选项:
--total_delay 显示每个区域的总延迟[默认]
--contentions 显示每个区域的延迟次数
--mean_delay 显示每个区域的平均延迟
调用图选项:
--nodecount=<n> 最多显示这么多个节点[默认=80]
--nodefraction=<f> 隐藏总数的<f>以下的节点[默认=.005]
--edgefraction=<f> 隐藏总数的<f>以下的边[默认=.001]
--focus=<regexp> 仅显示与<regexp>匹配的节点
--ignore=<regexp> 忽略与<regexp>匹配的节点
--scale=<n> 设置 GV 缩放[默认=0]
--heapcheck 使具有非零对象计数(即直接泄漏生成器)的节点更可见
其他:
--tools=<prefix> 对象工具路径名前缀
--test 运行单元测试
--help 此消息
--version 版本信息
环境变量:
PPROF_TMPDIR 配置文件目录。默认为 $HOME/pprof
PPROF_TOOLS 对象工具路径名前缀
示例:
pprof /bin/ls ls.prof
进入“交互”模式
pprof --text /bin/ls ls.prof
每个过程输出一行
pprof --web /bin/ls ls.prof
在 Web 浏览器中显示带注释的调用图
pprof --gv /bin/ls ls.prof
通过 'gv' 显示带注释的调用图
pprof --gv --focus=Mutex /bin/ls ls.prof
限制到包含 .*Mutex.* 条目的代码路径
pprof --gv --focus=Mutex --ignore=string /bin/ls ls.prof
包含 Mutex 但不包含 string 的代码路径
pprof --list=getdir /bin/ls ls.prof
getdir() 的(每行)带注释源代码列表
pprof --disasm=getdir /bin/ls ls.prof
getdir() 的(每个 PC)带注释反汇编
pprof http://localhost:1234/
进入“交互”模式
pprof --text localhost:1234
为 localhost:1234 每个过程输出一行
pprof --raw localhost:1234 > ./local.raw
pprof --text ./local.raw
获取远程配置文件以供以后分析,然后以文本模式分析。
致命错误:无效的选项
go tool pprof: 退出状态 1
(10:16) jnml@fsc-r550:~$
关于第二个问题:import _ "foo"
的习惯用法是仅为了 foo 的初始化副作用而导入包 foo。这可能包括将 foo 提供的功能注册到其他包中可用的功能。一个具体的例子是特定的图像格式处理包(在“子目录”底部查看)和抽象的image包。
英文:
What "does not work" means? What is expected and what is observed instead?
Run
$ go tool pprof -h
to see help for your version of this tool. My local version is not at tip neither at release (ie. in between). It shows:
(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:~$
On the second question: The `import _ "foo"' idiom is importing package foo only for the side effects of foo's initialization. That may include for example registering functionality provided by foo to be usable from within other packages. A concrete example for this are the specific image format handling packages (see bottom at"Subdirectories") and the abstract image package.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论