Как я могу прочитать счетчики производительности из ядра?

Я использую инструмент 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.

Другие вопросы по тегам