что заставило бы пойти потратить так много времени в runtime.pthread_cond_signal - PullRequest
0 голосов
/ 28 апреля 2019

Я написал тест для тестирования многогрутинов в го. И я использую инструмент go 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_signal тратит так много времени на мой код. Я пытаюсь найти в Google полезную информацию о runtime.pthread_cond_signal. Но не удалось их получить. Хотя в некоторых постах упоминается об этом, они просто дают несколько советов, и я все еще не могу понять, что с ними делать.

Я полагаю, что эта ситуация относительно использования канала в Go, но я не уверен в своем мнении, и я также не знаю некоторых подробностей об этом.

Я хочу знать следующее:

  1. Что заставило бы идти тратить так много времени в runtime.pthread_cond_signal обычно?

  2. В нормальных условиях , как оптимизировать ваш код go в такой ситуации happens

Не стесняйтесь предоставлять любую информацию и советы. Буду признателен за любую помощь от вас.

1 Ответ

0 голосов
/ 30 апреля 2019

Это, вероятно, означает, что ваш код выполняет много блокировок / разблокировок.pthread_cond_signal используется для уведомления условных переменных и, похоже, используется только в Go на OSX.Он используется в реализации semawakeup, который сам используется в примитиве unlock, который используется везде, где выполняется блокировка / разблокировка.

Как указано в комментариях, попробуйте команду (web) в go tool pprof чтобы увидеть, откуда поступают эти звонки.

Трудно предоставить более подробную информацию, не видя вашего конкретного теста.

...