GitHub: https://github.com/google/gops

一个用于列出和诊断分析系统中正在运行的 Go 程序的命令行工具

安装

go get -u github.com/google/gops

命令帮助

执行 gops help 查看帮助文档:

gops is a tool to list and diagnose Go processes.gops <cmd> <pid|addr> ...gops <pid> # displays process infoCommands:stack           Prints the stack trace.gc              Runs the garbage collector and blocks until successful.setgc            Sets the garbage collection target percentage.memstats        Prints the allocation and garbage collection stats.version         Prints the Go version used to build the program.stats           Prints the vital runtime stats.help            Prints this help text.Profiling commands:trace           Runs the runtime tracer for 5 secs and launches "go tool trace".pprof-heap      Reads the heap profile and launches "go tool pprof".pprof-cpu       Reads the CPU profile and launches "go tool pprof".All commands require the agent running on the Go process.
Symbol "*" indicates the process runs the agent.

使用详解

为了能更好的分析程序,需要在我们的项目中加一行 agent 诊断分析代码,用于统计分析程序问题。

package mainimport ("log""time""github.com/google/gops/agent"
)func main() {if err := agent.Listen(agent.Options{}); err != nil {log.Fatal(err)}time.Sleep(time.Hour)
}

其中,agent. 支持更多的参数:

// Code reference: github.com/google/gops/agent/agent.go:42// Options allows configuring the started agent.
type Options struct {// Addr is the host:port the agent will be listening at.// Optional.Addr string// ConfigDir is the directory to store the configuration file,// PID of the gops process, filename, port as well as content.// Optional.ConfigDir string// ShutdownCleanup automatically cleans up resources if the// running process receives an interrupt. Otherwise, users// can call Close before shutting down.// Optional.ShutdownCleanup bool
}
  • Addr

    可选。为远程分析服务提供监听地址,例如: :9119。配置了该项,那我们可以在本机查看分析远程服务器上的 Go 程序,非常有帮助。

  • ConfigDir

    可选。用于存放统计数据和配置的目录,默认为当前用户的主目录。也可以通过环境变量GOPS_CONFIG_DIR设置。具体参考代码:

const gopsConfigDirEnvKey = "GOPS_CONFIG_DIR"func ConfigDir() (string, error) {if configDir := os.Getenv(gopsConfigDirEnvKey); configDir != "" {return configDir, nil}if runtime.GOOS == "windows" {return filepath.Join(os.Getenv("APPDATA"), "gops"), nil}homeDir := guessUnixHomeDir()if homeDir == "" {return "", errors.New("unable to get current user home directory: os/user lookup failed; $HOME is empty")}return filepath.Join(homeDir, ".config", "gops"), nil
}func guessUnixHomeDir() string {usr, err := user.Current()if err == nil {return usr.HomeDir}return os.Getenv("HOME")
}
  • ShutdownCleanup

    可选。设置为 true,则在程序关闭时会自动清理数据。

NOTE: 如果不加 agent 代码,那我们无法更深入的诊断程序,也就是说无法执行gops memstatsgops pprof-heap等所有类似于 gops <cmd> <pid|addr> ... 的子命令。

gops

直接执行 gops 命令会列出本机所有正在运行的 Go 程序。

$ gops99288 47636 go    go1.10.1 /usr/local/Cellar/go/1.10.1/libexec/bin/go
99300 99288 main* go1.10.1 /private/var/folders/cs/mfl4k8t54_g1thdzvzkdxbbr0000gn/T/go-build375822490/b001/exe/main
99570 2899  gops  go1.10.1 /Users/shocker/gowork/bin/gops
99154 14655 hugo  go1.11.1 /usr/local/Cellar/hugo/0.49.1/bin/hugo

该命令会显示以下内容:

  • PID
  • PPID
  • 程序名称
  • 构建该程序的 Go 版本号
  • 程序所在绝对路径

注意,列表中有个程序名称后面带了个 *,表示该程序加入了 gops 的诊断分析代码。

gops <pid>

用法: gops <pid>
查看本机指定 PID Go 程序的基本信息

$ gops 99300parent PID:    99288
threads:    11
memory usage:    0.157%
cpu usage:    0.013%
username:    shocker
cmd+args:    /var/folders/cs/mfl4k8t54_g1thdzvzkdxbbr0000gn/T/go-build375822490/b001/exe/main
local/remote:    *:9105 <-> :0 (LISTEN)
local/remote:    127.0.0.1:57109 <-> 127.0.0.1:3306 (ESTABLISHED)
local/remote:    *:8000 <-> :0 (LISTEN)

local/remote 表示本机建立的监听(LISTEN),或者与远程服务器建立的链接(ESTABLISHED)

local/remote: *:9105 <-> :0 (LISTEN) 中的 *:9105gops/agent 提供的服务,

gops tree

用法: gops tree
以目录树的形式展示所有 Go 程序。

$ gops tree...
├── 2899
│   └── 99996 (gops) {go1.10.1}
├── 47636
│   └── 99288 (go) {go1.10.1}
│       └── [*]  99300 (main) {go1.10.1}
└── 14655└── 99154 (hugo) {go1.11.1}

gops stack (<pid>|<addr>)

用法: gops stack (<pid>|<addr>)
用于显示程序所有堆栈信息,包括每个 goroutine 的堆栈信息、运行状态、运行时长等。

$ gops stack 99300goroutine 7 [running]:
runtime/pprof.writeGoroutineStacks(0x1882720, 0xc4202b8010, 0xd0, 0xd0)/usr/local/Cellar/go/1.10.1/libexec/src/runtime/pprof/pprof.go:650 +0xa7
runtime/pprof.writeGoroutine(0x1882720, 0xc4202b8010, 0x2, 0x30, 0xc420068248)/usr/local/Cellar/go/1.10.1/libexec/src/runtime/pprof/pprof.go:639 +0x44goroutine 1 [IO wait, 9 minutes]:
internal/poll.runtime_pollWait(0x1db4da0, 0x72, 0x0)/usr/local/Cellar/go/1.10.1/libexec/src/runtime/netpoll.go:173 +0x57
internal/poll.(*pollDesc).wait(0xc4201e7318, 0x72, 0x0, 0x0, 0x0)# more ...

gops memstats (<pid>|<addr>)

用法: gops memstats (<pid>|<addr>)
查看程序的内存统计信息

$ gops memstats 127.0.0.1:9105alloc: 1.36MB (1428632 bytes)
total-alloc: 10.21MB (10709376 bytes)
sys: 9.07MB (9509112 bytes)
lookups: 91
mallocs: 102818
frees: 91896
heap-alloc: 1.36MB (1428632 bytes)
heap-sys: 5.22MB (5472256 bytes)
heap-idle: 2.34MB (2457600 bytes)
heap-in-use: 2.88MB (3014656 bytes)
heap-released: 0 bytes
heap-objects: 10922
stack-in-use: 704.00KB (720896 bytes)
stack-sys: 704.00KB (720896 bytes)
stack-mspan-inuse: 47.95KB (49096 bytes)
stack-mspan-sys: 80.00KB (81920 bytes)
stack-mcache-inuse: 6.78KB (6944 bytes)
stack-mcache-sys: 16.00KB (16384 bytes)
other-sys: 1.21MB (1266624 bytes)
gc-sys: 492.00KB (503808 bytes)
next-gc: when heap-alloc >= 4.00MB (4194304 bytes)
last-gc: 2018-10-18 13:37:04.37511973 +0800 CST
gc-pause-total: 9.209158ms
gc-pause: 52831
num-gc: 60
enable-gc: true
debug-gc: false

gops gc (<pid>|<addr>)

用法: gops gc (<pid>|<addr>)
查看指定程序的垃圾回收(GC)信息

gops setgc (<pid>|<addr>)

用法: gops setgc (<pid>|<addr>)
设定指定程序的 GC 目标百分比

gops version (<pid>|<addr>)

用法: gops version (<pid>|<addr>)
查看指定程序构建时的 Go 版本号

gops stats (<pid>|<addr>)

用法: gops stats (<pid>|<addr>)
查看指定程序的 goroutine 数量、GOMAXPROCS 值等信息

$ gops stats 127.0.0.1:9105goroutines: 11
OS threads: 14
GOMAXPROCS: 4
num CPU: 4

gops pprof-cpu (<pid>|<addr>)

用法: gops pprof-cpu (<pid>|<addr>)
调用并展示 go tool pprof 工具中关于 CPU 的性能分析数据,操作与 pprof 一致。

$ gops pprof-cpu 99300Profiling CPU now, will take 30 secs...
Profile dump saved to: /var/folders/cs/mfl4k8t54_g1thdzvzkdxbbr0000gn/T/profile881383738
Profiling dump saved to: /var/folders/cs/mfl4k8t54_g1thdzvzkdxbbr0000gn/T/profile881383738
Binary file saved to: /var/folders/cs/mfl4k8t54_g1thdzvzkdxbbr0000gn/T/binary970030929
File: binary970030929
Type: cpu
Time: Oct 18, 2018 at 2:43pm (CST)
Duration: 30s, Total samples = 0
Entering interactive mode (type "help" for commands, "o" for options)
(pprof)

gops pprof-heap (<pid>|<addr>)

用法: gops pprof-heap (<pid>|<addr>)
调用并展示 go tool pprof 工具中关于 heap 的性能分析数据,操作与 pprof 一致。

$ gops pprof-heap 99300Profile dump saved to: /var/folders/cs/mfl4k8t54_g1thdzvzkdxbbr0000gn/T/profile045800436
Profiling dump saved to: /var/folders/cs/mfl4k8t54_g1thdzvzkdxbbr0000gn/T/profile045800436
Binary file saved to: /var/folders/cs/mfl4k8t54_g1thdzvzkdxbbr0000gn/T/binary315133123
File: binary315133123
Type: inuse_space
Time: Oct 18, 2018 at 2:46pm (CST)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof)

gops trace (<pid>|<addr>)

用法: gops trace (<pid>|<addr>)
追踪程序运行5秒,生成可视化报告,并可在浏览器中查看: http://127.0.0.1:61380

$ gops trace 99300Tracing now, will take 5 secs...
Trace dump saved to: /var/folders/cs/mfl4k8t54_g1thdzvzkdxbbr0000gn/T/trace136310737
2018/10/18 14:49:06 Parsing trace...
2018/10/18 14:49:06 Serializing trace...
2018/10/18 14:49:06 Splitting trace...
2018/10/18 14:49:06 Opening browser. Trace viewer is listening on http://127.0.0.1:61380

参考资料

  • gops - Go语言程序查看和诊断工具
  • google/gops源码分析

原文地址: https://shockerli.net/post/go...
更多文章请访问我的个人博客: https://shockerli.net

gops —— Go 程序诊断分析工具 1相关推荐

  1. gops —— Go 程序诊断分析工具

    GitHub: https://github.com/google/gops 一个用于列出和诊断分析系统中正在运行的 Go 程序的命令行工具 安装 go get -u github.com/googl ...

  2. 程序崩溃 分析工具_程序分析工具| 软件工程

    程序崩溃 分析工具 A program analysis tool implies an automatic tool that takes the source code or the execut ...

  3. 必备的 Linux 性能诊断分析工具!(文末送书)

    阅读本文大概需要 8.8 分钟. 作者:董西孝 来源:http://t.cn/Ehs6xfz 福利:文末留言送 3 本Linux系统安全相关书籍<Linux系统安全:纵深防御.安全扫描与入侵检测 ...

  4. 【转】.NET程序内存分析工具CLRProfiler的使用

    大家都知道.net有一套自己的内存(垃圾)回收机制,除非有一些数据(方法)长期占有内存不随着垃圾回收功能而释放内存,这样就造成了我们经常说的内存泄露.内存持续增长得不到释放等问题导致APS.net网站 ...

  5. .NET 11 个 Visual Studio 代码性能分析工具

    原文地址 软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行 ...

  6. 11个Visual Studio代码性能分析工具

    软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...

  7. 11 个 Visual Studio 代码性能分析工具

    软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...

  8. 【转】恶意代码分析-工具收集

    如有侵权,请联系删除. 目录 恶意代码分析-工具收集 恶意代码分析实战 恶意软件自动化分析工具套件 文档分析工具 JavaScript分析工具 系统&文件监视工具 shellcode分析工具 ...

  9. 恶意代码分析-工具收集

    恶意代码分析-工具收集 恶意代码分析实战 Strings:字符串查找工具 https://docs.microsoft.com/zh-cn/sysinternals/downloads/strings ...

最新文章

  1. 【机器学习基石笔记】八、噪声和错误
  2. Inplayable技术分享
  3. tensorflow实现svm iris二分类——本质上在使用梯度下降法求解线性回归(loss是定制的而已)...
  4. 2-4 zookeeper配置文件介绍,运行zk
  5. [原创]辽宁移动通信-话费余额查询
  6. 编码导致 html和aspx 样式差异,变形
  7. 记录一次redis事故
  8. 分享Java 中如何运行字符串表达式?
  9. 【年终终结】2021年年末总结
  10. 单耳蓝牙耳机怎么连接_蓝牙耳机怎么切换单耳
  11. deepin linux软件安装,deepin 应用安装
  12. 母羊奶粉的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  13. 社保入税+国家支持,企业一大法宝:灵活用工
  14. CSS让同一行的图片和文字垂直居中对齐
  15. HashMap - 基于哈希表和 Map 接口的键值对利器 (JDK 1.7)
  16. 2017暑假第二阶段第四场 总结
  17. html5地图大头针,iOS高德地图之自定义大头针and泡泡view
  18. 使用python爬取中国电影票房数据并写入csv文件
  19. 注册表编程,程序记忆功能
  20. android 乐固渠道打包,android多渠道打包:umeng+美团walle+腾讯乐固

热门文章

  1. 数学建模 河北杯 无人机侦听与反制问题
  2. 服务器未下载不明文件 怎么还会中毒
  3. BottleNeck 瓶颈层
  4. 【已解决】conda install问题:UnsatisfiableError: The following specifications were found to be incompatible
  5. 合唱队数 java实现
  6. React-Native清除缓存汇总
  7. 小白的笨笨知识【用原生js实现一个倒计时项目】
  8. 传值调用,传名调用,引用调用,复制恢复
  9. 超简单步骤搭建公用DNS
  10. 国内Android游戏推荐,2月中国安卓游戏收入榜Top20:腾讯八款游戏上榜