Мониторинг производительности Linux, какой-нибудь способ контролировать поток?

Я использую Linux Ubuntu и программирую на C ++. Мне удалось получить доступ к счетчикам производительности (счетчикам команд, отсутствию кэша и т. Д.) С помощью perf_event (фактически используя программы по этой ссылке: https://github.com/castl/easyperf).

Однако теперь я запускаю многопоточное приложение с использованием pthreads и нуждаюсь в подсчете команд и циклах до завершения каждого потока в отдельности. Есть идеи, как это сделать?

Спасибо!

2

Решение

perf — это инструмент для профилирования системы, который вы можете использовать. это не так https://github.com/castl/easyperf), которая является библиотекой, и вы используете ее в своем коде. Следуйте инструкциям и используйте его для профилирования вашей программы:

  1. устанавливать perf на Ubuntu. Установка может отличаться в разных дистрибутивах Linux. Вы можете ознакомиться с учебной линией по установке.

  2. Просто запустите вашу программу и получите весь идентификатор вашей программы:

    ps -eLf | grep [application name]

  3. откройте отдельный терминал и запустите perf как perf stat -t [threadid] согласно странице руководства:

    usage: perf stat [<options>] [<command>]

    -e, --event <event>   event selector. use 'perf list' to list available events
    -i, --no-inherit      child tasks do not inherit counters
    -p, --pid <n>         stat events on existing process id
    -t, --tid <n>         stat events on existing thread id
    -a, --all-cpus        system-wide collection from all CPUs
    -c, --scale           scale/normalize counters
    -v, --verbose         be more verbose (show counter open errors, etc)
    -r, --repeat <n>      repeat command and print average + stddev (max: 100)
    -n, --null            null run - dont start any counters
    -B, --big-num         print large numbers with thousands' separators
    

есть аналитическая статья около perfВы можете почувствовать об этом.

3

Другие решения

Пожалуйста, посмотрите на perf документация по инструменту Вот, он поддерживает некоторые события (например, оба instructions а также cache-misses), что вы ищете в профиль. Выдержка из вики-страницы, ссылки на которую приведены выше:

Инструмент perf может быть использован для подсчета событий для каждого потока, процесса, процессора или всей системы. В режиме для каждого потока счетчик контролирует только выполнение указанного потока. Когда поток запланирован вне, мониторинг останавливается. Когда поток мигрирует с одного процессора на другой, счетчики сохраняются на текущем процессоре и восстанавливаются на новом.

1

Вы можете использовать стандартный инструмент для доступа perf_eventperf (из linux-tools). Он может работать со всеми потоками вашей программы и сообщать сводный профиль и профиль для потока (per-pid / per-tid).

Этот профиль не является точным аппаратным счетчиком, а скорее результатом выборки каждые N событий, причем N настроен на частоту около 99 Гц (раз в секунду). Вы также можете попробовать -c 2000000 возможность получить образец каждые 2 миллиона аппаратного события. Например, цикл событий (полный список — perf list или попробуйте некоторые из перечисленных в perf stat ./program)

perf record -e cycles -F 99 ./program
perf record -e cycles -c 2000000 ./program

Резюме по всем темам. -n покажет вам общее количество образцов

perf report -n

Per pid (на самом деле здесь используются приливы, так что это позволит вам выбрать любой поток).

В текстовом варианте будут перечислены все темы, записанные с итоговым отсчетом выборок (с -c 2000000 Вы можете умножить количество выборок на 2 миллиона, чтобы оценить количество событий hw для потока)

perf report -n -s pid | cat

Или ncurses-подобный интерактивный вариант, где вы можете выбрать любой поток и посмотреть его собственный профиль:

perf report -n -s pid
1
По вопросам рекламы [email protected]