#c #linux #multithreading #profiling #futex
#c #linux #многопоточность #профилирование #futex
Вопрос:
Я хочу профилировать операции синхронизации, такие как блокировка и разблокировка мьютексов, семафоров и т.д. в Linux.
Я знаю, что в глубине души они реализованы с использованием фьютексов, поэтому, возможно, достаточно профилировать блокировку и разблокировку фьютексов (пожалуйста, поправьте меня, если я здесь ошибаюсь). Итак, мой вопрос заключается в том, как его профилировать, поскольку операции futex обычно выполняются в пользовательском пространстве. Есть ли у них какой-либо инструмент, который позволяет мне профилировать это?
Мне в основном интересно знать функции, которые блокируют фьютексы и частоту.
Ответ №1:
Вас может заинтересовать valgrind и его инструмент callgrind.
valgrind --trace-children=yes --tool=callgrind -v ./program
Он сгенерирует подробный график вызовов в файл, среди прочего, с указанием времени, прошедшего в каждой функции.
Затем вы можете увидеть все это с помощью 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
Комментарии:
1. Так что valgrind снова приходит нам на помощь :)!