Как профилировать pthread mutex в Linux?

Я хотел бы знать, как профилировать мьютекс pthread, чтобы увидеть, есть ли в моем коде конфликтные точки блокировки. (кому нравится спорный код, верно?:) Я знаю, как сделать более общее профилирование кода, как я упоминаю здесь. Но я хотел бы знать, есть ли какие-либо инструменты или опции, доступные для профилирования блокировки мьютекса, которая предоставила бы метрики / статистику о ментальных блокировках, чтобы увидеть, есть ли у меня какие-либо проблемные области.

Вот некоторый фон и контекст:

Недавно я работал над проектом C++ с использованием процессора Cavium Octeon. В Octeon SDK реализована синхронизация в стиле мьютекса с использованием спин-блокировки. Просматривая документацию по Octeon, я наткнулся на способ профилирования спин-блокировок, чтобы увидеть, сколько раз каждый спин-блокировка должна была вращаться, ожидая, пока блокировка станет доступной. Чтобы использовать это, я должен был сделать условную компиляцию, а затем он будет увеличивать счетчик каждый раз, когда вращается спин-блокировка, тогда я мог запросить значение ожидания счетчика. Итак, я сделал инкапсуляцию спин-блокировки и добавил возможность сбрасывать значение ожидания спин-блокировки для всех спин-блокировок, используемых в системе. Фактическое значение не имело большого значения, но было несколько, которые имели действительно высокие значения по сравнению с остальными, и я сосредоточился на том, чтобы уменьшить разногласия для них.

Я знаю, что это, вероятно, довольно просто для спин-блокировок, поскольку это просто счетчик на одно вращение, но, читая соответствующие страницы руководства pthread и заголовочные файлы, я не нашел ничего похожего, есть ли что-то доступное для мьютекса pthread?

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

PS: что такое множественное число мьютекса? мьютексы, muteces, mutexi, muti??? Мьютексы никогда не звучали прямо для меня.

4 ответа

Решение

valgrind Инструмент drd позволяет указать ограничение времени ожидания блокировки до сообщения об ошибке.

Этот сайт упоминает drd а также упоминает их собственный инструмент под названием mutrace который выглядит как инструмент, который вы ищете. Это говорит вам:

  • сколько раз мьютекс был заблокирован
  • сколько раз менялся поток, владеющий мьютексом
  • сколько раз мьютекс был оспорен (уже заблокирован, когда был сделан запрос на блокировку)
  • различные статистические данные о продолжительности блокировки мьютекса

например

mutrace: 10 most contended mutexes:

 Mutex #   Locked  Changed    Cont. tot.Time[ms] avg.Time[ms] max.Time[ms]       Type
      35   368268      407      275      120,822        0,000        0,894     normal
       5   234645      100       21       86,855        0,000        0,494     normal
      26   177324       47        4       98,610        0,001        0,150     normal
      19    55758       53        2       23,931        0,000        0,092     normal
      53      106       73        1        0,769        0,007        0,160     normal
      25    15156       70        1        6,633        0,000        0,019     normal
       4      973       10        1        4,376        0,004        0,174     normal
      75       68       62        0        0,038        0,001        0,004     normal
       9     1663       52        0        1,068        0,001        0,412     normal
       3   136553       41        0       61,408        0,000        0,281     normal
     ...      ...      ...      ...          ...          ...          ...        ...

mutrace: Total runtime 9678,142 ms.

Вы не упомянули свою ОС. Если это Linux, я довольно часто использовал LTT для такого рода профилирования. Это может быть полезно в двух режимах:

  1. профилирование производительности - например, профилируйте вашу систему в течение N секунд стандартного использования, а затем анализируйте данные

  2. профилирование исключений - например, запустить его круглосуточно в режиме "регистратор полетов" (записать последние N секунд активности) и при некоторых исключительных условиях вызвать остановку регистратора полетов. Приходите на следующее утро и анализируйте данные.

Я использую и вижу "мьютексы" как множественное число мьютексов уже много лет без жалоб.;>

Вы также можете попробовать Intel VTune. Он также будет сообщать время ожидания и количество ожидания для каждого примитива синхронизации со стеками вызовов. Просмотрите этот документ, чтобы убедиться, что это то, что вы ищете http://software.intel.com/sites/products/documentation/hpc/amplifierxe/en-us/2011Update/lin/start/analyzing_locks_linux.pdf

Я нашел 'mutrace', исследуя тот же вариант использования. Я еще не использовал это все же. Это звучало хорошо, так как не сильно повлияло бы на время выполнения, как в valgrind.

Прошло уже 6 с лишним лет, но для справки я хотел бы добавить еще одну ссылку для отслеживания времени вне процессора, которая должна была показать ваш мьютексный конфликт. http://www.brendangregg.com/offcpuanalysis.html

Другие вопросы по тегам