是什么导致go在runtime.pthread_cond_信号中花费如此多的时间

是什么导致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%

我已经在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%     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_信号的有用信息。但没能得到它们。虽然有些帖子提到了这一点,但它们只是提供了一些提示,让我仍然对此感到困惑

我猜这种情况与围棋中频道的使用有关,但我不确定我的观点,我也不知道一些细节

我想知道的是:

  • 是什么导致go通常在runtime.pthread_cond_信号中花费这么多时间

  • 在正常情况下,当这种情况发生时,如何优化go代码

  • 请随时提供任何信息和建议。
    如果您能提供任何帮助,我将不胜感激。

    这可能意味着您的代码正在执行大量的锁定/解锁操作
    pthread_cond_signal
    用于通知条件变量,似乎只有Go-on-OSX才使用。它用于
    semawakup
    的实现,它本身用于
    unlock
    原语,该原语用于执行锁定/解锁的任何地方

    如注释所示,请尝试使用
    go tool pprof
    中的
    (web)
    命令查看这些调用的来源


    如果不查看您的具体基准,很难提供更多详细信息。

    From 1。您是否进行了大量的频道发送和接收?也许你正在做的工作量与你在Goroutine之间的工作量相比是相对较小的2。你产生了很多垃圾吗?我建议您使用GODEBUG=gctrace=1运行程序,并查看gc跟踪输出的频率,如果它是连续的,这可能表明您产生了太多垃圾。请在pprof控制台中尝试使用
    web
    命令: