Как читать PM C (счетчик мониторинга производительности) процессора Intel x86 - PullRequest
2 голосов
/ 28 марта 2020

Мой рабочий стол - процессор Intel x86_64 с операционной системой Ubuntu.

Я знаю, что существует инструмент perf для получения списка статистики программы. Но я пытаюсь прочитать счетчик производительности напрямую, без использования инструмента perf.

  1. Первый вопрос

Первые вопросы: я скачал этот код с Github: Справочник кодов Github .

Он успешно скомпилирован с ядром linux -headers-5.3.0-40-generi c без ошибок. Как только я использую «insmod» файл .ko, система зависает. Файл .ko не вставляется, когда я проверяю dmesg, поэтому я должен прекратить его после выполнения «insmod» файла .ko. Произошло ли это из-за попытки несанкционированного доступа? Если есть предложения, которые я могу попробовать, я рад это услышать.

Соответствующий код ниже.

static void set_pce(void *arg)
{
    int to_val = (arg != 0);
    u_int64_t cr4_val;

    cr4_val = __read_cr4();
    if (to_val) {
        cr4_val |= X86_CR4_PCE;
    } else {
        cr4_val &= ~X86_CR4_PCE;
    }

    __write_cr4(cr4_val);
}

static int __init user_rdpmc_init(void){
    int cpu;

    num_cpus = num_online_cpus();

    printk(KERN_INFO "Enabling RDPMC from ring 3 for %d CPUs\n", num_cpus);
    for (cpu = 0; cpu < num_cpus; cpu++) {
    smp_call_function_single(cpu, set_pce, (void *) 1, 1);
    }

   return 0;
}
Второй вопрос

Второй вопрос: я использую linux -headers-5.3.0-40-generi c версию ядра на своем рабочем столе Ubuntu. Я загрузил код ядра версии 5.5.3 с сайта kernel.org. Я тщательно следовал перф-коду, указанному в коде ядра 5.5.3, и обнаружил, что файл core. c в каталоге linux -5.5.3 / arch / x86 / events / intel действительно устанавливает и читает счетчики производительности. Я использовал содержимое файла core. c, чтобы сделать его модулем для считывания счетчика производительности. Когда я его компилирую, он создает кучу ошибок, потому что я использую linux -headers-5.3.0-40-generi c для сборки модуля, но мое ядро ​​Ubuntu не имеет всех заголовочных файлов, связанных с ядром. c файл из кода ядра из kernel.org.

Как я могу заставить мое ядро ​​Ubuntu использовать все файлы, связанные с ядром. c из kernel.org и создать файл .ko?

Или есть какой-нибудь исходный код модуля, который считывает счетчик производительности x86, и который я могу использовать в качестве справки?

Заранее благодарю за помощь.

1 Ответ

2 голосов
/ 31 марта 2020

Я знаю, что есть инструмент для получения списка статистики программы. Но то, что я пытаюсь сделать, это прочитать счетчик производительности напрямую, без использования инструмента 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
...