运行中的 go 进程中某个函数偶尔出现执行慢的情况,怎么跟踪堆栈调用?

2020-10-23 10:14:31 +08:00
 nomansky
一个在 production 环境运行的进程,不可能修改代码,日志记录的也不详细,不定时出现某个函数执行慢的情况,gops,pprof 等都需要在代码中实现 agent 才能 profiling 和 tracing 。有没有大佬了解有什么工具可以不需要 agent 跟踪正在运行的程序的堆栈调用?
2010 次点击
所在节点    Go 编程语言
12 条回复
JeromeCui
2020-10-23 10:20:49 +08:00
我就会一招:打印日志
nomansky
2020-10-23 10:24:38 +08:00
@JeromeCui 我也想,没办法打印...
lcode
2020-10-23 10:38:49 +08:00
测试环境模拟一下
不能复现的 bug 就不是 bug (
zunceng
2020-10-23 10:45:31 +08:00
http 框架里面集成一个 pprof 中间件 做好了以后一行代码就好了 如果是 gin 直接用下面的
https://github.com/gin-contrib/pprof
monsterxx03
2020-10-23 10:50:16 +08:00
https://github.com/monsterxx03/gospy

可以不改代码打印正在跑的 goroutine, 不过好像并不能帮你调试某个函数慢的问题
polythene
2020-10-23 10:52:19 +08:00
Linux 下的 perf 能直接读取 Go 进程的符号值
TypeErrorNone
2020-10-23 10:56:02 +08:00
@zunceng 如果有几十个容器,怎么搞呢
airplayxcom
2020-10-23 11:15:12 +08:00
kiddingU
2020-10-23 11:47:17 +08:00
opentracing 可以定位到是链路中哪个函数慢,然后再去优化
Lonenso
2020-10-23 12:20:04 +08:00
Leigg
2020-10-23 12:27:06 +08:00
你不能确定函数范围?没上链路追踪就自己挨个打日志
zunceng
2020-10-23 13:17:16 +08:00
@TypeErrorNone 一般来说不会把这个接口暴露出去 想个办法内部访问
如果程序部署在 k8s
kubectl run my-shell --rm -i --tty --image golang -- sh
> go tools pprof http://${pod_name}/debug/pprof/heap
在生产创建 pod 的权限非常高 对权限管控有要求的企业 可以把这一套做成一个线上的调试工具 web 方式提供给内部人员使用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/717721

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX