Профилирование операций синхронизации в Linux

#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 снова приходит нам на помощь :)!