Я знаю, что есть инструмент для получения списка статистики программы. Но то, что я пытаюсь сделать, это прочитать счетчик производительности напрямую, без использования инструмента perf.
Если вы не хотите использовать инструмент perf
, вы можете попробовать использовать инструмент oprofile
или intel vtune или https://github.com/RRZE-HPC/likwid или https://github.com/opcm/pcm. Или вы можете использовать perf_event_open syscall , который работает как инструмент perf (вы можете изучать или изменять исходные тексты инструментов perf из https://mirrors.edge.kernel.org/pub/linux/kernel/tools/perf/ - и версия инструмента perf может не совпадать с версией ядра) .
Если вы хотите получить доступ к регистрам msr как root, используйте modprobe msr
(это стандартный модуль ядра , уже скомпилированный для вашего ядра в Ubuntu) и wrmsr
и rdmsr
tools ( msr-tools deb / ubuntu package, от intel ), как на слайде 27 из Мониторинг производительности Крис Данкен Intel SSG EMEA HPCT C презентация.
Я не понимаю, почему вы хотите работать со счетчиками производительности без инструмента Perf. Если вы хотите получать показания счетчика изнутри вашей программы, например, до и после некоторых циклов, вы можете напрямую использовать perf_event_open syscall (с указанием c ioctls). (Или попробуйте использовать perf stat
+ тот же ioctls PERF_EVENT_IOC_ * или попробуйте изучить интеграцию perf + JIT)
Или вы можете использовать существующий модуль ядра, который будет экспортировать доступ к регистру MSR root пользователю - msr.ko . И MSR инструменты - https://01.org/msr-tools. Или с этим msr + pm c пример https://technicalandstuff.wordpress.com/2015/05/15/using-intels-pcm-in-linux-and-inside-c/ + https://software.intel.com/en-us/articles/intel-performance-counter-monitor (https://github.com/opcm/pcm)
Есть также некоторые примеры использования счетчиков перфорации в https://github.com/RRZE-HPC/likwid.
Вы также можете использовать PAPI-библиотеку для доступа к счетчикам из вашего кода, она будет обрабатывать большую часть содержимого perf_event_open для вас , http://icl.cs.utk.edu/projects/papi/wiki/PAPITopics: Getting_Started
Первые вопросы: я скачал этот код https://github.com/softdevteam/user_rdpmc ... "insmod" .ko файл, система зависает ,
Рейтинг "Звезд" слишком низок, а код слишком стар (2016 г.), чтобы проводить какие-либо расследования на предмет зависания. Прямой доступ к PM C может создавать помехи для сторожевого таймера NMI (сделать echo 0 > /proc/sys/kernel/nmi_watchdog
как root) или другой сеанс perf
. Безопаснее использовать системный вызов perf_event_open.
Второй вопрос ... обнаружил, что файл core. c в каталоге linux -5.5.3 / arch / x86 / events / intel действительно выполняет настройку и чтение счетчиков производительности
Этот файл является частью реализации системного вызова perf_event_open (подсистема perf_events ядра, https://github.com/torvalds/linux/tree/master/kernel/events + https://github.com/torvalds/linux/tree/master/arch/x86/events).
Чтобы использовать этот код, вы можете использовать инструмент perf
или системный вызов perf_event_open.
Вы не должны компилировать подсистему perf_events ядра как отдельный модуль, поскольку он уже скомпилирован в ваше ядро ( intel / amd Speci c part может быть частично ko), а сама Подсистема не поддерживает компиляцию как модуль:
https://github.com/torvalds/linux/tree/master/kernel/events
Makefile: obj-y := core.o ring_buffer.o callchain.o
Как я могу заставить свое ядро Ubuntu использовать все файлы, связанные с ядром. c из kernel.org и собрать файл .ko?
В вашем ядре Ubuntu уже скомпилированы все файлы подсистемы perf_events, некоторые из них связаны с образом ядра, а другие уже являются файлами .ko, такими как intel-rapl-perf.ko
$ grep _PERF_ /boot/config-`uname -r`
$ ls -l /lib/modules/`uname -r`/kernel/arch/x86/events/intel