Профилирование операций синхронизации в Linux - PullRequest
3 голосов
/ 30 сентября 2011

Я хочу профилировать операции синхронизации, такие как блокировка и разблокировка мьютексов, семафоров и т. Д. В Linux.

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

Мне в основном интересно знать функции, которые блокируют фьютексы и частоту.

1 Ответ

2 голосов
/ 30 сентября 2011

Вас может заинтересовать valgrind, и это инструмент callgrind.

valgrind --trace-children=yes --tool=callgrind -v ./program

Он генерирует детализированный callgraph-файл в файл, включая, помимо прочего, количество времени, прошедшего в каждой функции.

Затем вы можете увидеть все это с помощью kcachegrind, который является хорошим интерфейсом для визуализации данных.

kcachegrind

Это позволит вам увидеть все функции, которые вызвали pthread_mutex_lock () (или другие), и среди них самые высокие по проценту времени ...

Наиболее важной частью callgrind является то, что вы легко можете найти узкое место в однопоточной программе, потому что вам просто нужно посмотреть функцию, которая заняла больше всего времени процессора.

В многопоточной программе функция, ожидающая чего-то долгое время (мьютекс), является нормальным условием, поэтому она сложнее.

Вы также можете использовать инструмент Helgrind от valgrind, который поможет найти ошибки при использовании мьютексов (потенциальные тупики или потенциальные скачки данных).

Я полагаю , что он анализирует ваши вызовы функций синхронизации и данные, которые вы читаете / записываете, чтобы обнаружить потенциальную проблему (проблему, которая может возникнуть 1 раз за 1000000), анализируя сериализуемость соответствие вашей синхронизации и доступа к данным. (Повторяю: наверное).

valgrind --tool=helgrind --suppressions=$PWD/supp --gen-suppressions=yes --db-attach=yes --track-lockorders=no ./program

И основная особенность valgrind: проверка утечки памяти:

valgrind --leak-check=yes -v --db-attach=yes ./program
...