Golang Go语言中的gospy:非侵入式的 goroutine inspector
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:
更多关于Golang Go语言中的gospy:非侵入式的 goroutine inspector的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
谢谢!学习到了很多,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 时的一个有力助手,其非侵入式设计使得它易于集成和使用,是并发应用开发和维护不可或缺的工具之一。