获取等待写入通道/从通道读取的goroutine数(用于分析)

获取等待写入通道/从通道读取的goroutine数(用于分析),go,profiling,channel,goroutine,Go,Profiling,Channel,Goroutine,要评测我的应用程序,我想知道有多少Goroutine正在等待写入或读取某个频道;我在这本书里找不到任何相关的东西 当然,我可以维护一个显式计数器,但我希望golang运行时知道这一点,所以我尽量避免重新发明轮子 那么,有没有一种方法可以在不手动维护计数器的情况下实现这一点?要跟踪总体负载,您可能需要查找runtime.NumGoroutine() 虽然它不是刚刚被阻塞的Go例程的确切数量,但它应该非常接近它,并且不超过runtime.NumGoroutine()-GOMAXPROCS 对于每个

要评测我的应用程序,我想知道有多少Goroutine正在等待写入或读取某个频道;我在这本书里找不到任何相关的东西

当然,我可以维护一个显式计数器,但我希望golang运行时知道这一点,所以我尽量避免重新发明轮子


那么,有没有一种方法可以在不手动维护计数器的情况下实现这一点?

要跟踪总体负载,您可能需要查找
runtime.NumGoroutine()

虽然它不是刚刚被阻塞的Go例程的确切数量,但它应该非常接近它,并且不超过
runtime.NumGoroutine()-GOMAXPROCS

对于每个通道的跟踪Go例程,您可以执行以下操作:

  • 用于标记具有特定通道的例程
  • 使用
    http/pprof
    获取有关当前配置文件的信息并解析输出-有关详细信息,请参阅此答案。或者,您可以查看http/pprof,了解它是如何获取信息的,这样您就可以在应用程序中以键入的方式获取信息

  • 谢谢,但这并不能解决问题:很明显,我的应用程序中有多个频道,goroutines正在等待不同的频道,所以我需要看看他们在等待哪些频道,这样我就能够发现瓶颈。你不需要使用
    net/http/pprof
    来获得“阻塞”配置文件,如果不需要http处理程序,可以直接从
    运行时/pprof
    执行相同的操作。