如何查看runtime.futex的来源?它只有“系统”作为父项

Die*_*_be 6 profiling go

go tool pprof使用https://github.com/vimeo/statsdaemon的cpu配置文件运行并键入“ web ”,我得到了一个广泛使用“ runtime.futex ” 的svg配置文件。但是我看不到它的来源,它只是说“ 系统 ”。

我想知道我的程序调用哪个代码,这导致花了太多时间runtime.futex

个人资料截图

为了确保我通过'-nodefraction=0',这不会使它不在web svg视图中删除节点,尽管它说“ 显示246个中的前80个节点(暨> = 0.11s) ”,也许这是相关的。

我尝试了https://code.google.com/p/gperftools/,它显示了相同的内容。可视化没有丢弃任何节点或边缘,但是“ runtime.futex”仍然显示在“ 系统 ”下,这是根节点吗?

Jer*_*all 6

futex或“快速用户空间互斥体”是用于基本锁定的linux系统调用。我想象go运行时会在后台使用它很多。

没有看到一些代码就很难确定,但是对于高度并发的代码以及使用通道进行大量协调的情况,futex调用实际上可能来自System,而没有特定的功能。


Ole*_*kin 5

当我遇到这样的问题时,我使用过runtime/trace经常调用某个函数的地方,并且该函数通过以下方式创建了新的股票代码

ticker := time.NewTicker()
Run Code Online (Sandbox Code Playgroud)

但并没有阻止它

defer ticker.Stop()
Run Code Online (Sandbox Code Playgroud)

另外,不要忘记停止计时器:

timer := time.NewTimer(duration)
defer timer.Stop()
Run Code Online (Sandbox Code Playgroud)