是什么导致go在runtime.pthread_cond_信号中花费如此多的时间
我已经在go中编写了一个多goroutine基准测试。我使用pprof工具来分析如何优化我的代码。当我使用top10显示一些信息时,我得到了以下输出:是什么导致go在runtime.pthread_cond_信号中花费如此多的时间,go,channel,pprof,Go,Channel,Pprof,我已经在go中编写了一个多goroutine基准测试。我使用pprof工具来分析如何优化我的代码。当我使用top10显示一些信息时,我得到了以下输出: Showing top 10 nodes out of 167 flat flat% sum% cum cum% 4700ms 17.86% 17.86% 4700ms 17.86% runtime.pthread_cond_signal 1790ms 6.80% 24.66%
Showing top 10 nodes out of 167
flat flat% sum% cum cum%
4700ms 17.86% 17.86% 4700ms 17.86% runtime.pthread_cond_signal
1790ms 6.80% 24.66% 1790ms 6.80% cmpbody
1470ms 5.59% 30.24% 1620ms 6.16% syscall.syscall
1360ms 5.17% 35.41% 3280ms 12.46% runtime.scanobject
1170ms 4.45% 39.86% 1410ms 5.36% runtime.findObject
960ms 3.65% 43.50% 960ms 3.65% runtime.pthread_cond_wait
950ms 3.61% 47.11% 950ms 3.61% runtime.memmove
650ms 2.47% 49.58% 650ms 2.47% runtime.usleep
650ms 2.47% 52.05% 2490ms 9.46% talent.TopN.func1
630ms 2.39% 54.45% 2890ms 10.98% runtime.mallocgc
很明显,runtime.pthread_cond_信号在我的代码中花费了太多时间。我试图通过谷歌搜索一些关于runtime.pthread_cond_信号的有用信息。但没能得到它们。虽然有些帖子提到了这一点,但它们只是提供了一些提示,让我仍然对此感到困惑
我猜这种情况与围棋中频道的使用有关,但我不确定我的观点,我也不知道一些细节
我想知道的是:
如果您能提供任何帮助,我将不胜感激。这可能意味着您的代码正在执行大量的锁定/解锁操作
pthread_cond_signal
用于通知条件变量,似乎只有Go-on-OSX才使用。它用于semawakup
的实现,它本身用于unlock
原语,该原语用于执行锁定/解锁的任何地方
如注释所示,请尝试使用go tool pprof
中的(web)
命令查看这些调用的来源
如果不查看您的具体基准,很难提供更多详细信息。From 1。您是否进行了大量的频道发送和接收?也许你正在做的工作量与你在Goroutine之间的工作量相比是相对较小的2。你产生了很多垃圾吗?我建议您使用GODEBUG=gctrace=1运行程序,并查看gc跟踪输出的频率,如果它是连续的,这可能表明您产生了太多垃圾。请在pprof控制台中尝试使用
web
命令: