Как я могу прочитать счетчики производительности из ядра?
Я использую инструмент Linux perf в пользовательском пространстве. Я хочу написать код, который читает счетчики производительности для потока каждый раз, когда он выполняет переключение контекста.
Необходимые шаги:
1) Получить механизм для чтения регистров счетчика производительности.
2) Вызывать шаг (1) из планировщика после каждого переключения контекста.
Я застрял на шаге (1), так как не мог понять, какие функции вызывать для чтения регистров производительности и как описать событие при этом. Я попытался просмотреть документы, а также этот вопрос. Как использовать счетчики производительности внутри ядра?,
1 ответ
Вы можете сделать это полностью с perf
с помощью событий трассировки и выборки лидера группы.
sched:sched_switch
событие трассировки при каждом переключении контекста Помещение этого события вместе с другими событиями в группу с включенной выборкой лидера группы позволит вам считать счетчики не лидера всякий раз, когда происходит выборка лидера. Синтаксис выглядит так:
perf record -e "{sched:sched_switch,cycles,instructions}:S" -a
Это будет записывать cycles
ценности и instructions
на каждом процессоре, когда есть переключение контекста. Вы можете проверить вывод с perf script
, что также позволяет читать его с помощью программ на Python.
Если вы хотите контролировать в своей собственной программе, вы можете использовать perf_event_open
с PERF_FORMAT_GROUP
а также PERF_SAMPLE_READ
,
perf
инструменты и это лежит в основе perf_event_open
интерфейс очень мощный, но иногда может отсутствовать документация. Если вам нужна еще большая гибкость, вы можете использовать BPF и bcc.