Golang Go语言中运行中的进程某个函数偶尔执行慢怎么跟踪堆栈调用?

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

Golang Go语言中运行中的进程某个函数偶尔执行慢怎么跟踪堆栈调用?
一个在 production 环境运行的进程,不可能修改代码,日志记录的也不详细,不定时出现某个函数执行慢的情况,gops,pprof 等都需要在代码中实现 agent 才能 profiling 和 tracing 。有没有大佬了解有什么工具可以不需要 agent 跟踪正在运行的程序的堆栈调用?

13 回复

我就会一招:打印日志

更多关于Golang Go语言中运行中的进程某个函数偶尔执行慢怎么跟踪堆栈调用?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我也想,没办法打印…

测试环境模拟一下
不能复现的 bug 就不是 bug (

http 框架里面集成一个 pprof 中间件 做好了以后一行代码就好了 如果是 gin 直接用下面的
https://github.com/gin-contrib/pprof

https://github.com/monsterxx03/gospy

可以不改代码打印正在跑的 goroutine, 不过好像并不能帮你调试某个函数慢的问题

Linux 下的 perf 能直接读取 Go 进程的符号值

如果有几十个容器,怎么搞呢

opentracing 可以定位到是链路中哪个函数慢,然后再去优化

你不能确定函数范围?没上链路追踪就自己挨个打日志

一般来说不会把这个接口暴露出去 想个办法内部访问
如果程序部署在 k8s
kubectl run my-shell --rm -i --tty --image golang – sh
> go tools pprof http://${pod_name}/debug/pprof/heap
在生产创建 pod 的权限非常高 对权限管控有要求的企业 可以把这一套做成一个线上的调试工具 web 方式提供给内部人员使用

在Go语言中,如果你发现某个函数偶尔执行得很慢,可以使用以下几种方法来跟踪堆栈调用并诊断问题:

  1. pprof工具: Go的标准库提供了强大的性能分析工具pprof。你可以通过在代码中添加runtime/pprof包的调用,来记录CPU和内存使用情况。例如,你可以在疑似慢的函数前后分别调用pprof.StartCPUProfilepprof.StopCPUProfile来记录CPU使用情况。然后,使用go tool pprof命令分析生成的profile文件,查看函数调用堆栈。

  2. 日志记录: 在函数的开始和关键路径上添加日志记录,包括当前时间戳,可以帮助你识别函数在哪个部分花费了最多的时间。这种方法虽然不如pprof精确,但实现简单,对于初步诊断问题很有帮助。

  3. trace工具: Go的runtime/trace包允许你记录程序的执行轨迹,包括goroutine的创建、销毁、阻塞和同步事件。通过go tool trace命令分析生成的trace文件,你可以看到程序的运行轨迹和性能瓶颈。

  4. 自定义监控: 如果上述方法不够细致,你可以考虑实现自定义的性能监控逻辑,例如使用定时器来测量函数不同部分的执行时间,并记录到日志中。

综上所述,根据你的具体需求和环境,选择合适的工具和方法来跟踪堆栈调用和性能问题。通常,pprof是首选工具,因为它提供了详细且易于分析的性能数据。

回到顶部