Golang Go语言中的gospy:非侵入式的 goroutine inspector

发布于 1周前 作者 sinazl 来自 Go语言

Golang Go语言中的gospy:非侵入式的 goroutine inspector

做了个工具, 可以不修改目标 go 进程的源码 dump 出它的 runtime 信息, 对跑在容器里的进程也 work: https://github.com/monsterxx03/gospy

限制:

  • linux x86_64 only
  • 目标进程的 binary 不能被 stirpe 过
  • 目标进程的 binary 不是 pie 模式 build 的 (go build -buildmod=pie)

可以用来检测 goroutine 的泄漏, dump 一些 go process GMP 调度模型的细节信息. 显示的一些字段的含义, 可能需要对 go 的 runtime 有一定了解才明白, 基本都来自 runtime/runtime2.go, runtime/proc.go

显示每个 goroutine 在做什么: sudo ./gospy summary --pid 123

bin: /proc/5134/exe, goVer: 1.12.8, gomaxprocs: 6
Sched: NMidle 6, NMspinning 0, NMfreed 0, NPidle 5, NGsys 16, Runqsize: 0
P0 idle, schedtick: 642, syscalltick: 81, curM: M0
P1 idle, schedtick: 959, syscalltick: 67, curM: nil
P2 idle, schedtick: 992, syscalltick: 32, curM: nil
P3 idle, schedtick: 581, syscalltick: 17, curM: nil
P4 idle, schedtick: 89, syscalltick: 8, curM: nil
P5 idle, schedtick: 231, syscalltick: 5, curM: nil
Threads: 14 total, 0 running, 14 sleeping, 0 stopped, 0 zombie
Goroutines: 44 total, 0 idle, 0 running, 5 syscall, 39 waiting

goroutines:

1 - waiting for chan receive: main (/usr/local/go/src/runtime/proc.go:110) 2 - waiting for force gc (idle): forcegchelper (/usr/local/go/src/runtime/proc.go:242) 3 - waiting for GC sweep wait: bgsweep (/usr/local/go/src/runtime/mgcsweep.go:64) 7(M8)- syscall: timerproc (/usr/local/go/src/runtime/time.go:247) 8 - waiting for select: start (/app/vendor/go.opencensus.io/stats/view/worker.go:149) 14 - waiting for GC worker (idle): gcBgMarkWorker (/usr/local/go/src/runtime/mgc.go:1807) 15 - waiting for GC worker (idle): gcBgMarkWorker (/usr/local/go/src/runtime/mgc.go:1807) 17 - waiting for finalizer wait: runfinq (/usr/local/go/src/runtime/mfinal.go:161) 19(M4)- syscall: loop (/usr/local/go/src/os/signal/signal_unix.go:21) …

把 goroutine 按它们正在执行的函数进行 group by count, 哪个持续增长就是有泄漏, sudo gospy top --pid 123:

https://i.imgur.com/aIHeWn1.png

原理: https://blog.monsterxx03.com/2019/09/29/gospy-dev-note/


更多关于Golang Go语言中的gospy:非侵入式的 goroutine inspector的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

谢谢!学习到了很多,binary 和 proc 两个文件逻辑很清晰,太感谢了!

更多关于Golang Go语言中的gospy:非侵入式的 goroutine inspector的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang(Go语言)生态系统中,gospy 是一个引人注目的工具,它提供了一种非侵入式的方式来检查和监控 goroutines 的行为。对于开发者而言,理解和调试 goroutines 的执行流程至关重要,尤其是在构建并发应用时。

gospy 的核心优势在于其非侵入式设计。这意味着你无需修改现有的代码或引入额外的依赖,就能对 goroutines 进行监控。它利用 Go 的运行时调试接口,允许开发者在运行时动态地观察 goroutines 的状态、堆栈信息以及它们之间的调用关系。

使用 gospy,你可以轻松获取到当前所有活跃的 goroutines 列表,以及每个 goroutine 的执行堆栈。这对于诊断死锁、资源泄漏和性能瓶颈等问题特别有帮助。此外,gospy 还提供了时间线视图,帮助开发者直观地理解 goroutines 的生命周期和它们之间的交互。

值得注意的是,虽然 gospy 提供了强大的监控能力,但在生产环境中使用时仍需谨慎。非侵入式设计虽然减少了代码污染,但也意味着它可能无法捕捉到所有细节,特别是在高度动态或性能敏感的应用中。因此,结合其他调试和监控工具,如 pprof、trace 等,往往能获得更全面和准确的诊断结果。

总之,gospy 是 Go 语言开发者在调试和监控 goroutines 时的一个有力助手,其非侵入式设计使得它易于集成和使用,是并发应用开发和维护不可或缺的工具之一。

回到顶部