Как профилировать 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 секунд активности) и в некоторых исключительных условиях запускайте остановку в самолете. Приходите на следующее утро и анализируйте данные.
Я использую и вижу "мьютексы" как множественное число мьютексов уже много лет без жалоб.; >
Ответ 3
Возможно, вы захотите также попробовать Intel VTune. Он будет сообщать Wait Time и Wait Count для каждого примитива синхронизации с вызовами. Просмотрите этот документ, чтобы убедиться, что это то, что вы ищете http://software.intel.com/sites/products/documentation/hpc/amplifierxe/en-us/2011Update/lin/start/analyzing_locks_linux.pdf
Ответ 4
Я нашел 'mutrace' во время изучения для одного и того же варианта использования.
Однако я не использовал его. Это звучало хорошо, как было бы
не влияют на время выполнения, как в valgrind.
Ответ 5
Его были 6+ лет, но для справки я хотел бы добавить еще одну ссылку для отслеживания времени вне процессора, которое должно было показать ваше соперничество в мьютексе. http://www.brendangregg.com/offcpuanalysis.html