Golang Go语言中如何 debug 超过 8192 个活跃的 goroutine
如题,程序中会不断的创建新的 goroutine,直到超过 8192 个。有没有什么办法得到当前活跃 goroutine 的信息,比如是谁创建这些 goroutine 的
Golang Go语言中如何 debug 超过 8192 个活跃的 goroutine
log
更多关于Golang Go语言中如何 debug 超过 8192 个活跃的 goroutine的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
#1 怎么打 log,现在我只用 runtime.NumGoroutine() 打印出活跃的 goroutine 数量。从日志可以看到本来只有几百个的,然后不知道怎么的突然开始增大,一直增加到 8192 个。可以打印出更详细的信息吗
先看是不是自己创建的,自己创建的打 log 就能解决
还有一种方法是 dump goroutine stacktrace,具体方法网上搜一下就好了
#4 了解,我去试试
goroutine 泄露
http pprof ?
看看新创建的都在执行什么操作。
协程泄露吼啊
运行中的 goroutine 在你 dump 的时候会有显示 “running” 的,不过你这个应该是没退出导致的泄漏
一般一下从几百个变到几千个,很有可能都是同一处 go func(){}产生出来的,然后泄露了把。dump 出来 goroutine stacktrace,然后看看是不是有大量相似的 goroutine,很有可能就找到原因了
了解
好的,谢谢
该死的不死,新增的还在继续
一般开启 http/pprof 来看一下 goroutine 页面的打印,最多的 goroutine 都停在哪个位置就可以了
runtime 包有个 NumGoroutine 可以获取当前 ctrip 的数量
v2ex 写错了不能修改真的难受
grmon 了解一下?
在 Go 语言中,当你遇到需要调试超过 8192 个活跃的 goroutine 的情况时,可能会遇到一些挑战,因为默认的 goroutine 堆栈跟踪大小限制就是 8192 个。这个限制是为了防止在极端情况下程序崩溃或消耗过多内存。不过,你可以通过以下几种方式来处理这个问题:
-
增加调试信息限制: 你可以通过设置环境变量
GODEBUG=maxbacktrace=N
来增加 goroutine 堆栈跟踪的最大数量,其中N
是你希望设置的新限制。例如,GODEBUG=maxbacktrace=16384
会将限制增加到 16384 个 goroutine。这可以帮助你捕获更多的调试信息。 -
使用采样分析工具: 对于大量的 goroutine,直接使用完整的堆栈跟踪可能并不实际。考虑使用像 pprof 这样的采样分析工具,它可以定期捕获 goroutine 的快照,并帮助你分析哪些 goroutine 占用了最多的资源。
-
优化代码: 如果经常需要处理大量的 goroutine,可能需要重新考虑你的并发模型。检查是否有必要创建这么多的 goroutine,或者是否可以优化现有代码以减少并发需求。
-
日志和监控: 增加日志记录和监控,可以帮助你更好地理解 goroutine 的行为和数量。通过监控工具,你可以实时查看 goroutine 的数量和状态,从而更容易地诊断问题。
通过上述方法,你可以更有效地调试和管理大量的 goroutine,确保程序的稳定性和性能。