Какое ограничение на самом деле perf_event_paranoid == 1 накладывает на x86 perf?
Более новые ядра Linux имеют настраиваемый sysfs /proc/sys/kernel/perf_event_paranoid
который позволяет пользователю настроить доступную функциональность perf_events
для пользователей без полномочий root: более высокие номера более безопасны (предлагая соответственно меньше функций):
Из документации ядра мы имеем следующее поведение для различных значений:
perf_event_paranoid:
Контролирует использование системы событий производительности непривилегированными пользователями (без CAP_SYS_ADMIN). Значением по умолчанию является 2.
-1: разрешить использование (почти) всех событий всеми пользователями Игнорировать ограничение mlock после perf_event_mlock_kb без CAP_IPC_LOCK
> = 0: Запретить точку трассировки функции ftrace пользователями без CAP_SYS_ADMIN Запретить доступ к необработанной точке трассировки пользователями без CAP_SYS_ADMIN
> = 1: запретить доступ к событиям процессора пользователям без CAP_SYS_ADMIN
> = 2: Запретить профилирование ядра пользователями без CAP_SYS_ADMIN
я имею 1
в моем perf_event_paranoid
файл, который должен "Запретить доступ к событию ЦП" - но что это означает?
Простое чтение не предполагает доступа к событиям счетчика производительности процессора (таким как события Intel PMU), но, похоже, я могу получить к ним доступ просто отлично. Например:
$ perf stat sleep 1
Performance counter stats for 'sleep 1':
0.408734 task-clock (msec) # 0.000 CPUs utilized
1 context-switches # 0.002 M/sec
0 cpu-migrations # 0.000 K/sec
57 page-faults # 0.139 M/sec
1,050,362 cycles # 2.570 GHz
769,135 instructions # 0.73 insn per cycle
152,661 branches # 373.497 M/sec
6,942 branch-misses # 4.55% of all branches
1.000830821 seconds time elapsed
Здесь многие события являются событиями CPU PMU (cycles
, instructions
, branches
, branch-misses
, cache-misses
).
Если это не события CPU, на которые они ссылаются, каковы они?
1 ответ
В этом случае событие ЦП относится к мониторингу событий на ЦП, а не на задачу. За perf
инструменты это ограничивает использование
-C, --cpu=
Count only on the list of CPUs provided. Multiple CPUs can be provided as a comma-separated list with no space: 0,1.
Ranges of CPUs are specified with -: 0-2. In per-thread mode, this option is ignored. The -a option is still necessary
to activate system-wide monitoring. Default is to count on all CPUs.
-a, --all-cpus
system-wide collection from all CPUs (default if no target is specified)
За perf_event_open
это учитывает следующий случай:
pid == -1 and cpu >= 0
This measures all processes/threads on the specified CPU. This requires CAP_SYS_ADMIN capability or a /proc/sys/ker‐
nel/perf_event_paranoid value of less than 1.
Это может быть конкретной версией, цитируемая документация от 4.17. Это еще один связанный с этим вопрос.