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

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

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

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

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

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

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

Ответы

Ответ 1

Инструмент 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.

Ответ 2

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

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

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

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

Ответ 4

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

Ответ 5

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