2015-01-21 2 views
2

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

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

Спасибо!

+0

Эти профиляторы в другом вопросе не используют C++. Это инструменты, такие как Valgrind, которые имеют существенные накладные расходы. – masab

+0

Вы можете попробовать изменить флаг наследования в easyperf (http://stackoverflow.com/a/28871708 и man perf_event_open) и запустить его в каждом pthread в начале потока. – osgx

ответ

3

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

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

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

    ps -eLf | grep [application name]

  3. открытого отдельный терминал и запустить перфорация, как 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 
    

есть analysis article о perf, вы можете получить представление об этом.

+0

Я создаю pthreads внутри основной функции. Однако ps -eLf | grep [имя приложения] дает мне этот результат (показывает только 1 нить): 18428 17539 18428 0 1 01:31 pts/0 00:00:00 grep a.out следовательно, поток также ограничен 0 в этом дело. Я думаю, что эта команда дает идентификатор процесса вместо идентификатора потока – masab

+0

, который показывает, что ваша программа завершена. Программа показала, что есть grep, это не ваша программа. Ваша программа работает как демон? – qqibrow

+0

мой исполняемый файл is.out, поэтому я запустил ps -eLf | ./a.out, и он просто дал мне выход программы – masab

1

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

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

+0

Я думаю, что режим «поток» означает, что можно контролировать только один поток, который является обозначенной нитью. Каждый процесс отслеживает процесс и дает среднюю статистику. – masab

+0

@masab yep. и каковы ваши требования? – qqibrow

+0

@qqibrow Если у меня есть 2 потока, работающих одновременно на 2 ядрах, то я хотел бы знать, сколько команд было выполнено на этих двух ядрах (что дает мне 2 подсчета команд). Я хочу, чтобы команда подсчитывала для каждого потока, потому что я хочу позаботиться о балансировке нагрузки между потоками. – masab

1

Вы можете использовать стандартный инструмент для доступа к perf_event - perf (из 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 
+0

PPS: вы можете попытаться запустить easyperf несколько раз: создать новый поток, а затем включить подсчет для этого потока (вызвать perf_init либо в новом потоке, либо в основном потоке с типом нового потока) ... Существует mna для perf_event_open http : //man7.org/linux/man-pages/man2/perf_event_open.2.html, но я не понимаю, как установить флаг «inherit» для вызова, может быть полезно взломать easyperf и изменить значение этого flag ... – osgx

+0

PS: Как я понимаю, 'perf stat' с точными значениями счетчиков не может разделять значения между потоками (https://perf.wiki.kernel.org/index.php/Tutorial#Counting_with_perf_stat" * By default, perf stat count для всех потоков процесса и последующих дочерних процессов и потоков. Это может быть изменено с помощью опции -i. Невозможно получить разбиение счетчика на поток или на процесс. * "). Он имеет только «-первое ядро» для общесистемного мониторинга «-a»; или мониторинга одиночного процесса '-p pid' или одного потока' -t tid' – osgx

+0

masab, вы должны знать, что вы не можете установить -c на очень низкие номера (менее нескольких миллионов для частых событий, таких как циклы или инструкции или бит меньше для редких событий, таких как промах L3) или -F до очень высоких (более нескольких тысяч); иначе perf ограничит частоту сообщением в 'dmesg'. – osgx