Как профилировать 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 для такого рода профилирования. Это может быть полезно в двух режимах:
профилирование производительности - например, профилируйте вашу систему в течение N секунд стандартного использования, а затем анализируйте данные
профилирование исключений - например, запустить его круглосуточно в режиме "регистратор полетов" (записать последние 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